diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e677d7b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,51 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + ci: + runs-on: ubuntu-latest + steps: + - name: Install ZKSync Foundry + uses: dutterbutter/foundry-zksync-toolchain@v1 + + - name: Check out the repo + uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install Dependencies + run: pnpm install + + - name: Build Hardhat + run: pnpm compile + + - name: Forge Build + run: pnpm compile:forge + + - name: Forge Fmt + run: pnpm style:solidity + + - name: Test Hardhat + run: pnpm test:hardhat + + - name: Forge Test + run: pnpm test:forge + + + diff --git a/.gitignore b/.gitignore index 8a4ebc1..8abfe27 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,12 @@ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json #foundry cache out +cache_forge +zkout + +cache_hardhat-zk +artifacts-zk +cache-zk *.zip .last_confs diff --git a/.gitmodules b/.gitmodules index d684ef4..4e8c040 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "lib/forge-std"] - path = lib/forge-std - url = https://github.com/foundry-rs/forge-std [submodule "lib/openzeppelin-contracts"] path = lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts @@ -8,3 +5,6 @@ [submodule "lib/solmate"] path = lib/solmate url = https://github.com/rari-capital/solmate +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/src/Rewards/StakingContractMainnet.sol b/contracts/Rewards/StakingContractMainnet.sol similarity index 77% rename from src/Rewards/StakingContractMainnet.sol rename to contracts/Rewards/StakingContractMainnet.sol index 4948a99..786bac0 100644 --- a/src/Rewards/StakingContractMainnet.sol +++ b/contracts/Rewards/StakingContractMainnet.sol @@ -20,6 +20,7 @@ contract StakingContractMainnet is ReentrancyGuard { address token; // 2nd slot address rewardToken; // 3rd slot uint32 endTime; // 3rd slot + bool isRewardRounded; // 3rd slot uint256 rewardPerLiquidity; // 4th slot uint32 lastRewardTime; // 5th slot uint112 rewardRemaining; // 5th slot @@ -65,7 +66,8 @@ contract StakingContractMainnet is ReentrancyGuard { uint256 id, uint256 amount, uint256 startTime, - uint256 endTime + uint256 endTime, + bool isRewardRounded ); event IncentiveUpdated(uint256 indexed id, int256 changeAmount, uint256 newStartTime, uint256 newEndTime); event Stake(address indexed token, address indexed user, uint256 amount); @@ -74,11 +76,14 @@ contract StakingContractMainnet is ReentrancyGuard { event Unsubscribe(uint256 indexed id, address indexed user); event Claim(uint256 indexed id, address indexed user, uint256 amount); - function createIncentive(address token, address rewardToken, uint112 rewardAmount, uint32 startTime, uint32 endTime) - external - nonReentrant - returns (uint256 incentiveId) - { + function createIncentive( + address token, + address rewardToken, + uint112 rewardAmount, + uint32 startTime, + uint32 endTime, + bool isRewardRounded + ) external nonReentrant returns (uint256 incentiveId) { if (rewardAmount <= 0) revert InvalidInput(); if (startTime < block.timestamp) startTime = uint32(block.timestamp); @@ -99,13 +104,16 @@ contract StakingContractMainnet is ReentrancyGuard { rewardToken: rewardToken, lastRewardTime: startTime, endTime: endTime, + isRewardRounded: isRewardRounded, rewardRemaining: rewardAmount, liquidityStaked: 0, // Initial value of rewardPerLiquidity can be arbitrarily set to a non-zero value. rewardPerLiquidity: type(uint256).max / 2 }); - emit IncentiveCreated(token, rewardToken, msg.sender, incentiveId, rewardAmount, startTime, endTime); + emit IncentiveCreated( + token, rewardToken, msg.sender, incentiveId, rewardAmount, startTime, endTime, isRewardRounded + ); } function updateIncentive(uint256 incentiveId, int112 changeAmount, uint32 newStartTime, uint32 newEndTime) @@ -119,18 +127,24 @@ contract StakingContractMainnet is ReentrancyGuard { _accrueRewards(incentive); if (newStartTime != 0) { - if (newStartTime < block.timestamp) newStartTime = uint32(block.timestamp); + if (newStartTime < block.timestamp) { + newStartTime = uint32(block.timestamp); + } incentive.lastRewardTime = newStartTime; } if (newEndTime != 0) { - if (newEndTime < block.timestamp) newEndTime = uint32(block.timestamp); + if (newEndTime < block.timestamp) { + newEndTime = uint32(block.timestamp); + } incentive.endTime = newEndTime; } - if (incentive.lastRewardTime >= incentive.endTime) revert InvalidTimeFrame(); + if (incentive.lastRewardTime >= incentive.endTime) { + revert InvalidTimeFrame(); + } if (changeAmount > 0) { incentive.rewardRemaining += uint112(changeAmount); @@ -139,7 +153,9 @@ contract StakingContractMainnet is ReentrancyGuard { } else if (changeAmount < 0) { uint112 transferOut = uint112(-changeAmount); - if (transferOut > incentive.rewardRemaining) transferOut = incentive.rewardRemaining; + if (transferOut > incentive.rewardRemaining) { + transferOut = incentive.rewardRemaining; + } unchecked { incentive.rewardRemaining -= transferOut; @@ -229,14 +245,28 @@ contract StakingContractMainnet is ReentrancyGuard { emit Unstake(token, msg.sender, amount); } + function subscribeToIncentives(uint256[] memory incentiveIds) external { + uint256 n = incentiveIds.length; + + for (uint256 i = 0; i < n; i = _increment(i)) { + subscribeToIncentive(incentiveIds[i]); + } + } + function subscribeToIncentive(uint256 incentiveId) public nonReentrant { - if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput(); + if (incentiveId > incentiveCount || incentiveId <= 0) { + revert InvalidInput(); + } - if (rewardPerLiquidityLast[msg.sender][incentiveId] != 0) revert AlreadySubscribed(); + if (rewardPerLiquidityLast[msg.sender][incentiveId] != 0) { + revert AlreadySubscribed(); + } Incentive storage incentive = incentives[incentiveId]; - if (userStakes[msg.sender][incentive.token].liquidity <= 0) revert NotStaked(); + if (userStakes[msg.sender][incentive.token].liquidity <= 0) { + revert NotStaked(); + } _accrueRewards(incentive); @@ -262,14 +292,18 @@ contract StakingContractMainnet is ReentrancyGuard { uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(incentiveIndex); - if (rewardPerLiquidityLast[msg.sender][incentiveId] == 0) revert AlreadyUnsubscribed(); + if (rewardPerLiquidityLast[msg.sender][incentiveId] == 0) { + revert AlreadyUnsubscribed(); + } Incentive storage incentive = incentives[incentiveId]; _accrueRewards(incentive); /// In case there is a token specific issue we can ignore rewards. - if (!ignoreRewards) _claimReward(incentive, incentiveId, userStake.liquidity); + if (!ignoreRewards) { + _claimReward(incentive, incentiveId, userStake.liquidity); + } rewardPerLiquidityLast[msg.sender][incentiveId] = 0; @@ -281,7 +315,9 @@ contract StakingContractMainnet is ReentrancyGuard { } function accrueRewards(uint256 incentiveId) external nonReentrant { - if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput(); + if (incentiveId > incentiveCount || incentiveId <= 0) { + revert InvalidInput(); + } _accrueRewards(incentives[incentiveId]); } @@ -292,7 +328,9 @@ contract StakingContractMainnet is ReentrancyGuard { rewards = new uint256[](n); for (uint256 i = 0; i < n; i = _increment(i)) { - if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) revert InvalidInput(); + if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) { + revert InvalidInput(); + } Incentive storage incentive = incentives[incentiveIds[i]]; @@ -302,6 +340,26 @@ contract StakingContractMainnet is ReentrancyGuard { } } + /// @dev Claims rewards for all incentives in the list, skipping reward rounding. + function claimAllRewards(uint256[] calldata incentiveIds) + external + nonReentrant + returns (uint256[] memory rewards) + { + uint256 n = incentiveIds.length; + rewards = new uint256[](n); + for (uint256 i = 0; i < n; i = _increment(i)) { + if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) { + revert InvalidInput(); + } + + Incentive storage incentive = incentives[incentiveIds[i]]; + _accrueRewards(incentive); + rewards[i] = + _claimReward(incentive, incentiveIds[i], userStakes[msg.sender][incentive.token].liquidity, true); + } + } + function _accrueRewards(Incentive storage incentive) internal { uint256 lastRewardTime = incentive.lastRewardTime; @@ -315,10 +373,10 @@ contract StakingContractMainnet is ReentrancyGuard { uint256 passedTime = maxTime - lastRewardTime; - uint256 reward = uint256(incentive.rewardRemaining) * passedTime / totalTime; + uint256 reward = (uint256(incentive.rewardRemaining) * passedTime) / totalTime; // Increments of less than type(uint224).max - overflow is unrealistic. - incentive.rewardPerLiquidity += reward * type(uint112).max / incentive.liquidityStaked; + incentive.rewardPerLiquidity += (reward * type(uint112).max) / incentive.liquidityStaked; incentive.rewardRemaining -= uint112(reward); @@ -332,13 +390,31 @@ contract StakingContractMainnet is ReentrancyGuard { function _claimReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity) internal returns (uint256 reward) + { + return _claimReward(incentive, incentiveId, usersLiquidity, false); + } + + function _claimReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity, bool skipRounding) + internal + returns (uint256 reward) { reward = _calculateReward(incentive, incentiveId, usersLiquidity); - rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity; + uint256 rewardDelta; + // Check if the reward should be rounded + if (!skipRounding && incentive.isRewardRounded) { + uint8 decimals = ERC20(incentive.rewardToken).decimals(); + uint256 roundedReward = (reward / 10 ** decimals) * 10 ** decimals; + // Delta of rewards to be left claimable for the user in the future + rewardDelta = reward - roundedReward; + reward = roundedReward; + } - ERC20(incentive.rewardToken).safeTransfer(msg.sender, reward); + // Calculate the reward per liquidity delta based on actual rewards given + uint256 rewardPerLiquidityDelta = (rewardDelta * type(uint112).max) / usersLiquidity; + rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity - rewardPerLiquidityDelta; + ERC20(incentive.rewardToken).safeTransfer(msg.sender, reward); emit Claim(incentiveId, msg.sender, reward); } @@ -349,7 +425,7 @@ contract StakingContractMainnet is ReentrancyGuard { { reward = _calculateReward(incentive, incentiveId, usersLiquidity); - uint256 rewardPerLiquidityDelta = reward * type(uint112).max / newLiquidity; + uint256 rewardPerLiquidityDelta = (reward * type(uint112).max) / newLiquidity; rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity - rewardPerLiquidityDelta; } diff --git a/src/Rewards/libraries/FullMath.sol b/contracts/Rewards/libraries/FullMath.sol similarity index 100% rename from src/Rewards/libraries/FullMath.sol rename to contracts/Rewards/libraries/FullMath.sol diff --git a/src/Rewards/libraries/PackedUint144.sol b/contracts/Rewards/libraries/PackedUint144.sol similarity index 100% rename from src/Rewards/libraries/PackedUint144.sol rename to contracts/Rewards/libraries/PackedUint144.sol diff --git a/src/Rewards/test/Console.sol b/contracts/Rewards/test/Console.sol similarity index 100% rename from src/Rewards/test/Console.sol rename to contracts/Rewards/test/Console.sol diff --git a/src/Rewards/test/PackedUint144.t.sol b/contracts/Rewards/test/PackedUint144.t.sol similarity index 97% rename from src/Rewards/test/PackedUint144.t.sol rename to contracts/Rewards/test/PackedUint144.t.sol index 1430f9f..42f13d8 100644 --- a/src/Rewards/test/PackedUint144.t.sol +++ b/contracts/Rewards/test/PackedUint144.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.11; +pragma solidity 0.8.20; -import "ds-test/test.sol"; +import {Test} from "forge-std/Test.sol"; import "../libraries/PackedUint144.sol"; -contract PackedUintTest is DSTest { +contract PackedUintTest is Test { using PackedUint144 for uint144; function testCountStoredUint24Values(uint24 a) public { diff --git a/src/Rewards/test/StakingContractMainnet.t.sol b/contracts/Rewards/test/StakingContractMainnet.t.sol similarity index 84% rename from src/Rewards/test/StakingContractMainnet.t.sol rename to contracts/Rewards/test/StakingContractMainnet.t.sol index cc36506..61b68c5 100644 --- a/src/Rewards/test/StakingContractMainnet.t.sol +++ b/contracts/Rewards/test/StakingContractMainnet.t.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.11; +pragma solidity 0.8.20; import "./TestSetup.sol"; contract CreateIncentiveTest is TestSetup { function testCreateIncentive(uint112 amount, uint32 startTime, uint32 endTime) public { - _createIncentive(address(tokenA), address(tokenB), amount, startTime, endTime); + _createIncentive(address(tokenA), address(tokenB), amount, startTime, endTime, false); } function testFailCreateIncentiveInvalidRewardToken(uint32 startTime, uint32 endTime) public { - _createIncentive(address(tokenA), zeroAddress, 1, startTime, endTime); + _createIncentive(address(tokenA), zeroAddress, 1, startTime, endTime, false); } function testUpdateIncentive( @@ -147,6 +147,45 @@ contract CreateIncentiveTest is TestSetup { assertEqInexact(reward0 + reward1 + soloReward, totalReward, 10); } + function testClaimRoundedRewards() public { + uint112 amount = testIncentiveAmount; + uint256 duration = testIncentiveDuration; + uint256 incentiveId = _createIncentive( + address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration), true + ); + uint256[] memory incentiveIds = new uint256[](1); + incentiveIds[0] = incentiveId; + StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId); + + // 2 users stake and subscribe + _stake(address(tokenA), 1, johnDoe, true); + _stake(address(tokenA), 1, janeDoe, true); + _subscribeToIncentive(incentiveId, johnDoe); + _subscribeToIncentive(incentiveId, janeDoe); + + // 1/30 the time has passed + vm.warp(incentive.lastRewardTime + 86400); + + // Each user got 1/60 of the total reward amount + (,, uint256 johnDoeReward) = _calculateReward(incentiveId, johnDoe); + (,, uint256 janeDoeReward) = _calculateReward(incentiveId, janeDoe); + assertEq(johnDoeReward, 16666666666666666666); + assertEq(janeDoeReward, 16666666666666666666); + + // 1 user claims + vm.prank(johnDoe); + uint256[] memory johnDoeClaimed = stakingContract.claimRewards(incentiveIds); + assertEq(johnDoeClaimed[0], 16000000000000000000); + + // User still has some rewards pending + (,, johnDoeReward) = _calculateReward(incentiveId, johnDoe); + assertEq(johnDoeReward, 666666666666666666); + + // Other user still has the same reward + (,, janeDoeReward) = _calculateReward(incentiveId, janeDoe); + assertEq(janeDoeReward, 16666666666666666666); + } + function testUnstakeSaveRewards() public { _stake(address(tokenA), 1, johnDoe, true); _subscribeToIncentive(ongoingIncentive, johnDoe); diff --git a/src/Rewards/test/TestSetup.sol b/contracts/Rewards/test/TestSetup.sol similarity index 95% rename from src/Rewards/test/TestSetup.sol rename to contracts/Rewards/test/TestSetup.sol index e5c45b8..32ef640 100644 --- a/src/Rewards/test/TestSetup.sol +++ b/contracts/Rewards/test/TestSetup.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.11; +pragma solidity 0.8.20; import "forge-std/Test.sol"; import "../StakingContractMainnet.sol"; @@ -60,18 +60,19 @@ contract TestSetup is Test { vm.warp(currentTime - duration); pastIncentive = _createIncentive( - address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration) + address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration), false ); vm.warp(currentTime); ongoingIncentive = _createIncentive( - address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration) + address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration), false ); futureIncentive = _createIncentive( address(tokenA), address(tokenB), amount, uint32(block.timestamp + duration), - uint32(block.timestamp + duration * 2) + uint32(block.timestamp + duration * 2), + false ); } @@ -83,25 +84,29 @@ contract TestSetup is Test { assertTrue(true); } - function _createIncentive(address token, address rewardToken, uint112 amount, uint32 startTime, uint32 endTime) - public - returns (uint256) - { + function _createIncentive( + address token, + address rewardToken, + uint112 amount, + uint32 startTime, + uint32 endTime, + bool isRewardRounded + ) public returns (uint256) { uint256 count = stakingContract.incentiveCount(); uint256 thisBalance = Token(rewardToken).balanceOf(address(this)); uint256 stakingContractBalance = Token(rewardToken).balanceOf(address(stakingContract)); if (amount <= 0) { vm.expectRevert(invalidInput); - return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime); + return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime, isRewardRounded); } if (endTime <= startTime || endTime <= block.timestamp) { vm.expectRevert(invalidTimeFrame); - return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime); + return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime, isRewardRounded); } - uint256 id = stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime); + uint256 id = stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime, isRewardRounded); StakingContractMainnet.Incentive memory incentive = _getIncentive(id); @@ -426,13 +431,22 @@ contract TestSetup is Test { address token, address rewardToken, uint32 endTime, + bool isRewardRounded, uint256 rewardPerLiquidity, uint32 lastRewardTime, uint112 rewardRemaining, uint112 liquidityStaked ) = stakingContract.incentives(id); incentive = StakingContractMainnet.Incentive( - creator, token, rewardToken, endTime, rewardPerLiquidity, lastRewardTime, rewardRemaining, liquidityStaked + creator, + token, + rewardToken, + endTime, + isRewardRounded, + rewardPerLiquidity, + lastRewardTime, + rewardRemaining, + liquidityStaked ); } diff --git a/src/Rewards/test/mock/Token.sol b/contracts/Rewards/test/mock/Token.sol similarity index 91% rename from src/Rewards/test/mock/Token.sol rename to contracts/Rewards/test/mock/Token.sol index f4703de..59d9377 100644 --- a/src/Rewards/test/mock/Token.sol +++ b/contracts/Rewards/test/mock/Token.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.11; +pragma solidity 0.8.20; import "lib/solmate/src/tokens/ERC20.sol"; diff --git a/src/Router/IMagicSwapV2Router.sol b/contracts/Router/IMagicSwapV2Router.sol similarity index 99% rename from src/Router/IMagicSwapV2Router.sol rename to contracts/Router/IMagicSwapV2Router.sol index 195da4b..e23934a 100644 --- a/src/Router/IMagicSwapV2Router.sol +++ b/contracts/Router/IMagicSwapV2Router.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol"; import "../Vault/INftVault.sol"; diff --git a/src/Router/MagicSwapV2Router.sol b/contracts/Router/MagicSwapV2Router.sol similarity index 79% rename from src/Router/MagicSwapV2Router.sol rename to contracts/Router/MagicSwapV2Router.sol index 2ad2b5c..e83798b 100644 --- a/src/Router/MagicSwapV2Router.sol +++ b/contracts/Router/MagicSwapV2Router.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol"; import "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; @@ -9,6 +9,40 @@ import "./IMagicSwapV2Router.sol"; import "../UniswapV2/periphery/UniswapV2Router02.sol"; import "../UniswapV2/core/interfaces/IUniswapV2Pair.sol"; +// ▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▒░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▒░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▒░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ▓▓▓▓▓▓▓▓▓ + contract MagicSwapV2Router is IMagicSwapV2Router, UniswapV2Router02 { uint256 public constant ONE = 1e18; address public constant BURN_ADDRESS = address(0xdead); diff --git a/src/Router/test/MagicSwapV2Router.t.sol b/contracts/Router/test/MagicSwapV2Router.t.sol similarity index 94% rename from src/Router/test/MagicSwapV2Router.t.sol rename to contracts/Router/test/MagicSwapV2Router.t.sol index a1309ef..ca62b5b 100644 --- a/src/Router/test/MagicSwapV2Router.t.sol +++ b/contracts/Router/test/MagicSwapV2Router.t.sol @@ -1,25 +1,29 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.18; +pragma solidity 0.8.20; -import "forge-std/Test.sol"; +import {console2, Test} from "forge-std/Test.sol"; -import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import "lib/ERC721Mintable.sol"; -import "lib/ERC1155Mintable.sol"; +import {ERC721Mintable} from "lib/ERC721Mintable.sol"; +import {ERC1155Mintable} from "lib/ERC1155Mintable.sol"; -import "./mock/WETH.sol"; -import "../MagicSwapV2Router.sol"; -import "../../UniswapV2/core/UniswapV2Factory.sol"; -import "../../Vault/NftVaultFactory.sol"; +import {WETH} from "./mock/WETH.sol"; +import {IMagicSwapV2Router, MagicSwapV2Router} from "../MagicSwapV2Router.sol"; +import {UniswapV2Factory} from "../../UniswapV2/core/UniswapV2Factory.sol"; +import {IUniswapV2Router01} from "../../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol"; +import {NftVaultFactory, INftVault} from "../../Vault/NftVaultFactory.sol"; +import {TestHelper} from "../../test/TestHelper.sol"; +import {TestUniswapV2LibraryContract} from "../../test/TestUniswapV2LibraryContract.sol"; -contract MagicSwapV2RouterTest is Test { +contract MagicSwapV2RouterTest is Test, TestHelper { WETH weth; UniswapV2Factory factory; MagicSwapV2Router magicSwapV2Router; NftVaultFactory nftVaultFactory; ERC721Mintable nft1; ERC1155Mintable nft2; + TestUniswapV2LibraryContract uniswapV2Library; uint256 ONE; @@ -49,9 +53,14 @@ contract MagicSwapV2RouterTest is Test { function setUp() public { weth = new WETH(); + uniswapV2Library = new TestUniswapV2LibraryContract(); + patchUniswapV2Library(address(uniswapV2Library), "TestUniswapV2LibraryContract.sol", ""); + factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary); magicSwapV2Router = new MagicSwapV2Router(address(factory), address(weth)); + bytes memory args = abi.encode(address(factory), address(weth)); + patchUniswapV2Library(address(magicSwapV2Router), "MagicSwapV2Router.sol", args); nftVaultFactory = new NftVaultFactory(); @@ -123,7 +132,7 @@ contract MagicSwapV2RouterTest is Test { uint256[] memory _tokenId, uint256[] memory _amount, address _owner - ) public { + ) public view { for (uint256 i = 0; i < _collection.length; i++) { if (_collection[i] == address(nft1)) { assertEq(nft1.ownerOf(_tokenId[i]), _owner); @@ -140,7 +149,7 @@ contract MagicSwapV2RouterTest is Test { address _vault, address _owner, uint256 _prevBalance - ) public { + ) public view { uint256 totalAmount; for (uint256 i = 0; i < _collection.length; i++) { @@ -277,7 +286,7 @@ contract MagicSwapV2RouterTest is Test { assertEq(amountA1, nftAmountToERC20(_amount1)); assertEq(amountB1, amountBDesired1); - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); assertEq(weth.balanceOf(pair), amountB1); _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2)); @@ -345,7 +354,6 @@ contract MagicSwapV2RouterTest is Test { } function testAddLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public { - console2.logBytes32(keccak256(type(UniswapV2Pair).creationCode)); vm.assume(_tokenId < type(uint256).max - 100); vm.assume(_amount > 0); vm.assume(_amount < type(uint112).max / ONE / 10); @@ -380,7 +388,7 @@ contract MagicSwapV2RouterTest is Test { assertEq(amountA1, nftAmountToERC20(_amount1)); assertEq(amountB1, amountBDesired1); - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); assertEq(weth.balanceOf(pair), amountB1); _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2)); @@ -495,7 +503,7 @@ contract MagicSwapV2RouterTest is Test { assertEq(amountB1, nftAmountToERC20(_amountB1)); // All vault tokens were transferred to the pair - pair = UniswapV2Library.pairFor(address(factory), address(vault1), address(vault2)); + pair = uniswapV2Library.pairFor(address(factory), address(vault1), address(vault2)); assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1); assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1); @@ -621,7 +629,7 @@ contract MagicSwapV2RouterTest is Test { ); } - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); vm.prank(user1); IERC20(pair).approve(address(magicSwapV2Router), lpAmount1); @@ -777,7 +785,7 @@ contract MagicSwapV2RouterTest is Test { ); } - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); vm.prank(user1); IERC20(pair).approve(address(magicSwapV2Router), lpAmount1); @@ -969,10 +977,10 @@ contract MagicSwapV2RouterTest is Test { path[1] = address(weth); (uint256 reserveVault, uint256 reserveWeth) = - UniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + uniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); uint256 amountIn = nftAmountToERC20(_amount1); - uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory)); + uint256 amountOut = uniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory)); uint256 amountOutMin = amountOut; vm.prank(user2); @@ -1014,10 +1022,10 @@ contract MagicSwapV2RouterTest is Test { wrongPath[1] = address(vault1); (uint256 reserveVault, uint256 reserveWeth) = - UniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + uniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); uint256 amountIn = nftAmountToERC20(_amount1); - uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory)); + uint256 amountOut = uniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory)); uint256 amountOutMin = amountOut; uint256 prevETHBalance = user2.balance; @@ -1065,10 +1073,10 @@ contract MagicSwapV2RouterTest is Test { path[1] = address(vault2); (uint256 reserveVault, uint256 reserveWeth) = - UniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + uniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); uint256 amountOut = nftAmountToERC20(_amount1); - uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory)); + uint256 amountIn = uniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory)); uint256 amountInMax = amountIn; _dealWeth(user2, amountIn); @@ -1111,10 +1119,10 @@ contract MagicSwapV2RouterTest is Test { path[1] = address(vault2); (uint256 reserveVault, uint256 reserveWeth) = - UniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); - address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); + uniswapV2Library.getReserves(address(factory), address(vault2), address(weth)); + address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth)); uint256 amountOut = nftAmountToERC20(_amount1); - uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory)); + uint256 amountIn = uniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory)); uint256 dust = 1e18; vm.deal(user2, amountIn + dust); @@ -1168,7 +1176,7 @@ contract MagicSwapV2RouterTest is Test { uint256 amountOut; { amountIn = nftAmountToERC20(_amountIn); - uint256[] memory amounts = UniswapV2Library.getAmountsOut(address(factory), amountIn, path); + uint256[] memory amounts = uniswapV2Library.getAmountsOut(address(factory), amountIn, path); amountOut = amounts[amounts.length - 1]; console2.log("amountOut", amountOut); } @@ -1180,7 +1188,7 @@ contract MagicSwapV2RouterTest is Test { uint256 prevPairVault2Balance; { - address pair = UniswapV2Library.pairFor(address(factory), path[1], path[2]); + address pair = uniswapV2Library.pairFor(address(factory), path[1], path[2]); prevPairVault2Balance = IERC20(address(vault2)).balanceOf(pair); } @@ -1198,7 +1206,7 @@ contract MagicSwapV2RouterTest is Test { console2.log("dust", dust); assertTrue(dust > 0); assertEq( - IERC20(address(vault2)).balanceOf(UniswapV2Library.pairFor(address(factory), path[1], path[2])), + IERC20(address(vault2)).balanceOf(uniswapV2Library.pairFor(address(factory), path[1], path[2])), prevPairVault2Balance - amountOut + dust ); diff --git a/src/Router/test/mock/WETH.sol b/contracts/Router/test/mock/WETH.sol similarity index 92% rename from src/Router/test/mock/WETH.sol rename to contracts/Router/test/mock/WETH.sol index c813056..c567f79 100644 --- a/src/Router/test/mock/WETH.sol +++ b/contracts/Router/test/mock/WETH.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; contract WETH { string public name = "Wrapped Ether"; @@ -26,7 +26,8 @@ contract WETH { function withdraw(uint256 wad) public { require(balanceOf[msg.sender] >= wad); balanceOf[msg.sender] -= wad; - payable(msg.sender).transfer(wad); + (bool success,) = payable(msg.sender).call{value: wad}(""); + require(success, "Transfer failed"); emit Withdrawal(msg.sender, wad); } diff --git a/src/UniswapV2/core/UniswapV2ERC20.sol b/contracts/UniswapV2/core/UniswapV2ERC20.sol similarity index 99% rename from src/UniswapV2/core/UniswapV2ERC20.sol rename to contracts/UniswapV2/core/UniswapV2ERC20.sol index c24b86a..daff41a 100644 --- a/src/UniswapV2/core/UniswapV2ERC20.sol +++ b/contracts/UniswapV2/core/UniswapV2ERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "./interfaces/IUniswapV2ERC20.sol"; import "./libraries/SafeMath.sol"; diff --git a/src/UniswapV2/core/UniswapV2Factory.sol b/contracts/UniswapV2/core/UniswapV2Factory.sol similarity index 99% rename from src/UniswapV2/core/UniswapV2Factory.sol rename to contracts/UniswapV2/core/UniswapV2Factory.sol index a5f2f76..912aa6c 100644 --- a/src/UniswapV2/core/UniswapV2Factory.sol +++ b/contracts/UniswapV2/core/UniswapV2Factory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol"; import "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol"; diff --git a/src/UniswapV2/core/UniswapV2Pair.sol b/contracts/UniswapV2/core/UniswapV2Pair.sol similarity index 99% rename from src/UniswapV2/core/UniswapV2Pair.sol rename to contracts/UniswapV2/core/UniswapV2Pair.sol index d06187a..afc8b6d 100644 --- a/src/UniswapV2/core/UniswapV2Pair.sol +++ b/contracts/UniswapV2/core/UniswapV2Pair.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; diff --git a/src/UniswapV2/core/interfaces/IUniswapV2Callee.sol b/contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol similarity index 87% rename from src/UniswapV2/core/interfaces/IUniswapV2Callee.sol rename to contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol index 29ecf7a..dec0e2b 100644 --- a/src/UniswapV2/core/interfaces/IUniswapV2Callee.sol +++ b/contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; interface IUniswapV2Callee { function uniswapV2Call(address sender, uint256 amount0, uint256 amount1, bytes calldata data) external; diff --git a/src/UniswapV2/core/interfaces/IUniswapV2ERC20.sol b/contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol similarity index 98% rename from src/UniswapV2/core/interfaces/IUniswapV2ERC20.sol rename to contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol index cac002f..032ee50 100644 --- a/src/UniswapV2/core/interfaces/IUniswapV2ERC20.sol +++ b/contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; interface IUniswapV2ERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); diff --git a/src/UniswapV2/core/interfaces/IUniswapV2Factory.sol b/contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol similarity index 99% rename from src/UniswapV2/core/interfaces/IUniswapV2Factory.sol rename to contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol index 10544ad..3b4dad6 100644 --- a/src/UniswapV2/core/interfaces/IUniswapV2Factory.sol +++ b/contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; interface IUniswapV2Factory { struct DefaultFees { diff --git a/src/UniswapV2/core/interfaces/IUniswapV2Pair.sol b/contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol similarity index 98% rename from src/UniswapV2/core/interfaces/IUniswapV2Pair.sol rename to contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol index b707e4f..49b5e71 100644 --- a/src/UniswapV2/core/interfaces/IUniswapV2Pair.sol +++ b/contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; interface IUniswapV2Pair { event Mint(address indexed sender, uint256 amount0, uint256 amount1); diff --git a/src/UniswapV2/core/libraries/Oracle.sol b/contracts/UniswapV2/core/libraries/Oracle.sol similarity index 99% rename from src/UniswapV2/core/libraries/Oracle.sol rename to contracts/UniswapV2/core/libraries/Oracle.sol index 6764dd4..63ecbc9 100644 --- a/src/UniswapV2/core/libraries/Oracle.sol +++ b/contracts/UniswapV2/core/libraries/Oracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; /// @title Oracle (modifier version of Oracle.sol from UniswapV3) /// @notice Provides price data useful for a wide variety of system designs diff --git a/src/UniswapV2/core/libraries/SafeMath.sol b/contracts/UniswapV2/core/libraries/SafeMath.sol similarity index 96% rename from src/UniswapV2/core/libraries/SafeMath.sol rename to contracts/UniswapV2/core/libraries/SafeMath.sol index 2935998..aa38de4 100644 --- a/src/UniswapV2/core/libraries/SafeMath.sol +++ b/contracts/UniswapV2/core/libraries/SafeMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) diff --git a/src/UniswapV2/core/libraries/UQ112x112.sol b/contracts/UniswapV2/core/libraries/UQ112x112.sol similarity index 96% rename from src/UniswapV2/core/libraries/UQ112x112.sol rename to contracts/UniswapV2/core/libraries/UQ112x112.sol index 2d3b21c..9b20230 100644 --- a/src/UniswapV2/core/libraries/UQ112x112.sol +++ b/contracts/UniswapV2/core/libraries/UQ112x112.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) diff --git a/src/UniswapV2/core/libraries/UniswapV2Math.sol b/contracts/UniswapV2/core/libraries/UniswapV2Math.sol similarity index 96% rename from src/UniswapV2/core/libraries/UniswapV2Math.sol rename to contracts/UniswapV2/core/libraries/UniswapV2Math.sol index aa04ae3..097e77d 100644 --- a/src/UniswapV2/core/libraries/UniswapV2Math.sol +++ b/contracts/UniswapV2/core/libraries/UniswapV2Math.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; // a library for performing various math operations diff --git a/src/UniswapV2/core/test/Oracle.t.sol b/contracts/UniswapV2/core/test/Oracle.t.sol similarity index 98% rename from src/UniswapV2/core/test/Oracle.t.sol rename to contracts/UniswapV2/core/test/Oracle.t.sol index f8b618f..a1cf084 100644 --- a/src/UniswapV2/core/test/Oracle.t.sol +++ b/contracts/UniswapV2/core/test/Oracle.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "forge-std/Test.sol"; @@ -24,15 +24,19 @@ contract OracleTest is Test { UniswapV2Pair public pair; UniswapV2Factory factory; - ERC20Mintable public DAI = new ERC20Mintable(); - ERC20Mintable public WETH = new ERC20Mintable(); - OracleImpl public oracleImpl = new OracleImpl(); + ERC20Mintable public DAI; + ERC20Mintable public WETH; + OracleImpl public oracleImpl; address user1 = address(10000001); address protocolFeeBeneficiary = address(10000005); function setUp() public { + DAI = new ERC20Mintable(); + WETH = new ERC20Mintable(); + oracleImpl = new OracleImpl(); + vm.warp(TIMESTAMP); factory = new UniswapV2Factory(150, 30, protocolFeeBeneficiary); diff --git a/src/UniswapV2/core/test/UniswapV2Factory.t.sol b/contracts/UniswapV2/core/test/UniswapV2Factory.t.sol similarity index 92% rename from src/UniswapV2/core/test/UniswapV2Factory.t.sol rename to contracts/UniswapV2/core/test/UniswapV2Factory.t.sol index 2f692f1..77ca1a2 100644 --- a/src/UniswapV2/core/test/UniswapV2Factory.t.sol +++ b/contracts/UniswapV2/core/test/UniswapV2Factory.t.sol @@ -1,16 +1,17 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.18; +pragma solidity 0.8.20; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; -import "lib/ERC20Mintable.sol"; +import {ERC20} from "lib/ERC20Mintable.sol"; -import "../UniswapV2Factory.sol"; -import "../../periphery/libraries/UniswapV2Library.sol"; +import {IUniswapV2Factory, UniswapV2Factory} from "../UniswapV2Factory.sol"; +import {TestUniswapV2LibraryContract} from "../../../test/TestUniswapV2LibraryContract.sol"; +import {TestHelper} from "../../../test/TestHelper.sol"; -contract UniswapV2FactoryTest is Test { +contract UniswapV2FactoryTest is Test, TestHelper { UniswapV2Factory factory; - + TestUniswapV2LibraryContract uniswapV2Library; address pool1; address hacker = address(10000004); address owner = address(10000005); @@ -31,6 +32,10 @@ contract UniswapV2FactoryTest is Test { event ProtocolFeeBeneficiarySet(address beneficiary); function setUp() public { + uniswapV2Library = new TestUniswapV2LibraryContract(); + bytes memory args = abi.encode(); + patchUniswapV2Library(address(uniswapV2Library), "TestUniswapV2LibraryContract.sol", args); + vm.prank(owner); factory = new UniswapV2Factory(0, 0, protocolFeeBeneficiary); @@ -332,7 +337,9 @@ contract UniswapV2FactoryTest is Test { assertTrue(totalFee <= MAX_FEE); } - function testCreatePair(address _tokenA, address _tokenB) public { + /// @notice we cannot test the create2 address, because the foundry and hardhat generated bytecode + /// is different which makes both the hash and the address different + function testCreatePairUni(address _tokenA, address _tokenB) public { vm.assume(_tokenA != address(0)); vm.assume(_tokenB != address(0)); vm.assume(_tokenA != _tokenB); @@ -340,14 +347,14 @@ contract UniswapV2FactoryTest is Test { vm.mockCall(_tokenA, abi.encodeCall(ERC20.decimals, ()), abi.encode(18)); vm.mockCall(_tokenB, abi.encodeCall(ERC20.decimals, ()), abi.encode(18)); - (address token0, address token1) = UniswapV2Library.sortTokens(_tokenA, _tokenB); - address expectedPair = UniswapV2Library.pairFor(address(factory), _tokenA, _tokenB); + (address token0, address token1) = uniswapV2Library.sortTokens(_tokenA, _tokenB); + address expectedPair = uniswapV2Library.pairFor(address(factory), _tokenA, _tokenB); vm.expectEmit(true, true, true, true); emit PairCreated(token0, token1, expectedPair, 2); address pair = factory.createPair(_tokenA, _tokenB); - assertEq(pair, expectedPair); + // assertEq(pair, expectedPair); assertEq(factory.getPair(_tokenA, _tokenB), pair); assertEq(factory.getPair(_tokenB, _tokenA), pair); assertEq(factory.allPairs(1), pair); diff --git a/src/UniswapV2/core/test/UniswapV2Pair.t.sol b/contracts/UniswapV2/core/test/UniswapV2Pair.t.sol similarity index 88% rename from src/UniswapV2/core/test/UniswapV2Pair.t.sol rename to contracts/UniswapV2/core/test/UniswapV2Pair.t.sol index 4da43ad..ead2064 100644 --- a/src/UniswapV2/core/test/UniswapV2Pair.t.sol +++ b/contracts/UniswapV2/core/test/UniswapV2Pair.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "forge-std/Test.sol"; @@ -131,10 +131,10 @@ contract UniswapV2PairTest is Test { } function testSwapRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public { - vm.assume(_reserve0 > 10000e18); - vm.assume(_reserve1 > 10000e18); - vm.assume(_amount0In > 0.001e18); - vm.assume(_amount1In > 0.001e18); + _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max)); + _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max)); + _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max)); + _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max)); _addLiquidity(address(pair), _reserve0, _reserve1, user3); _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3); @@ -172,10 +172,10 @@ contract UniswapV2PairTest is Test { } function testSkimRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public { - vm.assume(_reserve0 > 10000e18); - vm.assume(_reserve1 > 10000e18); - vm.assume(_amount0In > 0.001e18); - vm.assume(_amount1In > 0.001e18); + _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max)); + _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max)); + _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max)); + _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max)); _addLiquidity(address(pair), _reserve0, _reserve1, user3); _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3); @@ -204,9 +204,11 @@ contract UniswapV2PairTest is Test { } function testSyncRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public { - vm.assume(_reserve0 > 10000e18); - vm.assume(_reserve1 > 10000e18); - vm.assume(_amount0In > 0.001e18); + _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max)); + _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max)); + _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max)); + _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max)); + vm.assume(_amount1In > 0.001e18); _addLiquidity(address(pair), _reserve0, _reserve1, user3); @@ -234,10 +236,11 @@ contract UniswapV2PairTest is Test { uint72 _amount1In, uint256 _hijackAmount ) public { - vm.assume(_reserve0 > 10000e18); - vm.assume(_reserve1 > 10000e18); - vm.assume(_amount0In > 0.001e18); - vm.assume(_amount1In > 0.001e18); + _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max)); + _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max)); + _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max)); + _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max)); + _hijackAmount = uint72(bound(_hijackAmount, 0.001e18, type(uint72).max)); vm.assume(_amount0In > _hijackAmount); _addLiquidity(address(pairWithFees), _reserve0, _reserve1, user3); diff --git a/src/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol b/contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol similarity index 99% rename from src/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol rename to contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol index df63815..3021e9d 100644 --- a/src/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol +++ b/contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol"; import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; diff --git a/src/UniswapV2/libraries/Babylonian.sol b/contracts/UniswapV2/libraries/Babylonian.sol similarity index 98% rename from src/UniswapV2/libraries/Babylonian.sol rename to contracts/UniswapV2/libraries/Babylonian.sol index dab1b84..ca0e61a 100644 --- a/src/UniswapV2/libraries/Babylonian.sol +++ b/contracts/UniswapV2/libraries/Babylonian.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; +pragma solidity 0.8.20; // computes square roots using the babylonian method // https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method diff --git a/src/UniswapV2/libraries/BitMath.sol b/contracts/UniswapV2/libraries/BitMath.sol similarity index 98% rename from src/UniswapV2/libraries/BitMath.sol rename to contracts/UniswapV2/libraries/BitMath.sol index f2e858f..27cc445 100644 --- a/src/UniswapV2/libraries/BitMath.sol +++ b/contracts/UniswapV2/libraries/BitMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; +pragma solidity 0.8.20; library BitMath { // returns the 0 indexed position of the most significant bit of the input x diff --git a/src/UniswapV2/libraries/FullMath.sol b/contracts/UniswapV2/libraries/FullMath.sol similarity index 98% rename from src/UniswapV2/libraries/FullMath.sol rename to contracts/UniswapV2/libraries/FullMath.sol index 6982537..59ca6ea 100644 --- a/src/UniswapV2/libraries/FullMath.sol +++ b/contracts/UniswapV2/libraries/FullMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: CC-BY-4.0 -pragma solidity 0.8.18; +pragma solidity 0.8.20; // taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1 // license is CC-BY-4.0 diff --git a/src/UniswapV2/libraries/TransferHelper.sol b/contracts/UniswapV2/libraries/TransferHelper.sol similarity index 98% rename from src/UniswapV2/libraries/TransferHelper.sol rename to contracts/UniswapV2/libraries/TransferHelper.sol index d701ba9..7caf2c4 100644 --- a/src/UniswapV2/libraries/TransferHelper.sol +++ b/contracts/UniswapV2/libraries/TransferHelper.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; +pragma solidity 0.8.20; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { diff --git a/src/UniswapV2/periphery/UniswapV2Router02.sol b/contracts/UniswapV2/periphery/UniswapV2Router02.sol similarity index 99% rename from src/UniswapV2/periphery/UniswapV2Router02.sol rename to contracts/UniswapV2/periphery/UniswapV2Router02.sol index 1f61fb4..7349f14 100644 --- a/src/UniswapV2/periphery/UniswapV2Router02.sol +++ b/contracts/UniswapV2/periphery/UniswapV2Router02.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; diff --git a/src/UniswapV2/periphery/interfaces/IERC20.sol b/contracts/UniswapV2/periphery/interfaces/IERC20.sol similarity index 97% rename from src/UniswapV2/periphery/interfaces/IERC20.sol rename to contracts/UniswapV2/periphery/interfaces/IERC20.sol index 9be31d0..be79b82 100644 --- a/src/UniswapV2/periphery/interfaces/IERC20.sol +++ b/contracts/UniswapV2/periphery/interfaces/IERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); diff --git a/src/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol b/contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol similarity index 99% rename from src/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol rename to contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol index 229db77..88ca1fb 100644 --- a/src/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol +++ b/contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; interface IUniswapV2Router01 { error UniswapV2RouterExpired(); diff --git a/src/UniswapV2/periphery/interfaces/IWETH.sol b/contracts/UniswapV2/periphery/interfaces/IWETH.sol similarity index 89% rename from src/UniswapV2/periphery/interfaces/IWETH.sol rename to contracts/UniswapV2/periphery/interfaces/IWETH.sol index 3c4bd6a..b68951c 100644 --- a/src/UniswapV2/periphery/interfaces/IWETH.sol +++ b/contracts/UniswapV2/periphery/interfaces/IWETH.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; interface IWETH { function deposit() external payable; diff --git a/src/UniswapV2/periphery/libraries/OracleLibrary.sol b/contracts/UniswapV2/periphery/libraries/OracleLibrary.sol similarity index 97% rename from src/UniswapV2/periphery/libraries/OracleLibrary.sol rename to contracts/UniswapV2/periphery/libraries/OracleLibrary.sol index 63b4093..7773b68 100644 --- a/src/UniswapV2/periphery/libraries/OracleLibrary.sol +++ b/contracts/UniswapV2/periphery/libraries/OracleLibrary.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "../../core/interfaces/IUniswapV2Pair.sol"; diff --git a/src/UniswapV2/periphery/libraries/UniswapV2Library.sol b/contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol similarity index 87% rename from src/UniswapV2/periphery/libraries/UniswapV2Library.sol rename to contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol index 1c7a560..82aa09a 100644 --- a/src/UniswapV2/periphery/libraries/UniswapV2Library.sol +++ b/contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol @@ -1,13 +1,19 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "../../core/interfaces/IUniswapV2Pair.sol"; import "../../core/interfaces/IUniswapV2Factory.sol"; import "../../core/libraries/SafeMath.sol"; +/** + * @notice Modified UniswapV2 to work with zksync stack based CREATE2 + * + */ library UniswapV2Library { using SafeMath for uint256; + bytes32 constant INIT_CODE_HASH = hex"010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43"; + /// @dev returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "UniswapV2Library: IDENTICAL_ADDRESSES"); @@ -15,7 +21,7 @@ library UniswapV2Library { require(token0 != address(0), "UniswapV2Library: ZERO_ADDRESS"); } - /// @dev calculates the CREATE2 address for a pair without making any external calls + // calculates the CREATE2 address for a pair without making any external calls function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( @@ -23,10 +29,11 @@ library UniswapV2Library { uint256( keccak256( abi.encodePacked( - hex"ff", - factory, - keccak256(abi.encodePacked(token0, token1)), - hex"5ef2d07853620860a5e77bae863f7dc2bd883e28f5e9c837541f791fb45076c7" // init code hash, keccak256(type(UniswapV2Pair).creationCode) + bytes32(0x2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494), // keccak256("zksyncCreate2") + bytes32(uint256(uint160(factory))), // sender + keccak256(abi.encodePacked(token0, token1)), // salt + INIT_CODE_HASH, + bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) // constructor input hash: keccak256("") ) ) ) diff --git a/src/Vault/INftVault.sol b/contracts/Vault/INftVault.sol similarity index 99% rename from src/Vault/INftVault.sol rename to contracts/Vault/INftVault.sol index 5e80349..fac6c7b 100644 --- a/src/Vault/INftVault.sol +++ b/contracts/Vault/INftVault.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; /// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20 interface INftVault { diff --git a/src/Vault/INftVaultFactory.sol b/contracts/Vault/INftVaultFactory.sol similarity index 99% rename from src/Vault/INftVaultFactory.sol rename to contracts/Vault/INftVaultFactory.sol index 03ba3d1..f7cae91 100644 --- a/src/Vault/INftVaultFactory.sol +++ b/contracts/Vault/INftVaultFactory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "./INftVault.sol"; diff --git a/src/Vault/NftVault.sol b/contracts/Vault/NftVault.sol similarity index 99% rename from src/Vault/NftVault.sol rename to contracts/Vault/NftVault.sol index c139c11..5194b45 100644 --- a/src/Vault/NftVault.sol +++ b/contracts/Vault/NftVault.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; import "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; diff --git a/src/Vault/NftVaultFactory.sol b/contracts/Vault/NftVaultFactory.sol similarity index 99% rename from src/Vault/NftVaultFactory.sol rename to contracts/Vault/NftVaultFactory.sol index a30133d..15a8725 100644 --- a/src/Vault/NftVaultFactory.sol +++ b/contracts/Vault/NftVaultFactory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol"; import "lib/openzeppelin-contracts/contracts/utils/Strings.sol"; diff --git a/contracts/Vault/NftVaultManager.sol b/contracts/Vault/NftVaultManager.sol new file mode 100644 index 0000000..93c0c71 --- /dev/null +++ b/contracts/Vault/NftVaultManager.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.20; + +import "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; +import "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol"; +import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import "./INftVault.sol"; + +contract NftVaultManager { + function withdrawBatch( + address _vault, + address[] memory _collections, + uint256[] memory _tokenIds, + uint256[] memory _amounts + ) external returns (uint256) { + INftVault vault = INftVault(_vault); + + uint256 totalAmount; + for (uint256 i = 0; i < _amounts.length; i++) { + totalAmount += _amounts[i]; + } + + IERC20(_vault).transferFrom(msg.sender, _vault, totalAmount * vault.ONE()); + return vault.withdrawBatch(msg.sender, _collections, _tokenIds, _amounts); + } + + function depositBatch( + address _vault, + address[] memory _collections, + uint256[] memory _tokenIds, + uint256[] memory _amounts + ) external returns (uint256) { + INftVault vault = INftVault(_vault); + address collectionAddress; + + for (uint256 i = 0; i < _collections.length; i++) { + collectionAddress = _collections[i]; + INftVault.CollectionData memory collectionData = vault.getAllowedCollectionData(collectionAddress); + if (collectionData.nftType == INftVault.NftType.ERC1155) { + IERC1155(collectionAddress).safeTransferFrom(msg.sender, _vault, _tokenIds[i], _amounts[i], ""); + } else if (collectionData.nftType == INftVault.NftType.ERC721) { + IERC721(collectionAddress).safeTransferFrom(msg.sender, _vault, _tokenIds[i]); + } else { + revert("NftVaultManager: Invalid NFT type"); + } + } + return vault.depositBatch(msg.sender, _collections, _tokenIds, _amounts); + } +} diff --git a/src/Vault/test/NftVault.t.sol b/contracts/Vault/test/NftVault.t.sol similarity index 99% rename from src/Vault/test/NftVault.t.sol rename to contracts/Vault/test/NftVault.t.sol index b90e9d9..8fe13be 100644 --- a/src/Vault/test/NftVault.t.sol +++ b/contracts/Vault/test/NftVault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "forge-std/Test.sol"; @@ -11,7 +11,7 @@ import "../NftVault.sol"; import "../NftVaultFactory.sol"; contract NftVaultTest is Test { - NftVaultFactory public nftVaultFactory = new NftVaultFactory(); + NftVaultFactory public nftVaultFactory; address user1 = address(1001); address user2 = address(1002); @@ -39,6 +39,7 @@ contract NftVaultTest is Test { event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount); function setUp() public { + nftVaultFactory = new NftVaultFactory(); collectionERC721all = INftVault.CollectionData({ addr: address(new ERC721Mintable()), nftType: INftVault.NftType.ERC721, diff --git a/src/Vault/test/NftVaultFactory.t.sol b/contracts/Vault/test/NftVaultFactory.t.sol similarity index 99% rename from src/Vault/test/NftVaultFactory.t.sol rename to contracts/Vault/test/NftVaultFactory.t.sol index 90f3469..75236ba 100644 --- a/src/Vault/test/NftVaultFactory.t.sol +++ b/contracts/Vault/test/NftVaultFactory.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "forge-std/Test.sol"; diff --git a/src/VaultPermissioned/INftVaultFactoryPermissioned.sol b/contracts/VaultPermissioned/INftVaultFactoryPermissioned.sol similarity index 99% rename from src/VaultPermissioned/INftVaultFactoryPermissioned.sol rename to contracts/VaultPermissioned/INftVaultFactoryPermissioned.sol index ebd78a7..a10339c 100644 --- a/src/VaultPermissioned/INftVaultFactoryPermissioned.sol +++ b/contracts/VaultPermissioned/INftVaultFactoryPermissioned.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "./INftVaultPermissioned.sol"; diff --git a/src/VaultPermissioned/INftVaultPermissioned.sol b/contracts/VaultPermissioned/INftVaultPermissioned.sol similarity index 99% rename from src/VaultPermissioned/INftVaultPermissioned.sol rename to contracts/VaultPermissioned/INftVaultPermissioned.sol index c652e6c..d688a17 100644 --- a/src/VaultPermissioned/INftVaultPermissioned.sol +++ b/contracts/VaultPermissioned/INftVaultPermissioned.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; /// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20 interface INftVaultPermissioned { diff --git a/src/VaultPermissioned/NftVaultFactoryPermissioned.sol b/contracts/VaultPermissioned/NftVaultFactoryPermissioned.sol similarity index 99% rename from src/VaultPermissioned/NftVaultFactoryPermissioned.sol rename to contracts/VaultPermissioned/NftVaultFactoryPermissioned.sol index 41fa12f..1d3f540 100644 --- a/src/VaultPermissioned/NftVaultFactoryPermissioned.sol +++ b/contracts/VaultPermissioned/NftVaultFactoryPermissioned.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol"; import "lib/openzeppelin-contracts/contracts/utils/Counters.sol"; diff --git a/src/VaultPermissioned/NftVaultPermissioned.sol b/contracts/VaultPermissioned/NftVaultPermissioned.sol similarity index 99% rename from src/VaultPermissioned/NftVaultPermissioned.sol rename to contracts/VaultPermissioned/NftVaultPermissioned.sol index e463f74..235fb1c 100644 --- a/src/VaultPermissioned/NftVaultPermissioned.sol +++ b/contracts/VaultPermissioned/NftVaultPermissioned.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; import "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; diff --git a/contracts/test/TestHelper.sol b/contracts/test/TestHelper.sol new file mode 100644 index 0000000..a3c5baa --- /dev/null +++ b/contracts/test/TestHelper.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.20; + +import {Test} from "forge-std/Test.sol"; + +contract TestHelper is Test { + function patchUniswapV2Library( + address contractUsingUniswapV2Library, + string memory contractFilename, + bytes memory args + ) public { + bytes memory bytecode = abi.encodePacked(vm.getCode(contractFilename), args); + + bytes32 ORIGINAL_INIT_CODE_HASH = 0x010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43; + bytes32 NEW_INIT_CODE_HASH = 0x010004dba4c88c36b9cf5b708cdea396e454c1d162b487daa289669537fe8f0d; + + bytecode = veryBadBytesReplacer(bytecode, ORIGINAL_INIT_CODE_HASH, NEW_INIT_CODE_HASH); + vm.etch(contractUsingUniswapV2Library, bytecode); + } + + /** + * @dev Non-optimised code to replace a certain 32 bytes sequence in a longer bytes object. + * @dev Assumes the 32 bytes sequence is exactly once present in the bytes object. + * Reverts if it is not present and only replaces first occurrence if present multiple times. + */ + function veryBadBytesReplacer(bytes memory bytecode, bytes32 target, bytes32 replacement) + internal + pure + returns (bytes memory result) + { + result = veryBadBytesReplacer(bytecode, abi.encodePacked(target), abi.encodePacked(replacement)); + } + + function veryBadBytesReplacer(bytes memory bytecode, bytes memory target, bytes memory replacement) + internal + pure + returns (bytes memory result) + { + require(target.length <= bytecode.length); + require(target.length == replacement.length); + + uint256 lengthTarget = target.length; + uint256 lengthBytecode = bytecode.length - lengthTarget + 1; + uint256 i; + for (i; i < lengthBytecode;) { + uint256 j = 0; + for (j; j < lengthTarget;) { + if (bytecode[i + j] == target[j]) { + if (j == lengthTarget - 1) { + // Target found, replace with replacement, and return result. + return result = replaceBytes(bytecode, replacement, i); + } + } else { + break; + } + unchecked { + ++j; + } + } + + unchecked { + ++i; + } + } + // Should always find one single match. -> revert if not. + revert(); + } + + function veryBadBytesReplacer( + bytes memory bytecode, + bytes memory target, + bytes memory replacement, + bool replaceFirstOnly + ) internal pure returns (bytes memory) { + require(target.length <= bytecode.length); + require(target.length == replacement.length); + + uint256 lengthTarget = target.length; + uint256 lengthBytecode = bytecode.length - lengthTarget + 1; + for (uint256 i; i < lengthBytecode; ++i) { + uint256 j = 0; + for (j; j < lengthTarget; ++j) { + if (bytecode[i + j] == target[j]) { + if (j == lengthTarget - 1) { + // Target found, replace with replacement. + bytecode = replaceBytes(bytecode, replacement, i); + if (replaceFirstOnly) return bytecode; + } + } else { + break; + } + } + } + return bytecode; + } + + /** + * @dev Reverts if startPosition + replacement.length is bigger than bytecode.length. + */ + function replaceBytes(bytes memory bytecode, bytes memory replacement, uint256 startPosition) + internal + pure + returns (bytes memory) + { + uint256 lengthReplacement = replacement.length; + for (uint256 j; j < lengthReplacement;) { + bytecode[startPosition + j] = replacement[j]; + + unchecked { + ++j; + } + } + return bytecode; + } +} diff --git a/contracts/test/TestUniswapV2LibraryContract.sol b/contracts/test/TestUniswapV2LibraryContract.sol new file mode 100644 index 0000000..2625c37 --- /dev/null +++ b/contracts/test/TestUniswapV2LibraryContract.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.20; + +import {UniswapV2Library} from "../UniswapV2/periphery/libraries/UniswapV2Library.sol"; + +contract TestUniswapV2LibraryContract { + function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { + return UniswapV2Library.sortTokens(tokenA, tokenB); + } + + function pairFor(address factory, address tokenA, address tokenB) public pure returns (address pair) { + return UniswapV2Library.pairFor(factory, tokenA, tokenB); + } + + function getReserves(address factory, address tokenA, address tokenB) + public + view + returns (uint256 reserveA, uint256 reserveB) + { + return UniswapV2Library.getReserves(factory, tokenA, tokenB); + } + + function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) public pure returns (uint256 amountB) { + return UniswapV2Library.quote(amountA, reserveA, reserveB); + } + + function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair, address factory) + public + view + returns (uint256 amountOut) + { + return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, pair, factory); + } + + function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair, address factory) + public + view + returns (uint256 amountIn) + { + return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, pair, factory); + } + + function getAmountsOut(address factory, uint256 amountIn, address[] memory path) + public + view + returns (uint256[] memory amounts) + { + return UniswapV2Library.getAmountsOut(factory, amountIn, path); + } + + function getAmountsIn(address factory, uint256 amountOut, address[] memory path) + public + view + returns (uint256[] memory amounts) + { + return UniswapV2Library.getAmountsIn(factory, amountOut, path); + } +} diff --git a/deploy/deploy.ts b/deploy/deploy.ts new file mode 100644 index 0000000..e3adc73 --- /dev/null +++ b/deploy/deploy.ts @@ -0,0 +1,43 @@ +import type { HardhatRuntimeEnvironment } from 'hardhat/types'; +import type { DeployFunction } from 'hardhat-deploy/types'; + +const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { + const { getNamedAccounts, deployments } = hre; + const { deploy } = deployments; + const { deployer } = await getNamedAccounts(); + + const protocolFee = 30n; // 0.3% + const lpFee = 30n; // 0.3% + const protocolFeeBeneficiary = "0xA65d67513328445B4A4D2F498624483c2601ddA4"; // L2 Treasury + + const uniswapFactoryConstructorArguments = [protocolFee, lpFee, protocolFeeBeneficiary]; + const factory = await deploy('UniswapV2Factory', { + from: deployer, + args: uniswapFactoryConstructorArguments, + }); + + console.log("UniswapV2Factory deployed to:", factory.address); + + const wMagic = "0x263D8f36Bb8d0d9526255E205868C26690b04B88"; + const routerConstructorArguments = [factory.address, wMagic]; + const magicSwapV2Router = await deploy('MagicSwapV2Router', { + from: deployer, + args: routerConstructorArguments, + }); + + console.log("MagicSwapV2Router deployed to:", magicSwapV2Router.address); + + const nftVaultFactory = await deploy('NftVaultFactory', { + from: deployer, + }); + + console.log("NftVaultFactory deployed to:", nftVaultFactory.address); + + const stakingContract = await deploy('StakingContractMainnet', { + from: deployer, + }); + + console.log("StakingContractMainnet deployed to:", stakingContract.address); +} + +export default func; diff --git a/deployments/treasureMainnet/.chainId b/deployments/treasureMainnet/.chainId new file mode 100644 index 0000000..8e48c8e --- /dev/null +++ b/deployments/treasureMainnet/.chainId @@ -0,0 +1 @@ +61166 \ No newline at end of file diff --git a/deployments/treasureMainnet/MagicSwapV2Router.json b/deployments/treasureMainnet/MagicSwapV2Router.json new file mode 100644 index 0000000..2cbcaa1 --- /dev/null +++ b/deployments/treasureMainnet/MagicSwapV2Router.json @@ -0,0 +1,4767 @@ +{ + "address": "0xd38F4A9bAeB461B124c1B462653363aafE0B3405", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "MagicSwapV2InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountADeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountBDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmounts", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExcessiveInputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientAAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientBAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientOutputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedNft", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityRemoved", + "type": "event" + }, + { + "inputs": [], + "name": "BURN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ONE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountADesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountTokenDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountMinted", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountIn", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountOut", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsOut", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveB", + "type": "uint256" + } + ], + "name": "quote", + "outputs": [ + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityETHWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapETHForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapETHForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactETHForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collectionIn", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountIn", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_collectionOut", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountOut", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapTokensForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "withdrawVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xab1e4aa32139744ca4d5cf632442b871377f709270bfacbde870862140d490e5", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x39C6bF2F2360E993a5eD8E1A30edC01001af64f3", + "contractAddress": "0xd38F4A9bAeB461B124c1B462653363aafE0B3405", + "transactionIndex": 0, + "gasUsed": "118879", + "logsBloom": "0x04000000000400080000000000000000000000001000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000008000040000000000000000000000000000000080000000000000000002000000000000000000000000000000000000012000000000000000000000000000004000000000000000100000000000000000000000000000000000000100000000000800000000000000000000000002000010000000000000002008000000000000000000000000000000100000000000000000000008000040000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x836689a359fb99ea44703d38acced8c9e5334095f15175eb59cf07e7c9f90a8e", + "transactionHash": "0xab1e4aa32139744ca4d5cf632442b871377f709270bfacbde870862140d490e5", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 692836, + "transactionHash": "0xab1e4aa32139744ca4d5cf632442b871377f709270bfacbde870862140d490e5", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x00000000000000000000000000000000000000000000000003081e530fbd0d18", + "logIndex": 0, + "blockHash": "0x836689a359fb99ea44703d38acced8c9e5334095f15175eb59cf07e7c9f90a8e" + }, + { + "transactionIndex": 0, + "blockNumber": 692836, + "transactionHash": "0xab1e4aa32139744ca4d5cf632442b871377f709270bfacbde870862140d490e5", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x01001411c6b0f1090cae21d868d011b826fd8baa1ca57835caece94b8f51d519", + "0x000000000000000000000000d38f4a9baeb461b124c1b462653363aafe0b3405" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x836689a359fb99ea44703d38acced8c9e5334095f15175eb59cf07e7c9f90a8e" + }, + { + "transactionIndex": 0, + "blockNumber": 692836, + "transactionHash": "0xab1e4aa32139744ca4d5cf632442b871377f709270bfacbde870862140d490e5", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3" + ], + "data": "0x00000000000000000000000000000000000000000000000001710049db1eac3e", + "logIndex": 2, + "blockHash": "0x836689a359fb99ea44703d38acced8c9e5334095f15175eb59cf07e7c9f90a8e" + } + ], + "blockNumber": 692836, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [ + "0x01e0ed991fF21f4366eEDd04A968029Bd6F8C61c", + "0x263D8f36Bb8d0d9526255E205868C26690b04B88" + ], + "numDeployments": 4, + "solcInputHash": "add2d99d454de06c8434504df96c7cdf", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "MagicSwapV2InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountADeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountBDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmounts", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExcessiveInputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientAAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientBAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientOutputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedNft", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityRemoved", + "type": "event" + }, + { + "inputs": [], + "name": "BURN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ONE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountADesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountTokenDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountMinted", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountIn", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountOut", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsOut", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveB", + "type": "uint256" + } + ], + "name": "quote", + "outputs": [ + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityETHWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapETHForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapETHForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactETHForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collectionIn", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountIn", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_collectionOut", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountOut", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapTokensForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "withdrawVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "errors": { + "MagicSwapV2WrongAmounts()": [ + { + "details": "Amounts does not match" + } + ], + "UnsupportedNft()": [ + { + "details": "Trying to interact with token that does not support ERC721 nor ERC1155" + } + ] + }, + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vault": "vault data of deposited NFTs" + } + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vault": "vault data of withdrawn NFTs" + } + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vaultA": "vault data of deposited NFTs for first side", + "vaultB": "vault data of deposited NFTs for second side" + } + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vaultA": "vault data of withdrawn NFTs for first side", + "vaultB": "vault data of withdrawn NFTs for second side" + } + } + }, + "kind": "dev", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountBDesired": "desired amount of token B to be added as liquidity", + "_amountBMin": "minimum amount of token B to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "desired amount of ETH to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountETH": "amount of ETH added as liquidity", + "amountToken": "amount of vault token added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "details": "All NFTs must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be deposited", + "_amountBMin": "minimum amount of token B to be deposited", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to deposit as liquidity for first side", + "_vaultB": "vault data for NFTs to deposit as liquidity for second side" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to deposit. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to deposit", + "_to": "address that gets ERC20 for deposited NFTs", + "_tokenId": "list of token IDs to deposit", + "_vault": "address of the vault where NFTs are deposited" + }, + "returns": { + "amountMinted": "amount of ERC20 minted for deposited NFTs" + } + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to Token B", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "minimum amount of ETH to be redeemed", + "_amountTokenMin": "minimum amount of vault token to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to ETH", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountETH": "amount of ETH redeemed", + "amountToken": "amount of vault token redeemed" + } + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "details": "Lp token must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to withdraw from liquidity for first side", + "_vaultB": "vault data for NFTs to withdraw from liquidity for second side" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "details": "Does not require any approvals. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for ETH. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to receive for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for ETH. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of ETH expected after swap", + "_collection": "list of NFT addresses to swap for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets ETH", + "_tokenId": "list of token IDs to swap for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "details": "All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn` as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.", + "params": { + "_amountIn": "list of input token amounts. For ERC721 amount is always 1.", + "_amountOut": "list of output token amounts. For ERC721 amount is always 1.", + "_collectionIn": "list of input NFT addresses", + "_collectionOut": "list of output NFT addresses", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenIdIn": "list of input token IDs", + "_tokenIdOut": "list of output token IDs" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for token. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of output token expected after swap", + "_collection": "list of NFT addresses to swap for token", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets output token", + "_tokenId": "list of token IDs to swap for token" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "ERC20 must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for tokens. For ERC721 amount is always 1.", + "_amountInMax": "maximum acceptable amount of token to swap for NFTs", + "_collection": "list of NFT addresses to receive for tokens", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for tokens" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "withdrawVault(address[],uint256[],uint256[],address,address)": { + "details": "Withdraw NFTs from vaultVault token must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to withdraw. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to withdraw", + "_to": "address that gets withdrawn NFTs", + "_tokenId": "list of token IDs to withdraw", + "_vault": "address of the vault to withdraw NFTs from" + }, + "returns": { + "amountBurned": "amount of ERC20 redeemed for NFTs" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is added" + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is removed" + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is added" + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is removed" + } + }, + "kind": "user", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and second ERC20 token" + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and ETH" + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using two NFT vaults" + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "notice": "Deposit NFTs to vault" + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ERC20 token" + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ETH" + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs" + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap ETH for NFTs" + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ETH" + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap NFTs for NFTs" + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ERC20" + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap ERC20 for NFTs" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Router/MagicSwapV2Router.sol": "MagicSwapV2Router" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Router/IMagicSwapV2Router.sol": { + "keccak256": "0xd732c1caf0c6ee7235d598a40962d976fabc7df0b934a634a41d6f188af3cfed", + "license": "MIT", + "urls": [ + "bzz-raw://8cb3f52ee7cb8dc911bb2a904a2d9dcd7cce3aec9f7b7009fa546d21d47df122", + "dweb:/ipfs/QmaAmpNUPYJUZzp53FNjd7S2ArbgYzHsJgskMRVanBtaMN" + ] + }, + "contracts/Router/MagicSwapV2Router.sol": { + "keccak256": "0x01703c4c6c84f9d5e90e4b073b2a2dfdcbc2d65a6dcee9f21f7d22c92cb1b323", + "license": "MIT", + "urls": [ + "bzz-raw://3364be39d2c97478e91c8ea2cdb6c88da68cb8e8e1efdb85621b07f1bd497206", + "dweb:/ipfs/Qmdq4yF5URhaWp574pA65HbrHcfL5bPZT4mTSqHyZ9TSBa" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "keccak256": "0xd8d0de3bc69be9bb5106a5d83f2d6ce2fb523d763b03f2986fce0d355fce6d2a", + "license": "MIT", + "urls": [ + "bzz-raw://bd591385f6f6f94f62c2b519663fa00933d8f2f7d462cea3145e896986e53564", + "dweb:/ipfs/QmRK4x93DxKuyDdgE5PAPWrJzVrQcnBGPiTdBhwKcXanZn" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "keccak256": "0x581635a3e35ab2ae2ce040810296921859b606e19a83f5277396f8b51cb548a1", + "license": "MIT", + "urls": [ + "bzz-raw://61e91d41aa083b0d41f1c30780efbc0259c0c717c122fc11b69ee249362b2330", + "dweb:/ipfs/QmdHsKrcno9mmXAj3zotSLQqX4K6BYFxxJuzxUBGAwVKzi" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "keccak256": "0xb96650151113d4a4224a66aba18c59560b6558375b7eda755abb73f5095c233f", + "license": "MIT", + "urls": [ + "bzz-raw://254aba5995bf05b6d8a1268a9bdbe7d02a86ff4f1cd32a4104977be7384d6c20", + "dweb:/ipfs/QmRNZX4Z8m7QkBvEEbAQhs85cM3wxQ6tNDpCjuoYipZ3zE" + ] + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "keccak256": "0xc8075f02390b9bc257755e15590b56a51e2db779350bfbb5f50ab5b6ebf2e9cc", + "license": "MIT", + "urls": [ + "bzz-raw://34ea022d70255fce6141d5eca24f81096ca371dc4a3297ebe13dd89dc6d119c5", + "dweb:/ipfs/QmXWJuuwv3S8ePZdJUbifD33VqjGng1kkbXk2bzmFcPjez" + ] + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "keccak256": "0xde862b35bbd7c6ac8dd071dc0cd38873bcdb2308a379d55644a38b7c15da4c2f", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://9ac966d3b2824a5edb1cd8dceb840d5c2ec7b4852abcc46d473717bc4454e4b9", + "dweb:/ipfs/QmchxPi4nwYPzKtzKrSCaDmVuXgBefAcRtDue9bdRNDV8M" + ] + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "keccak256": "0x5ee0167198ea9fed68ebac485044c13499f4f150b77f5efc3b1a62fca206e139", + "license": "MIT", + "urls": [ + "bzz-raw://82aba543e2d771da4a1a4a01e398dbf7d19787e58a58111b78db94e29b08d420", + "dweb:/ipfs/QmPTH7bqA2it5yKr9HFmLKNALbqgi4wyeJpSENRaWydLeP" + ] + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "keccak256": "0x8de86a2107f5956940cf287d1c90b9a688f3e7a5d44f5b6717e709a55b108a43", + "license": "MIT", + "urls": [ + "bzz-raw://b00290b028f8f31938800768ea34c884ac927d74aab1afff7f9d4817224a27d9", + "dweb:/ipfs/Qmf5BTBvuMm41d7w3yoKUqdBnVqWzg35woZ8FDFJZz9Lhy" + ] + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "keccak256": "0x6a5a5d9db122fcc44238ef4db84ad14eaaae76f8de6c346910e4bc5256264967", + "license": "MIT", + "urls": [ + "bzz-raw://3aa2456f2ae922dbf60f5e9538bd9822c6047f9367690015935ab2081b5b14fc", + "dweb:/ipfs/QmUghTFDpNF39QaQadagxvPFMXgeLdbXbQkDhEQKkP6BLj" + ] + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "keccak256": "0x21a451ee5a0399bf5fc55d77edb8aab7127282f61c543483291cdb1300b39e84", + "license": "MIT", + "urls": [ + "bzz-raw://d7f27429253159aca7974b4ac7b17b56a90edb0dfb834a9fd2bae89434e865e1", + "dweb:/ipfs/QmcuBKUVSyon4LF8VY4rG2pfPnnSer2GqV6AcoNDpKzso4" + ] + }, + "contracts/Vault/INftVault.sol": { + "keccak256": "0x1b55813c809306ff889c9a07ea9aae68a4267568b5d09226096779b2bc8f552c", + "license": "MIT", + "urls": [ + "bzz-raw://a890283e8f67d5c2d8ff78486e4d2c214587aac76dd941f5d0a3a7a1b02b2280", + "dweb:/ipfs/QmUBhfyiit6VHerjJGmQL2q9C3P3XiX1gjv97jVx37qn6v" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "keccak256": "0x6392f2cfe3a5ee802227fe7a2dfd47096d881aec89bddd214b35c5b46d3cd941", + "license": "MIT", + "urls": [ + "bzz-raw://bd9c47a375639888e726a99da718890ba16d17d7ad9eacb0ccc892d46d1b3ee0", + "dweb:/ipfs/Qmb41W5RUjy2sWg49A2rMnxekSeEk6SvGyJL5tyCCSr7un" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "keccak256": "0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329", + "license": "MIT", + "urls": [ + "bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95", + "dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238", + "license": "MIT", + "urls": [ + "bzz-raw://f5a7b96e511be78d5cdf635c784e6ab8cdd38625bb8cafb8a80914a1c89cf0f6", + "dweb:/ipfs/QmVzTCwJxQAkjRQHboT5QrvsVJGWQHgfEjeTbvyxoKBrds" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68", + "license": "MIT", + "urls": [ + "bzz-raw://daae589a9d6fa7e55f99f86c0a16796ca490f243fb3693632c3711c0646c1d56", + "dweb:/ipfs/QmR3zpd7wNw3rcUdekwiv6FYHJqksuTCXLVioTxu6Fbxk3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1", + "license": "MIT", + "urls": [ + "bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269", + "dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "license": "MIT", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f02000002000000000000000000000000000000000000000000000000000000000c4c34200345805f7a1300d43dbbc0eb4070e3a8f417a8cb5af65b71fae0886a", + "deployedBytecode": "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f02000002000000000000000000000000000000000000000000000000000000000c4c34200345805f7a1300d43dbbc0eb4070e3a8f417a8cb5af65b71fae0886a", + "devdoc": { + "errors": { + "MagicSwapV2WrongAmounts()": [ + { + "details": "Amounts does not match" + } + ], + "UnsupportedNft()": [ + { + "details": "Trying to interact with token that does not support ERC721 nor ERC1155" + } + ] + }, + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vault": "vault data of deposited NFTs" + } + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vault": "vault data of withdrawn NFTs" + } + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vaultA": "vault data of deposited NFTs for first side", + "vaultB": "vault data of deposited NFTs for second side" + } + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vaultA": "vault data of withdrawn NFTs for first side", + "vaultB": "vault data of withdrawn NFTs for second side" + } + } + }, + "kind": "dev", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountBDesired": "desired amount of token B to be added as liquidity", + "_amountBMin": "minimum amount of token B to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "desired amount of ETH to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountETH": "amount of ETH added as liquidity", + "amountToken": "amount of vault token added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "details": "All NFTs must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be deposited", + "_amountBMin": "minimum amount of token B to be deposited", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to deposit as liquidity for first side", + "_vaultB": "vault data for NFTs to deposit as liquidity for second side" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to deposit. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to deposit", + "_to": "address that gets ERC20 for deposited NFTs", + "_tokenId": "list of token IDs to deposit", + "_vault": "address of the vault where NFTs are deposited" + }, + "returns": { + "amountMinted": "amount of ERC20 minted for deposited NFTs" + } + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to Token B", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "minimum amount of ETH to be redeemed", + "_amountTokenMin": "minimum amount of vault token to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to ETH", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountETH": "amount of ETH redeemed", + "amountToken": "amount of vault token redeemed" + } + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "details": "Lp token must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to withdraw from liquidity for first side", + "_vaultB": "vault data for NFTs to withdraw from liquidity for second side" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "details": "Does not require any approvals. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for ETH. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to receive for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for ETH. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of ETH expected after swap", + "_collection": "list of NFT addresses to swap for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets ETH", + "_tokenId": "list of token IDs to swap for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "details": "All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn` as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.", + "params": { + "_amountIn": "list of input token amounts. For ERC721 amount is always 1.", + "_amountOut": "list of output token amounts. For ERC721 amount is always 1.", + "_collectionIn": "list of input NFT addresses", + "_collectionOut": "list of output NFT addresses", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenIdIn": "list of input token IDs", + "_tokenIdOut": "list of output token IDs" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for token. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of output token expected after swap", + "_collection": "list of NFT addresses to swap for token", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets output token", + "_tokenId": "list of token IDs to swap for token" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "ERC20 must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for tokens. For ERC721 amount is always 1.", + "_amountInMax": "maximum acceptable amount of token to swap for NFTs", + "_collection": "list of NFT addresses to receive for tokens", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for tokens" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "withdrawVault(address[],uint256[],uint256[],address,address)": { + "details": "Withdraw NFTs from vaultVault token must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to withdraw. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to withdraw", + "_to": "address that gets withdrawn NFTs", + "_tokenId": "list of token IDs to withdraw", + "_vault": "address of the vault to withdraw NFTs from" + }, + "returns": { + "amountBurned": "amount of ERC20 redeemed for NFTs" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is added" + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is removed" + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is added" + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is removed" + } + }, + "kind": "user", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and second ERC20 token" + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and ETH" + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using two NFT vaults" + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "notice": "Deposit NFTs to vault" + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ERC20 token" + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ETH" + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs" + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap ETH for NFTs" + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ETH" + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap NFTs for NFTs" + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ERC20" + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap ERC20 for NFTs" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + }, + "factoryDeps": [ + "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f02000002000000000000000000000000000000000000000000000000000000000c4c34200345805f7a1300d43dbbc0eb4070e3a8f417a8cb5af65b71fae0886a" + ] +} \ No newline at end of file diff --git a/deployments/treasureMainnet/NftVaultFactory.json b/deployments/treasureMainnet/NftVaultFactory.json new file mode 100644 index 0000000..31d0436 --- /dev/null +++ b/deployments/treasureMainnet/NftVaultFactory.json @@ -0,0 +1,1465 @@ +{ + "address": "0xdAfCFd04958F430D6e27d8085BDd573D7E4a73ef", + "abi": [ + { + "inputs": [], + "name": "VaultAlreadyDeployed", + "type": "error" + }, + { + "inputs": [], + "name": "VaultDoesNotExist", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": true, + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "vaultId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct INftVault.CollectionData[]", + "name": "collections", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "creator", + "type": "address" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllVaults", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getVaultAt", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVaultLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "hashVault", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVault", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "vaultHashMap", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "name": "vaultIdMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x39C6bF2F2360E993a5eD8E1A30edC01001af64f3", + "contractAddress": "0xdAfCFd04958F430D6e27d8085BDd573D7E4a73ef", + "transactionIndex": 0, + "gasUsed": "4980302", + "logsBloom": "0x00002000000400080000010000000000000000000000400000004000000000000000000000000000001000000001000000000000800000000000000000000000000100000004240000000028000040000400000000000000000000000000080000000000020100012000000000000a00000000000000400000000011000000000000001000000000000004000100000000000100000000000000400000000080804000800000100000000000c00100000000000100000000002000010000080000000002008000000000000000000000000010000100000000000000000020000000040000000000000000000010000000000040000000000000000080000000", + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad", + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x00000000000000000000000000000000000000000000000057bad36e978e2a4c", + "logIndex": 0, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002330000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e1bd1f27610f2baa553642133e750b104d6e7391d886170a43fe4992c31925b61", + "logIndex": 1, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x1bd1f27610f2baa553642133e750b104d6e7391d886170a43fe4992c31925b61" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000007272079100000000000000000000063201008041000006320010009c000000000101043b000000010020019018c318be0000040f000000c0011002100000000001000414000080100200003900000672011001c7000000000001004b000000000010043f000000200010043f00000dd20000613d00000dd20000213d00000dd20000c13d000000400100043d0000000000320435000018c500010430000000000101041a0000000000210435000005930000213d0000063202008041000006320020009c0000000001000019000000200030008c00000000010004160000000001010433000000000112019f0000004001100210000000000020043f0000066a0010009c00000dd20000413d000000000001042d0000069601000041000000040010043f0000069b010000410000000c02000029ffffffffffffffff000000000005004b0000002004000039000000c0022002100000000002000414000000400200043d00000044021000390000000401e003700000000004034019000000000021041b000006350010009c00000632033001970000006003300270000000000301001918c318b90000040f000000000004004b0000002402100039000000000021004b0000000c010000290000000008980436000000007907043c000000000202043b000000400010043f000017510000613d000000200000043f000000000701034f0000004002200210000000040010044300000000001004430000002003000039000000030300003900000020022000390000000b01000029000015400000613d0000000008020019000000000121019f000000000034004b00000637011001c700000003060000290000000502000029000000000003001f0000800d0200003900000000001404350000006402100039000018c40001042e000000000048004b000000000462001900000634063001980000001f0530018f0000066a01100197000000000002004b000005930000c13d0000000005000019000000000012004b0000000701000039000000010010008c0000010005500089000000000656022f00000000065601cf0000000006040433000000000200003900000de10000413d000000400060043f00000000020000190000000801000039000000000161019f00000000015101cf000000000151022f00000003055002100000006001100210000000090200002900000009010000390000000a0100003900000000010004120000000b020000290000000001000039000006350020009c000c00000001001d00000f820000213d0000002002100039000000000201041a000000000131019f000000400330021000000041010000390000000402100039000000040020008c0000000000120435000000000006004b0000000000650435000005fa0000013d000000440030008c0000000a030000290000070c0000013d000080050200003900000678011001c70000066e01000041000006320300004100000008010000290000000000310435000000000003004b0000067502000041000000000042043500000de00000613d0000000802000029000006350060009c000000000404043b00000000044e034f00000001010000390000002401e0037000000000005404350000000002020433000006350040009c000000000047004b00000021010000390000000102004039000000000300003100000004020000290000000007000019000000800010043f00000681011001c70000000a0200002900000000010004100000000a01000029000000000043043500000020033000390000066f0660019700000004042000390000002304200039000a00000001001d0000001f01100039000000000030043f0000002001100039000000000300001900000000000204350000001f01400039000b00000001001d000000000141034f0000000007870436000000006806043c000000000601034f00000020044001900000001f0540018f0000000002060019000006ad011001c7000000040060008c000000000071043500000024070000390000006004100039000300000001001d000006320060009c00000000001604350000000601000029000000600210018f000000000686019f0000000008050433000000030200002900000000010204330000000602000029000000000012041b0000000000ab043500000000000a004b0000002009900039000000400040043f00000dda0000a13d0000000201000039000008ea0000613d000006320030019d00008002020000390000067c011001c70000067b0100004100000004030000290000002004400039000000000035004b0000000006000019000000000606043b00000024022000390000002402e00370000000010220003900000007010000290000000100100190000000400600043d000000000031004b000015420000413d000000030100002900000002020000290000000201000029000011e70000213d000006af0010009c000006a604000041000000000100043d0000002404100039000000000001042f00000679040000410000000002320019000000600130021000000020010000390000000000340435000000800100043d00000000030304330000000c03000029000000000013004b000000200bb00039000000000707043b000000000301041a00000001011000390000067f011001c70000006002200210000000010330003900000007020000290000000004000019000000000041004b000008ea0000013d000000000052004b000000010070019000000001070040390000000007000039000000000076004b000000400700043d000000050540021000000000010004110000000005050433000006350050009c000006a801100197000000400020043f000018090000613d000017530000613d00000000010b04330000000001b2001900000000066701cf000000000767022f0000010006600089000000000868022f00000000086801cf0000000306600210000000000771034f000000000059004b0000000009a90436000000008a08043c00000000090b0019000000000801034f00000000057b001900000020074001900000001f0640018f00000000030b40190000063200b0009c00000000001b0435000000400b00043d000013230000613d0000123b0000613d0000000108000029000100000008001d00000f840000213d0000001101000039000000040160003900000024016000390000004401600039000100000001001d000000020200003900000024001004430000002400000443000000000161034f0000068a011001c700000004010000390000002001200039000006a902200167000006a90220027f0000000b03000029000000400400043d0000008004000039000000200200003900000000004504350000000601000039000000020300002900000676011001c70000066d010000410000000002030019000c00000003001d000000ff00100190000000ff0020019000000040020000390000000005250019000000000046043500000000066700190000003f06500039000000000605c019000006360040009c00000636060040410000063604400197000006360500804100000000062e034f000000050450021000000dd20000813d0000066a0020009c000000000301043b00000020055000390000001e03000039000006a403000041000000040030008c72616e736665722045524332303a20740200000200000000ffffffffffffffe0020000000000000000000000ffffffff0000186a0000613d0000000305000029000017540000413d0000000503000029000200000001001d000011c80000613d00000005088002100000000008000415000200000002001d00000ef50000213d00000697020000410000000101000029000100000002001d000300000006001d000000000102041a000000000121001900000000014300d9000000000401043b000000010110018f0000000101006039000000000200041000000696011001c7000000000058004b00000694011001c700000693010000410000069501000041000000400a00043d000500000003001d000a00000003001d000000000104043300000dd40000213d00000009010000290000001f02200039000000010440003900000000030000390000063203008041000006320030009c000000c401100039000000000563001900000000042300190000067d0100004100000022030000390000044c0000013d000000000c0c043b000000000b0000190000000000ba0435000b00000003001d00000000002304350000000102000039000000010100c039000006350070009c0000001f0010008c000c00000002001d000000000103001918c30e9a0000040f00000004011000390000068001000041000000000202041a0000000202100039000900000001001d0000006401e00370000000a40030008c18c3188b0000040f0000062d0000013d0000000406000029000000800050043f0000008006600039000006700060009c0000003f06400039000000000504043b000000840030008c000000000201043b000900000002001d0000004401e00370000005df0000013d000800000004001d000005d50000c13d0000000101002039000000000103041a0000000906000029000000000032004b0000000002010433000006360500404100000dd40000c13d000000240030008c45524332303a206145524332303a2062000000240000000000000044000000007fffffffffffffff0000002000000000000018280000013d0000066a01100198000017ac0000613d000300000005001d000400000006001d000017370000613d00000000005104350000066a05100197000600000003001d000000080010006c0000158f0000613d0000000603000029000600000004001d000015480000613d000015400000413d0000155b0000c13d0000155b0000213d000015530000613d0000066a012001970000135f0000613d000013230000413d000013250000c13d000013250000213d000000030b00002900030000000b001d0000000402b000390000002401b000390000000401b000390003000000000002000011ed0000213d000011e60000613d000011c80000013d000011800000013d000011c80000c13d0000000502800270000010ea0000013d000000000112016f0000001f0030008c000006ae0500004100060000000000020000000000cb004b00000f820000c13d000000000cb4034f00000f840000c13d00000f820000413d0000000104000367000006880010009c000000000303043b000006a8022001970000067e020000410000069a02000041000006840300004100000683030000410000002103000039000006860300004100000685030000410000001f03000039000006990300004100000682040000410000004001600210000006320600804100000020016000390000000003064019000000c402600039000000a4026000390000006401600039000000a00200003900000084016000390000000002064019000006320200004100000daf0000613d000000010010006b000000000021001a00000003030000290000000c0010006c000400000002001d00000de10000c13d0000069804000041000000000032001a000000010330008a0000000001a2001900000000040a001900000000067601cf000000000676022f0000010007700089000000000878022f00000000087801cf0000000307700210000000000661034f0000001f0740019000000000080a001900000000056a0019000000200640019000000000030a40190000063200a0009c0000000401a0003900000000001a0435000000500000613d000600000001001d00000e080000613d0000000003020019000000000023004b000000000131001900000080031000390000006003100039000006aa02200197000000000040043f000000000041041b0000000001030433000000010020008c000700000001001d0000000003010433000000a0011000390000000000ab004b000000010bb00039000000000c090433000000a002200039000000000a09043300000000090904330000006009900039000000010a00c039000000000a000039000000000a0a0433000000400a900039000000000b0b04330000066a0aa0019700000000ba0904340000002008800039000000600990008a0000000c04000029000000000223016f000000f80220018f0000000302200210000000000051041b0000000c0600002900000000043100190000000503300270000000010320008a0000000100300190000000010300403900000000043404360000069c040000410000000002210019000c00000004001d0000069e030000410000069d03000041000000090000006b00000003024002100000002403000039000006a0030000410000069f030000410000000c0000006b0000000000a9004b0000063500c0009c000000000d000039000000000008004b000000000a000019000006350090009c000000000909043b0000000100b0008c000000000b0b043b000000000a0a043b000000000a9e034f000000000074043500000009040000290000000000240435000000010200c039000000020110003900000000012100490000066c011001c7000006700040009c000006170000013d000000a005200039000000000403041a000006170000413d000000020020008c0000000100600190000000000662013f0000000106002039000000000600003900000000010460190000007f0410018f00000001012002700000000105200190000000000203041a0000000105500039000000800300043d0000000002210436000000200020043f000000800400043d000000000045004b000000a004400039000700000000001d00000002060000290000000604000029000000060600002918c310010000040f000000250300003918c30ee30000040f0000008401e00370000000000026004b00000000066200190000066f062001970000002401100039000007860000613d0000000b0000006b0000070a0000c13d18c318330000040f000800000000001d000000800200043d00000000042e034f0000006402e00370000000000064043500000007060000290000004402e00370000000000042004b0000066a0060009c0000008005000039000000000424001900000000040004150000004403000039000080050100003918c317bf0000040f0000066a02200197000000200200008a000000000002041b0000000002230019000000000113001900000005011002700000000002004019000000050220027000000008040000290000000000010435000900000003001d000000400030043f000006350030009c000006a803300197000006360020009c00000636022001970000001f024000390000000007070433000000000065004b0000000005010433000000c001100039000006910000013d0000008002000039000200000000000274e8b5266c15b4f4ecbe7936dc58d5060222227178cfff6121075256c6208e4b207a65726f20616466726f6d20746865647265737300000065726f2061646472746f20746865207a65737300000000007863656564732062616d6f756e742065616c616e63650000520b404e00000000185e917c00000000d9b67a260000000080ac58cd00000000ffffffffffffff9fffffffff000000000000000000007530ffffffffffffffa00000000000000001ffffffffffffff004e2312e00000000001ffc9a7000000006e74206b657900006f6e6578697374656c654d61703a206e456e756d657261625e2516446f71f85b69c3395a3b0502d0f959f8c92f12db28c2575a0e9e593c00150b7a020000000077616e6365000000656e7420616c6c6f6e7375666669636945524332303a20697a65726f20616464726f6d20746865207070726f766520667265737300000000726f2061646472656f20746865207a657070726f7665207473730000000000005b200ac8c7c3b925dd0314c0f7b2291ed14f71427d1e84f38c5be1e5ebec7d5b4e487b7100000000edcb51b10000000061646472657373006865207a65726f20696e7420746f207445524332303a206d84754544f4c709d7997762752e3a09523ad067ef1ee35ce4dcbc1c05240f31ff49986e73000000006352211e0000000000fdd58e000000008004ef9a0000000090f22bf1000000007c4ef3dc00000000403b2b6700000000baece7f7773c34176bbff8cb8233491f9b8a6d039632aa572ebca503d1d89988841a60c0c883f2c13fb0c1037d551236ad726df49aeea3e909addddcec1d7ba633195adc0000000099b777de000000005daa87a000000000af1ad76e000000006f2061646472657320746865207a657275726e2066726f6d730000000000000064732062616c616e6e7420657863656575726e20616d6f75636500000000000057c710a59a2cb567182111d630394f0c7bc2a656f546ab9ef341246adaac6f49000000640000000042842e0e000000000000000400000000545c577100000000f242432a00000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf265ffffffffffffffdf28f55a4df523b3ef952ba7f163c4a11669c2b068fc378daaddf252ad1be2c89bb64bfe7fe36bd19b8e8600b4aa8c65c639ae7d344fd709f28a35acfbc15ff81a000000840000000008c379a00000000063652062656c6f7720616c6c6f77616e656372656173656445524332303a2064207a65726f0000000000004000000000bc197c8100000000ffffffffffffff7fab882de59d99a32eff553aecb10793d015d089f94afb7896310ab089e4439a4c0000002000000080f23a6e61000000000000000006d81bf40000000001ffc9a700000000095ea7b30000000006fdde030000000006fdde0200000000139f1144000000000c7056b80000000018160ddd00000000150b7a0200000000150b7a01000000000c7056b70000000023b872dd0000000020e8c565000000003950935100000000313ce56700000000313ce566000000004c4c45de000000003a51f3830000000070a082310000000056359baa0000000056359ba9000000003a51f3820000000020e8c564000000007cc25370000000007bfe950c000000007ddc2cd1000000007ccc2ec2000000007ccc2ec1000000008b878cb20000000086937eb4000000009ac246870000000095d89b410000000095d89b400000000086937eb300000000a9059cbb00000000a457c2d700000000bc197c8100000000b58d775000000000b58d774f00000000cbf1304d00000000c2ee3a0800000000f23a6e6100000000dd62ed3e00000000dd62ed3d00000000c2ee3a0700000000a457c2d6000000007bfe950b000000c00000010000000002000000000ddd2935029d80000de0b6b3a7640000800000000000000000000000ffffffe000000001ffffffe0000018c300000432000018c100210423000018bc00210421000018b80000613d0000000002050019000006bb011001c7000018a30000413d000000000121043a00000000020200310000000502400270000000000020044300000000050100190000189e0000613d0000187f0000013d0000000105000029000018760000613d0003066a0020019c000200000003001d0000186c0000613d0000002603000039000006b603000041000006b5030000410000002303000039000006b803000041000006b703000041000006ba03000041000006b90300004100000001020000290000181f0000413d0001000400100074000018150000613d0002066a0020019c0000180b0000613d000400000003001d0004000000000002000017b90000613d000017a80000c13d000017760000013d0000179a0000013d00000005010000290000175d0000213d000017a00000613d00000007030000290000000002120019000017100000413d0000000007830019000017170000613d00000002080000290000175d0000813d000006b40020009c000017ac0000013d000016d70000c13d000017370000c13d000017980000c13d000017870000613d000017810000c13d000016dc0000613d0000000405000029000000000013041b000000020300003900000004010000290000176d0000413d0002000600100074000017630000613d0000163c0000413d000000060230006b000200000004001d0000163c0000c13d0000066a02100197000017540000c13d000015fb0000613d00000008034000b9000000080220006c0000175a0000413d0000175a0000613d00080000000000020000159c0000613d0000158b0000c13d0000158f0000013d0000157f0000c13d0000156d0000013d000015550000013d00000005060000290000000001410019000000000041001a0000154c0000613d000000000414004b000015130000213d000000030010006b000000040110006b000400000005001d000015130000613d000015420000c13d00000000015400d9000014f20000613d00000000042500a9000000000501043b000500000005001d0000066a05200197000015490000813d000015400000213d000015840000613d000014860000613d000014750000c13d000014790000613d000000020b00002900020000000b001d000014a00000013d000000020110006c000015780000613d000014470000613d000014360000c13d0000143a0000613d000000010b00002900010000000b001d0000144a0000013d0000141e0000c13d000014890000013d0000145d0000c13d0000149f0000c13d000000020000006b000015670000613d000015610000c13d0000140b0000613d000013b90000c13d000013970000c13d000400000004001d0000136c0000613d0000135b0000c13d0000135f0000013d0000134f0000c13d000013230000213d000013540000613d0000130a0000613d000012f90000c13d000012fd0000613d000013420000413d000000010110006c000013480000613d000012cd0000613d000012bc0000c13d000012c00000613d000012d00000013d000012a40000c13d0000130d0000013d000012e10000c13d000013210000c13d000000010000006b000013310000613d0000132b0000c13d000012910000613d000000ff0110018f000012290000613d000000ff011001900000000201200039000012390000613d000012160000c13d000006b302000041000011e30000613d000011dd0000013d000006b202000041000011ed0000813d000000020010008c000011e30000c13d000011d50000613d0000000000020032000011c80000413d000000000200043d000011bc0000613d000011ab0000c13d000011af0000613d000011c50000813d000011940000c13d000006b1050000410000117f0000c13d000011710000613d0000115f0000c13d000011630000613d000010fd0000813d0000113d0000613d0000112b0000c13d0000112f0000613d000011480000c13d000011460000413d000011140000c13d00000024051000390000000102100195000010b10000813d000010e80000613d000010de0000613d000010cc0000c13d000010d00000613d000010e60000413d000010b50000c13d000006b005000041000500010000003d000000050880008a0000109f0000013d000010ec0000c13d000400010000603d000400000000003d000000040880008a0000109a0000613d000010880000613d000010770000c13d0000107b0000613d000010ec0000013d000600000000003d000000060880008a000010920000013d000010610000c13d0000105c0000613d0000105c0000413d0000105b0000613d000010400000613d0000102f0000c13d000010330000613d0000105c0000013d000010480000813d000010190000c13d000011e70000813d000006ac0010009c000006a603000041000000000601001900000fff0000613d000000400130021000000ff90000c13d000000010040019000000ff90000213d000000010400403900000000040000390000000001240019000006a804100197000000200410008a000000000124004900000fa90000013d00000fca0000413d0000000004c4043600000fa90000613d000000800b40003900000000007a0435000000600a400039000000400b40003900000ff30000813d0000000200b0008c000000000aa4043600000000090104330000000006960436000000000924004900000fd10000813d000000010880003900000fac0000013d0000000008000019000000800700003900000fd10000613d000000000446001900000060062000390000004004200039000000200320003900000f980000613d000000000102001900000f1e0000013d00000f780000413d0000000000ed0435000000200dd00039000000000e0e043b000000000eb4034f000000000d0a001900000f1e0000813d00000000001c004b000000000cbd0019000000440bb000390000000000ca04350000004000e0043f0000000100f001900000063500e0009c000000010f004039000000000f0000390000000000ae004b000000000eea00190000066f0ea001970000003f0ad00039000000050dc00210000000000c0a043b000000000aa4034f000000240ab00039000000000a0cc0190000063600e0009c000006360a0040410000000000da004b000000000eda013f000006360d100197000006360aa00197000006360c008041000000000c00001900000000001a004b000000430ab00039000000000bab00190000063500b0009c000000000bb4034f0000000000cd0435000000400d9000390000000000dc004b000000010d00c03900000000000c004b0000000000dc04350000000100d0008c000000000d0d043b000000000db4034f000000000cc904360000066a00c0009c000000240ba000390000004000b0043f000000800b900039000006700090009c000000400900043d000000800090008c000006880090009c0000000009a30049000000000a590019000000000964034f00000f800000813d00000020066000390000000000980435000000600b90003900000f250000013d00000f800000613d000000000017004b0000000007760019000000240650003900000000008204350000000100900190000000010900403900000000090000390000003f02700039000000050780021000000f840000813d000006ab0080009c000000000802043b000000000224034f000000040250003900000f820000813d0000002302500039000000000502043b0000000402400370000000240310008c000000640440037000000044034003700000002402400370000000040140037000000ef50000a13d000000830010008c0000000001340019000000000262019f00000000025201cf000000000252022f00000000060104330000000305600210000000000252034f00000ed80000613d00000ec70000c13d000000000018004b0000000008040019000000000702034f00000ecb0000613d00000000015400190000001f0630018f000006a805300198000000000215034f00000ee10000213d000000000027004b0000000007310019000000400070043f00000edb0000c13d000000010080019000000edb0000213d000000010800403900000000080000390000000007740019000006a8074001970000003f04400039000006a8044001970000001f0430003900000edb0000813d000006ab0030009c000000000315034f000000010500036700000ee10000613d000000000304c019000006360060009c0000063603002041000000000053004b000000000653013f0000063603300197000006360520019700000636040040410000001f0310003900000e940000c13d00000e940000213d00000000011200190000000000030435000000000321001900000e7b0000413d000000000024004b00000000060604330000000006430019000000000514001900000e820000613d00000040011000390000000032020434000000000431043600000e660000413d0000000001510436000000000502043300000e6c0000613d0000000003020433000000a0041000390000006002200039000000010300c0390000004003200039000000400410003900000e6d0000813d000000020030008c00000000030504330000066a044001970000000054020434000000000331043600000e440000c13d00000691020000410000068b0200004100000e320000c13d00000e250000c13d00000e180000c13d0000068c02000041000007270000013d0000068f0200004100000690020000410000003201000039000005010000013d00000c1f0000413d000700070020002d000000070020002a0000000b06000029000000050500002900000e2a0000613d00000d8a0000413d000000000573001900000d910000613d00000003070000290000067a0020009c00000e1d0000013d00000daf0000c13d00000e0b0000c13d00000d570000613d0000000805000029000000000131004900000e010000413d0003000a0010007400000df70000613d00000cc60000413d000300000002001d0000000a0230006b000300000004001d00000cc50000c13d00000c870000613d0000000c034000b90000000c0220006c00000ded0000413d00000006011000290000066a0320019700000ded0000613d000000000331001900000005022002100008066a0010019b0005066a0010019b0000024a0000013d00000a360000413d000800080020002d000000080020002a000000000031001a00000df00000613d000000000313004b00000be20000213d0000000a0010006b0000000b0110006b000b00000004001d00000be20000613d00000bc30000613d00000000032400a9000000090500002900000ded0000813d00000e3d0000613d00000b590000613d00000b480000c13d00000b4c0000613d000000060a00002900060000000a001d00000b740000013d000000060110006c00000e110000613d00000b1a0000613d00000b090000c13d00000b0d0000613d000000020a00002900020000000a001d00000b1d0000013d00000af20000c13d0000002401a0003900000b5c0000013d00000b310000c13d00000b730000c13d000000060000006b00000ae00000613d00000a8e0000c13d00000a6c0000c13d000000000132001900000007012000290000066a0410019700000005013002100003066a0010019b0009066a0010019b000008ff0000013d000009bb0000413d0000000901100029000000000031041b00000001022001bf00000dea0000c13d00000de70000413d000000050330021000000e3a0000613d000008ff0000c13d0000068e0400004100000001030000390000000002130049000009950000413d000000000363043600000000060204330000099b0000613d000000c0031000390000000004020433000000a00310003900000040031000390000066a03300197000000010220c1bf0000000a0000006b0000000a040000290000068d0110009a000000000043041b0000000603000039000000010410003900000e0e0000c13d0000002001300039000600000002001d00000e370000c13d000009110000613d000000600430003900000040013000390000000501200210000008760000813d000009040000013d000008f70000613d000008e60000c13d000008b60000013d000008d70000413d0000000002c20436000008b60000613d000000800b20003900000000006a0435000000600a200039000000400b200039000000000aa20436000000000908043300000000059504360000000009420049000008500000813d000000000037004b0000000107700039000008b90000013d000000000806001900000080060000390000063a0100004100000120001004430000010000100443000001a000200443000001800010044300000160001004430000014000000443000000a00020043f00000639020000410000063801000041000000040200003900000001022002100000000a033000290000089e0000813d0000000c0020006c0000088c0000c13d0000000a060000290000063d0000013d0000068901000041000008a10000013d0000000101400210000000000221016f0000087d0000613d000008fd0000c13d000000050200003900000000020404330000000002430019000006a803200197000000200320008a0000000002420049000008b20000c13d00000000025200190000000502300210000000600540003900000040024000390000002001400039000008840000c13d0000063c0000613d000008930000013d000008860000c13d0000000c02200180000008780000a13d000008250000413d000008290000813d0000001f02300039000008290000413d000000200010008c000000000121013f00000001020020390000001f0020008c000b00000002001d0000007f0220618f0000000102100270000000030200003900000001011001bf00000001011002100000000c03300029000007f40000813d000000080020006c000007e20000c13d0000061e0000013d18c30e490000040f00000060012000390000000c01200029000006a8021001970000000c0140006a000007c20000413d0000000b0500002900000dd20000013d0000016e0000c13d0000000c05000029000008de0000613d000007630000413d0000076a0000613d0000000806000029000000c402400039000000a4024000390000000402400039000000240140003900000044014000390000006402400039000000a003000039000000840240003900000001011003670000008401000039000800000001001d0000067a0010009c0000078d0000c13d000007f70000013d0000000102400210000000000121016f000007170000613d000000080000006b00000687020000410000071f0000c13d0000069e0000013d000006f60000413d0000000000cb0435000000000c9e034f000000000b0800190000069e0000813d00000000003a004b000000000a9b001900000044099000390000000000a804350000004000c0043f0000000100d00190000000010d00403900000000008c004b000000000cc80019000000400800043d0000066f0c8001970000003f08b00039000000050ba002100000063500a0009c000000000a08043b00000000088e034f000000240890003900000000000b004b000000000b0ac019000006360080009c000006360b0040410000063608800197000006360a008041000000000038004b0000004308900039000000000989001900000000099e034f000000400b7000390000000000ba004b000000010b00c039000000000b000039000000000b9e034f000000000aa704360000066a00a0009c0000002409800039000000400090043f0000008009700039000006700070009c000000800070008c000006880070009c0000000007810049000000000827001900000000075e034f0000083d0000813d00000000008904350000006009700039000006a50000013d0000001d03000039000006a103000041000006fe0000813d0008000a00100074000007c80000013d000007be0000c13d0000000002320436000a00000004001d00000020024000390000004003400039000000800240003900000040014002100000063204008041000006320040009c00000692010000410000069c0000c13d000000000007004b000000000036004b00000000065600190000002405200039000000800070043f000000800440003918c30e730000040f18c30e880000040f0000008001000039000006100000413d00000677030000410000000002006039000000a00010043f000006aa012001970000060a0000c13d000000400120021018c30f8a0000040f0000002201000039000006010000613d0000000403000039000006a20100004118c311f30000040f0000001201000039000006330000a13d0000066f044001970000003f046000390000000506700210000000000704043b0000000402e003700000000002000416000000240130008c000005750000413d000006a303000041000006040000613d18c318a00000040f0000066e0200004100000005044002100000000e0440008a000d00000000003d000e00000001001d00000000021200490000053d0000413d00000000026204360000066a06600197000005440000613d0000004002100039000005230000413d000000000043004b000000a00550003900000005053002100000066a04500197000000000050043f000000000505041a0000068d0530009a0000000802000039000005330000613d000005190000c13d0000000005650436000000003603043c000000a00500003900000000033e034f0000051d0000613d0000001f0240018f0000008002200039000006700020009c0000066f022001970000003f02400039000000050410021000000c1a0000c13d000004f60000413d000004fd0000613d000200000007001d000004c30000413d000004ca0000613d000600000007001d0000048e0000413d000004970000613d000000010030008c000000000302043b00000674030000410000067303000041000006280000813d0000000b0310006c18c313720000040f18c315a20000040f000000800020043f00000001022061bf000006a70010009c0000000102006039000006a60010009c000006a5001001980000066b01000041000006400010009c000005e30000613d0000063f0010009c000006570010009c000005db0000613d000006560010009c18c30f9a0000040f18c30ef70000040f0000064b0010009c000005c60000613d0000064a0010009c000006620010009c000005b00000613d000006610010009c0000067101000041000003a80000413d000000000051004b00000000041e034f000003af0000613d00000000051500190000003f02500039000000000402043b00000000022e034f000000000504c01900000636040080410000002302100039000003780000413d0000000000520435000000000505043b00000000051e034f0000037f0000613d000000000414001900000004041000390000002304100039000006450010009c000005a00000613d000006440010009c000006280000013d0000000003120019000000000012001a000000010220036700000024020000390000065c0010009c000005990000613d0000065b0010009c000003170000c13d000007860000c13d0000000402300039000000000013043500000024013000390000004401300039000000400300043d0000072b0000c13d000002db0000613d000002b90000c13d000006500010009c0000057d0000613d0000064f0010009c000006670010009c0000055d0000613d000006660010009c000003dd0000013d00000024022003700000000c0200035f000c0000000e0353000006420010009c0000054d0000613d000006410010009c000003df0000213d0000063e0010009c00000a310000c13d0000023f0000413d000002460000613d000400000007001d0000020c0000413d0000000704000029000002130000613d000700000007001d000001d70000413d000001e00000613d000006590010009c000005040000613d000006580010009c000003cc0000213d000006550010009c000005570000013d000000100440008a000f00200000003d001000000001001d0000064d0010009c0000046a0000613d0000064c0010009c000003c10000213d000006490010009c18c3123d0000040f000006640010009c000004570000613d000006630010009c000003b80000213d000006600010009c0000027c0000013d000006470010009c000004180000613d000006460010009c0000034d0000213d000006430010009c0000024d0000213d0000063d0010009c0000062b0000013d000006890000c13d000006a90010009c0000000002000411000000640030008c0000065e0010009c000004110000613d0000065d0010009c0000031c0000213d0000065a0010009c000001ad0000213d000006540010009c0000000501000039000006520010009c0000040a0000613d000006510010009c0000027e0000213d0000064e0010009c0000019c0000213d000006480010009c000001730000213d0000063c0010009c000007e90000013d000007dc0000c13d0000000802200180000007120000a13d0000001f0040008c0000010f0000413d000001130000813d000000200040008c000001130000413d000000200050008c000700000005001d0000001f0050008c0000007f0550618f0000000105100270000000010210019000000000040104330000000a01200029000000db0000413d00000000053100190000000004160019000000e20000613d000000000014004b0000000004320019000000e0034000390000000003260436000a00000006001d000000010050019000000001050040390000000005000039000000000063004b00000000033600190000003f033000390000001f03200039000000c002400039000000000503c0190000063603008041000000e00400043d0000000c02200029000000a50000413d000000000025004b000000000076043500000000074500190000000006580019000000ac0000613d0000000b08000029000000000015004b0000000005420019000000e004400039000b00000005001d0000000005260436000c00000006001d000000400050043f000000c001300039000000010100403900000000051600190000003f011000390000001f01200039000000c001400039000000000502c019000006360010009c00000636011001970000063602008041000000c00400043d000000400030008c000000000252019f00000000024201cf000000000242022f0000010004400089000000000545022f00000000054501cf000000030440021000000000025e034f000000760000613d000000650000c13d0000000002720436000000006706043c00000000060e034f000000690000613d000000c00150003900000634053001980000001f0430018f00000633011001970000001f01300039000000c002000039000006430000c13d000006430000613d000000e00010043f0000006001000039000000c00000043f000000a00000043f000000800000043f0000010001000039000006690010009c000003f90000613d000006680010009c0000026b0000213d000006650010009c000001890000213d0000065f0010009c000001340000213d000006530010009c000001250000213d0000063b0010009c000000e00110027000000000010e043b000000570000c13d0000063203100197000000600110027000000000010e001900010000000e0355000000000e01034f001000000000000202a70790078f078e078d078c078b0004078a02a60105014f00200789078807870786078507840783078207810780077f077e077d000f01aa0020001a000a000f002d00030073001f000e077c003c077b077a0779077807770038000b0066000c00070002000100060009000800050004000d00030013005d0776000a01a900ad005c000c00070002000100060009000800050004000d00030013000a004607750010002c014e00110036014d02a507740105001a000a000f0773077202a4003c07710770076f076e076d076c076b005b076a003507690768076702a307660765003b0764076307620761001407600020075f0095000e00ac00db0065075e075d000a005a01a8075c075b0027000f075a01a700720015075901040758010400da075702a2007107560103001500d90059075507540753075207510750074f074e000e0058074d074c005a074b074a02a10749014c074807470746004500ab07450095000e02a001a600aa0744029f0058005a01a8029e07430027000f07420094007200150741029d0740029d00da073f073e073d073c029c0015073b0059029b073a0739029a073807370736000e005801a507350018073407330102009300a900370732073100a902990038073000950015004401a4072f072e072d072c007101a3005b01a2072b072a01a1072900a80007000200010006004b000800050004000d029802a0029707280296014b00d800a7029502940293005b00440727029200d7005b07260725072400a80007000200010006004b000800050004000d0291072300030722004307210720071f071e071d071c071b071a07190718000f001a000a000f071701a00716071507140713071207110710000f070f0020001a000a000f002d00030073001f000e0092000300ad001f000e019f000300a60038000b0091000c00070002000100060009000800050004000d0003070e0290019e001e000c00070002000100060009000800050004000d00030013070d070c003800700081028f070b070a070907080707070607050704000f00800020001a000a000f002d019d014a000e0092014b0101028f070307020701070006ff06fe000f00800020001a000a000f002d0003001f000e00d6003b06fd007f06fc06fb06fa06f906f8000f001a000a000f006f06f706f6028e028d028c06f506f406f306f206f106f006ef000f019c0020001a000a000f002d0003001f000e00d6003b0072000e00a5004a014900a40090019b010300150148019a00a30199001501980064019700d5028b004a000e002706ee028a014700d40289000e014c007e0045028806ed0287003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff014006ec00fe00fd00fc008e001500fb005900640286013f00d5013e00d2000e003506eb06ea014700d400d10285004500fa06e90284003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff014006e800fe00fd00fc008e001500fb005900640196013f00d5013e00d2000e003506e700d00283008f00a200a1004500fa06e602820058028106e50010008d019506e406e306e206e106e0000f00800020001a000a000f002d0003001f000e000b006e000c013d001806df019406de06dd003b001e000c0018013d06dc06db06da06d9000f00800020001a000a000f002d019d014a000e0092014b010102800091007f06d806d706d6000f01930020001a000a000f002d00030073001f000e0092000300ad005d000e019f000300a6001f000e01920003019100a0000b0066000c00070002000100060009000800050004000d00030013000a06d5005c000c00070002000100060009000800050004000d00030013000a06d400a0000b006d000c00070002000100060009000800050004000d00030190018f013c027f006c001e000c00070002000100060009000800050004000d00030013013b027f027e06d300cf004200a00041000700020001000600ce00cd00050004008c0003000a000d06d206d1006c001406d000250014018e06cf009f0057013a06ce007c0007009e007b027d00250017001600400002000100060049009d009e00340033003200cc000406cd003100560055002b005400cb003f0048003a0039005306cc00f906cb06ca06c9000f00800020001a000a000f002d00030073001f000e0101000b0091000c00070002000100060009000800050004000d00030025001e000c00070002000100060009000800050004000d0003001306c806c7003b06c6006306c506c406c306c206c1000f01930020001a000a000f002d0003001f000e00920003001f000e019f00030030000e06c0004a014906bf0090019b010300150148019a00a301990015019800640197027c06be004a000e002706bd06bc06bb004506ba00a900f806b9019200030030000e06b801a600f706b7029f0058005a01a8029e06b60027000f007a06b506b400950015010006b3027b002b027a027900fd00fc008e001500fb00590064008b027c06b200d2000e003506b106b0008f0045008b00a906af06ae027800030030000e018d0139018c06ad007f06ac06ab06aa000f001a000a000f00ca01a006a906a806a7000f001a000a000f018b06a606a5007f06a406a306a2000f01aa0020001a000a000f002d0003001f000e000b003e013d0018019401a006a106a0069f000f01930020001a000a000f002d0003001f000e00920003001f000e027800030030000e018d0139018c069e007f01aa0020001a000a000f002d0003069d000f069c0062069b069a0699069801380052001a000a000f018b02770697007f001a000a000f018b02770696007f00800020001a000a000f002d00030073001f000e0092000300ad0101000b0091000c00070002000100060009000800050004000d00030025001e000c00070002000100060009000800050004000d00030013069506940010005106930011002c06920011003602760011008a0014007a0043001100020001001d0137001200800020001a000a000f002d0003001f000e00d6069101390690000e018a0275001000250195019c0020001a000a000f002d0003001f000e00d6003b0072000e00a5004a014900a40090019b010300150148019a00a30199001501980064019700d5028b004a000e0027068f028a014700d40289000e014c007e00450288068e0287003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff0140068d00fe00fd00fc008e001500fb005900640274013f00d5013e00d2000e0035068c0273014700d400d10285004500fa068b0284003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff0140068a00fe00fd00fc008e001500fb005900640272013f00d5013e00d2000e0035068901360283008f00a200a1004500fa06880282005802710687001000f60195001a000a000f01350013003000150686068506840683001506820105009c068100350680067f0270067e067d067c026f067b0058026e0035067a067900aa00db00c9067806770676026d004a00c9067506740673013400f5026e0672067100100133026c026b001106700089066f0132005a00d10061066e066d026a00d2066c066b0017001600f400020001001d001c0052001a000a000f006f066a0669028e028d028c0668066706660665009c01380052001a000a000f0044026902680267026602650189026402630262026101a2009c0027066400a802600065025f06630065025e025d013400f50045005b0662025c0661002006600058000f065f003b0072000e00a5004a014900a40090065e01880015065d065c065b025b065a0024000b0079002300220012001a000a000f0659009c0138005200800020001a000a000f002d0003001f000e00d6003b0658000a00710187007f019c0020001a000a000f002d0003001f000e00920003001f000e019200030030000e018d0139018c0657007f001a000a000f0656026902680267026602650189026402630262026106550024000b0654002300220012001a000a000f01350013009c0138005200800020001a000a000f002d0003001f000e00d6003b018a014a000e000b0091000c013d00180194002506530013002b007c001700160652025a0052009c002706510650064f00350133064e025c00a802600065025f064d0065025e025d013400f50045005b064c0045064b064a0010007302a606490025025900020001006b0017001600400049005201010025028000100186001400020001001d025a0052064800c80647064606450644000e06430642064100500640063f063e00f3001200ad0038000b006d000c00070002000100060009000800050004000d00030258001300a60038000b006d000c00070002000100060009000800050004000d0131025b0015009e013c0003063d010500620257063c0185063b013000110025063a025600f200f1002b018a01840639019e000b0007000200010006004b000800050004000d027e063802550637063606350010002c06340011003606330011008a0014007a0043001100020001001d009d00120132063200d1063106300254014c02a2062f062e00f00188000e062d062c062b000e062a002000ff06290015062806270626025302520625000e062400c7062302510250000e018300c70253025200c6062206210620000f061f00c500c7061e024f024e000e061d061c061b024d061a0619024c01820618061706160615000f061406130612061100150610060f060e060d060c060b024b060a024a00150609005906080607060606050604000e0249060306020601018100ef060000c7024905ff05fe024805fd0010005102470011002c02460011003602450180001005fc001400020001001d00f3001205fb001805fa0046001b02980244012f012e05f905f8004905f7024305f60010005102420011002c024100110036017f0180001000ad05f500150070012d05f4003c00ab00cf004200a00041000700020001000600ce00cd00050004008c0003000a000d0131017e005005f305f2000305f105f0001105ef007c05ee006c001405ed00250014009f005705ec007c0046001b05eb007c024005ea000a05e905e800aa017d017c0102009300a200ee05e7023f00ab002a0081014f027d00a70104017b00020001006b00ed017a017900780077001700160029001c009e00340033003200cc000405e60038003000150038003c001800520038000b0091000c00070002000100060009000800050004000d0003006c001e000c00070002000100060009000800050004000d0003008d002f0010001400020001001d002a001700160029001c004b004f0044023e05e501a50034000405e405e300030065025505e200f1023d00f200d700fa05e105e000a705df05de00370178023c0030009e0015023b0059003c05dd00ed00880010007305dc05db023a02390238004301770237017c0102023600a200f200f805da05d905d8008d02350234012f012e05d700ec0233002f008705d605d505d400c400a0001b007300300015012c001300d905d305d205d105d0006205cf05ce00d901a2004605cd05cc012c000b0007000200010006004b000800050004000d00ed05cb029700190296014b004600a7029502940293005b05ca029200d7005b05c90038018905c8012c000b0007000200010006004b000800050004000d029105c7000305c6004305c5013100eb000a05c401350013000a05c305c20133001405c1026b001105c005bf05be008905bd05bc05bb00ea017605ba05b901a60178023c00720015023b0059010500020001001d05b80017001600f4001c002a001700160029001c012b000800050004000d000305b700c400eb000a05b6001800520248001805b50175001b02320244012f012e05b405b305b205b105b0023a023902380043017705af017c0102023600a200f200f805ae05ad05ac002502350234012f012e05ab00ec0233002f0091002505aa001c05a900c405a8009c05a705a605a505a400e905a305a205a100ca05a0059f0052059e009b059d059c059b059a059905980231059702300596022f022e0595022d025001740183022c022b00c6022a0229059400c502280227059305920591022600c5022500c60590018200c70224058f02230222058e058d003100560055002b005400cb003f0048003a00390053058c0027058b012a006a00610060005f0003005e006900680067005000e8001700160040001c00120065058a00c300d700eb005b058905880221022005870073001b000a058605850173001b000a058401a105830582021f01a7021e0174021d0057019e018402750046001b005700a6000b0066000c00070002000100060009000800050004000d0003006c002f00a0000b005c000c00070002000100060009000800050004000d00030013000a0581013500130030000800150580057f057e057d057c021c01a40191021b005c000c0007000200010006000900050004000d0003006c002f0038001b00a60046001b0057000b006d000c00070002000100060009000800050004000d000302580076021a057b057a002f00100133026c013000ec0579001100f60094021e0174057801850025009400580062025702190185008d00940218013200a10577057600a1057500350574005a004505730572026a026f057105700017001600f400020001001d001c002a0017001600290049012b004f056f056e003400040008000d0038001b000a056d0087001b02200089056c00aa00f70172056b021700a9001b007300f8056a0046001b0057000b006d000c0007000200010006000900050004000d00030025001e000c00070002000100060009000800050004000d00030013013b05690046001b0057000b006d000c00070002000100060009000800050004000d00030025001e000c00070002000100060009000800050004000d00030076021a0568002f0046001b0057000b006d000c00070002000100060009000800050004000d000300f200f1029c00080015029a00f50567000b0007000200010006004b00050004000d000305660232021c008100f50087001b01a702160008056505640563009f05620065028100d8001b00370215009a00c900c200db00c901710561021500750221001b0560055f001b00ad055e001b00a60240021b0066000c00070002000100060009000800050004000d00030013000a055d005c000c00070002000100060009000800050004000d00030013000a02140038000b006d000c00070002000100060009000800050004000d00030190018f013c055c0070001e000c00070002000100060009000800050004000d00030013013b02140038000b006e000c00070002000100060009000800050004000d00030070001e000c00070002000100060009000800050004000d0003001302130038000b0066000c00070002000100060009000800050004000d00030013005d055b000a01a9005c000c00070002000100060009000800050004000d00030013000a0212055a00180081002505590170016f02110210013000880007007b0558009900190028002e05570170055600700014016e0211021000c1001400070025007b0555009900190028002e0554020f0086020e00780002000100060077016d05530005055200330032003100190028002e020d020c0551003f020b003a0039016c0550020a054f0209020800c00207020600d402050204020300bf007e004e0004054e00ac00be020202010037006200980030001500040059003c001900200173054d008100630025054c020f0086020e00780002000100060077016b054b0005054a00330032003100190028002e020d020c0549003f020b003a0039016c0548020a05470209020800c00207020600d402050204020300bf007e004e0004054600ac00be020202010037006200980030001500040059003c001900200173001f000e016a003700710169008100250168020000ee0545001e006e000c00070002000100060009000800050004000d00030070001e000c00070002000100060009000800050004000d00030076008101ff006300e7002f0010007500110070001400020001001d002a001700160029001c0009004f004401fe0544023700340004000d00850042006f0041012900070002000100060084008300050004008c0167009e0543003505420166003701fd00ca0013000a054100a60540013a00850042006f004100e9012800070002000100060084008300050004008c0003053f00ed0063053e00a0053d053c00630243053b00ca0013053a0063013a0217012700c40175000b003e00070002000100060009000800050004000d0003007600ed00e7002f0010008800020001001d002a001700160029001c004b004f004400e6005a01a500340004000d0025053900630538004d00d700eb005b053705360535009f05340065027100bd001b0037013600c9021d003700c901fc0533012d053200ec013a00890531022500940530052f001b0191018400a8006e000c00070002000100060009000800050004000d0003006c001e000c00070002000100060009000800050004000d0003001301fb052e0046000b006e000c00070002000100060009000800050004000d0003006c001e000c00070002000100060009000800050004000d00030076052d0063002f00850042006f0041012900070002000100060084008300050004008c0167052c0035052b016601fb01fd00ca001300db052a052901720087000b003e00070002000100060009000800050004000d000301fa0528006305270013012600850042006f004100e9012800070002000100060084008300050004008c000300c101f900810063016501f800870526000b003e00070002000100060009000800050004000d000300f100870172000a0525000b003e00070002000100060009000800050004000d00030013052405230087000b003e00070002000100060009000800050004000d000300c1002f012701640081052200c40010008800020001001d002a001700160029001c004b004f004400e6052100d300340004000d0046000b0066000c00070002000100060009000800050004000d00030013005d0520000a01a9005c000c00070002000100060009000800050004000d00030013000a02120038005d051f00cf004200460041000700020001000600ce00cd00050004008c0003000a000d00da0125006c00140124004d0014018e00bc0123008d001400070070007b01f700bb01f601f500400002000100060049009d007001630034004c0033003200cc0004051e051d002b051c0015012d00ba003c016200ab00cf004200460041000700020001000600ce00cd00050004008c0003000a000d00da01f401f3001401f2002500140125006c00140124004d0014017e00bc0123008d00140161001b01f1007c01f0000a051b051a00aa017d05190102009300a200ee0518023f00ab002a0130014f01f700a70104017b00020001006b00bb008601ef00780077001700160029001c007001630034004c0033003200cc00040517008e00150064017500bc01ee0025001400bb01ed01ec002a001700160029001c0009004f004401eb0516051500340004000d009e051400630513009a00d700eb005b05120511001800120024000b00970023002200120024000b051000230022001200e50024000b01220023002200120010050f00820010050e00820010016000820010002c01ea0011003601e902a50010005101e80011002c01e70011003601e601800010005101e50011002c01e4050d001001e30082001001e200820010050c008200560055002b005400cb003f0048003a00390053050b00f9003100560055002b005400cb003f0048003a00390053050a00f9003100560055002b005400cb003f0048003a00390053050900f900100508008200100507008200560055002b005400cb003f0048003a00390053050600f9004305050504050300a105020501050004ff00ea04fe00ec0089017804fd00b900ea04fc00940218013200a104fb04fa00ea02a4008904f900f7004504f804f70177004a04f600210024000b0097002300220012004304f504f4025604f3005804f200f704f104f004ef007e00d104ee04ed04ec04eb017601e101650021017601e104ea003700620098003004e9000404e8003c00210024000b007900230022001204e7021600f704e604e504e404e304e200aa04e104e004df008904de04dd04dc01e004db04da04d904d804d704d6013104d5009604d404d3018804d204d104d004cf023d00a904ce04cd04cc04cb04ca04c904c804c704c604c5003a003904c404c3007d04c204c104c004bf0060005f003b005e04be04bd04bc001404bb029900210024000b00790023002200120018001201df015f04ba04b901de04b80003001f015f04b7003b014a015f04b601e004b5008f00210018001201df007404b401dd01de04b304b20103007404b1005b04b004af04ae04ad04ac04ab04aa04a9027b002b027a027904a804a7008e012104a601dc006404a504a404a304a20074024c04a1004804a00230049f00c5049e049d00fe049c049b024f024e0074049a049904980074049701dd04960495012104940493049201db018104910074049000ef048f048e048d0074048c00ef01db0181048b024b048a048901da0488048700ef048602510485007404840483048204810480047f047e047d047c024d047b047a047900c601da047804770476024a01210475047404730170047204710470046f046e0121046d01dc046c046b046a04690468007401d904670466046504640463046200ef01d904610460045f0021001800120024000b00790023002200120290001e000c00070002000100060009000800050004045e0003002100180012002b045d002800a102a3045c0093045b0148045a002704590458045704560455016c045404530231045200a90451022f022e0450022d044f044e0183022c022b00c6022a0229044d00c502280227044c044b044a022600c5027000c60449018200c702240448022302220447044604450444008b00a70443044200f8044104400030043f043e043d003c017a0179043c00940017001600f4001c002a001700160029001c012b000800050004043b000300210024000b00970023002200120024000b00790023002200120018001201d8015e043a001000750439001100e400ea00b800b7043804370219029b00b60163043600c2000b0099001904350434001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2043300b1009b00b000af009604320027043100ae006a00610060005f0003005e0069006800670050004e000400b8043000e3004c0019042f000a042e0010007500e2008b00e401d7009300b700e100e000b900c800b6042d00c2000b042c004c015d042b015c042a0429001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2042800b1009b00b000af009604270027042600ae006a00610060005f0003005e0069006800670050004e01d6007101a301d500d900b8042500e3004c015d0424015c000a0423042204210420015d041f015c041e004c0010007500e2008b00e4041d009300b700e100e000b900c800b6041c00c2000b0019041b000a0071018701d40120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2041a00b1009b00b000af009604190027011f041800ae006a00610060005f0003005e0069006800670050004e000400b8041700e3004c00190416001801d40018004c01d304150010007500e2008b0414013400b700e100e000b900c800b6041300c2000b00190412000a0018015b0010007500e2008b00e401d7009300b700e100e000b900c800b6041100c2000b000a001801d201d10120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2041000b1009b00b000af0096040f002700b8040e00ae006a00610060005f0003005e0069006800670050004e00040018004c011f015b00e30019040d001801d00120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2040c00b1009b00b000af0096040b0027011f040a00ae006a00610060005f0003005e0069006800670050004e01d6007101a301d5005d00b8040900e3004c000a001801d201d1004c0010007500e2008b00e40408009300b700e100e000b900c800b604070094001e00190018040601d00120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2040500b1009b00b000af009604040027040300ae006a00610060005f0003005e0069006800670050004e00040018011f015b040200190018040100580071018701d3040003ff00d903fe00df03fd03fc000a01cf001003fb03fa00d903f900df005d01ce01cf001003f8001400020001001d00f3001200df005d01ce00210024000b00790023002200120024000b009700230022001202a701620057015a000b0066000c00070002000100060009000800050004011e00030013000a03f7005c000c00070002000100060009000800050004011e00030013000a03f600df000b006d000c00070002000100060009000800050004011e019d03f5001303f403f300210161000b026d00070002000100060009000800050004011e0003001303f20021001800210018001201cd015e005700ba000b006e000c00070002000100060009000800050004011d000300de001e000c00070002000100060009000800050004011d00030013012600dd000b0066000c00070002000100060009000800050004011d00030013005d03f1000a03f0005c000c00070002000100060009000800050004011d00030013000a03ef03ee001800c103ed011c016f011b01cc013600880007007b03ec009900190028002e03eb011c01cb00de0014016e011b009f005701ca007c000700c1007b03ea009900190028002e03e9011a0086011900780002000100060077016d01c9000501c800330032003100190028002e01180117011603e80115011401130112011103e7007d03e60110010f00c0010e010d00f0010c010b010a00bf007e004e000403e500ac00be0109003700620098003001c7000401c6003c001901c5010803e403e30021011a0086011900780002000100060077016b01c9000501c800330032003100190028002e01180117011603e20115011401130112011103e1007d03e00110010f00c0010e010d00f0010c010b010a00bf007e004e000403df00ac00be0109003700620098003001c7000401c6003c001901c50108001f03de016a00370071016901680021001800120024000b00790023002200120024000b00970023002200120010002c014e00110036014d0011008a0014007a0043001100020001001d009d00120024000b012200230022001200560055002b005401c4003f0048003a0039005303dd03dc00560055002b005401c4003f0048003a0039005303db002703da012a006a00610060005f0003005e006900680067005000e8001700160040001c001201d803d9017100ba01c30213000b0066000c00070002000100060009000800050004004700030013000a03d8005c000c00070002000100060009000800050004004700030013000a01c200bd000b006d000c00070002000100060009000800050004004700030190018f013c03d7004d001e000c00070002000100060009000800050004004700030013013b01c200bd000b006e000c0007000200010006000900080005000400470003004d001e000c00070002000100060009000800050004004700030013015a00bd000b0066000c00070002000100060009000800050004004700030013005d03d6000a03d5005c000c00070002000100060009000800050004004700030013000a03d403d3001800d000c303d2011c016f011b01cc015900880007007b03d1009900190028002e03d0011c01cb004d0014016e011b009f005701ca007c000700c3007b03cf009900190028002e03ce011a0086011900780002000100060077016d03cd000503cc00330032003100190028002e01180117011603cb0115011401130112011103ca007d03c90110010f00c0010e010d00f0010c010b010a00bf007e004e000403c800ac00be0109003700620098003001c1000401c0003c001901bf010803c700d000dc00c303c6011a0086011900780002000100060077016b03c5000503c400330032003100190028002e01180117011603c30115011401130112011103c2007d03c10110010f00c0010e010d00f0010c010b010a00bf007e004e000403c000ac00be0109003700620098003001c1000401c0003c001901bf0108001f03bf016a00370071016900d000c30168020000ee03be001e006e000c0007000200010006000900080005000400470003004d001e000c0007000200010006000900080005000400470003007600d001ff00dc00e7002f001000750011004d001400020001001d002a001700160029001c00c103bd0009004f004401fe03bc027400340004004700850042006f004101290007000200010006008400830005000401be03bb009a03ba0027015903b903b8003703b701270164000a03b600ba03b501bd00850042006f004100e901280007000200010006008400830005000401be000303b401590273012700dc03b300dd03b203b100dc008903b0016403af00dc03ae00c400a8003e00070002000100060009000801bd0005000400470003007601bc00e7002f0010008800020001001d002a001700160029001c004b004f004400e6005a03ad00340004004700bd0021001800120024000b012200230022001200e50010016003ac0010002c01ea0011003601e903ab001001e3001400020001001d00f300120024000b00790023002200120024000b00970023002200120010002c014e00110036014d0011008a0014007a0043001100020001001d009d001200560055002b005401bb003f0048003a0039005303aa03a900560055002b005401bb003f0048003a0039005303a8002703a7012a006a00610060005f0003005e006900680067005000e8001700160040001c001203a6017100ba01a1003503a501c3021f000b006e000c00070002000100060009000800050004003d0003004d001e000c00070002000100060009000800050004003d0003001301ba03a400d8000b006e000c00070002000100060009000800050004003d0003004d001e000c00070002000100060009000800050004003d0003007603a30158002f00850042006f00410129000700020001000600840083000500040107016703a2003503a1016601ba03a0009f039f00ca001300db01fc039e039d01b9001e003e00070002000100060009000800050004003d00030136039c0158015e0013012600850042006f004100e90128000700020001000600840083000500040107000300de01f901bc0158016501f8009a039b001e003e00070002000100060009000800050004003d000300f1009a01b90058039a001e003e00070002000100060009000800050004003d00030013039903980397000b003e00070002000100060009000800050004003d000300de002f039601a400c3025903950010001400020001001d002a001700160029001c004b004f004400e6039400d300340004003d00d8000b0066000c00070002000100060009000800050004003d00030013005d0393000a0392005c000c00070002000100060009000800050004003d00030013000a03910087005d039000cf004200d80041000700020001000600ce00cd0005000401070003000a003d00da0125004d0014018e00bc0123009a001400dd01b8012401b7000700f6007b01b600bb01f601f500400002000100060049009d00f601b501b40034015701960033003200cc0004038f003100560055002b005401b3003f0048003a00390053038e038d002b038c038b012d015a003c016200ab00cf004200d80041000700020001000600ce00cd0005000401070003000a003d00da01f401f3001401f2008d00140125004d0014017e00bc0123009a001400dd01b8012401b70161001b01f1007c01f0000a038a038900aa017d038802a1025400a200ee0387038600ab002a0385014f01b600a70104017b00020001006b00bb008601ef00780077001700160029004900f601b501b40034015701960033003200cc00040384008e03830064038200bc01ee008d001400bb01ed01ec002a001700160029001c0009004f004401eb028600340004003d00bd00210018001200e50024000b01220023002200120010016003810024000b00790023002200120010005101e80011002c01e70011003601e603800010005101e50011002c01e400110036017f0011008a0014007a0043001100020001001d013700120024000b00970023002200120010002c014e00110036014d0011008a0014007a0043001100020001001d009d0012001001e2001400020001001d00f30012003100560055002b005401b3003f0048003a00390053037f0027037e012a006a00610060005f0003005e006900680067005000e8001700160040001c0012037d037c01b2037b037a037900ba000b003e000700020001000600090008000500040106000300130378037700dd000b003e00070002000100060009000800050004010600030376002f00df000b003e0007000200010006000900080005000401060003007600d000e7002f0010008800020001001d002a001700160029001c004b004f004400e6015702720034000401060021001800120010005103750011002c037400110036027601b10010005103730011002c037200110036037101b10010005103700011002c036f00110036036e0011008a0014007a0043001100020001001d0137001201cd01b2036d036c036b036a0126000b0091000c0007000200010006000900080005000401fa0156000300a8000c0007000200010006000900080005004c00040156000300de002f0010001400020001001d002a001700160029001c004b004f0044023e03690034000401560021001800120010005102470011002c024600110036024503680010005102420011002c024100110036017f0011008a0014007a0043001100020001001d0137001200e500020001001d0017001600f4001c002a001700160029001c012b0008000500040367000300210018001203660365012c03640363036200d100db0361017a017900e8002a001700160029001c0360035f00050004035e0003002100e5035d0186002100650021035c0186002100650021035b00520012000000000000000000000155000000000000035a0000000000000359000000000000002603580000000000000154000001b000000000000000000357000000000000035603550000035400000000000000000353000000000000035200000000000003510000000000000350000000000000034f000000000000034e000000000000034d000000000000034c000000000000034b000000000000034a0000000000000349000000000000034800000000000003470000000000000346000000000000034500000000000003440000000000000343000000000000034200000000000003410000000000000340000000000000033f000000000000033e000000000000033d000000000000033c000000000000033b000000000000033a0000000000000339000000000000033800000000000003370000000000000336000000000000033500000000000003340000000000000333000000000000033200000000000003310000000000000330000000000000032f000000000000032e000000000000032d000000000000032c000000000000032b000000000000032a00000000000003290000000000000328000000000000032700000000000003260000000000000325000001550026002603240000000000000000000001b000000000000003230000032203210320031f01af002600260153000000000000031e031d00000000000001540000031c0000031b000000000000031a0319031803170316000000000000000000000315000003140313031203110152000001ae00000310030f030e030d000000000000030c030b030a030903080152000001ad00000307000000000000030600000000000000000000030500000304000000000000000000000303000003020301030002ff02fe00000000000001ac02fd02fc02fb02fa00000000000001ac02f902f802f702f600000000000001af00260026002602f5000000000000015400000000000002f400000000000002f300000000000002f202f102f002ef02ee02ed02ec02eb02ea00000000000002e900000000000002e800000000000002e700000000000002e60000000000000000000001ae000002e50000000000000000000001ad000002e400000000000002e302e202e102e002df02de02dd02dc02db00000000000002da00000000000002d902d802d702d602d500000000000001ab02d402d302d202d100000000000001ab02d002cf02ce02cd02cc02cb02ca02c900000000000002c802c702c602c502c402c302c202c1015500260026002602c000000000000002bf0000000000000026002600260153002600260026002600260026002602be0000000002bd000000000000000002bc02bb00000000000002ba00000000000000000000000002b902b800000000000002b700000000000002b600000000000002b5000000000000000000000000015302b40000000000000151015002b302b202b10000000000000151015002b002af02ae0000000000000151015002ad02ac015200000000000002ab02aa02a902a80000000000000000000000000000", + "logIndex": 2, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b7", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002330000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e493b58c8c374003f1612aae57c437eb95320206121cd359d47fee8deaceca1e0", + "logIndex": 4, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x493b58c8c374003f1612aae57c437eb95320206121cd359d47fee8deaceca1e0" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e1203e700000000000000000000012c0000c13d0000013c0000213d000000000101043bffffffffffffffff000001a40020009c0000012c0000213d000001a401008041000001a40010009c000001a40200804100000001002001900000068c00010430000000000112019f000000000010043f000000200aa00039068a06850000040f000000000001004b0000012c0000613d0000801002000039000000200010043f0000068b0001042e000005fb0000213d0000012c0000413d0000000000bc043500000000000b004b00000040011002100000000001000019000000000001042d000000c001100210000000000100041400000060022002100000013c0000c13d0000000000210435000000000101041a000000000c0000190000002006600039000001c101000041000000040010043f000001c001000041000001bb011001c7000001ba011001c7000000c0022002100000000002000414000000000002004b000000000a0a043300000020055000390000000000cb0435000000000b0b043b000000000009004b000000000005004b000000000003004b000000400200043d00000040020000390000000201000039000000800010043f000000000100041a0000000001000416000000200bb00039000005fd0000213d000000000021041b000001b50010009c0000000008980436000000000b0b04330000000000ba004b0000000000cb004b000000000c0c043b000000000ba1034f00000000009a0435000000400010043f000000000300003900000000003204350000002002000039000000000004004b00000004011003700000000002000416000000240030008c068a066b0000040f000001be010000410000000000ab043500000000000a004b0000000202000029000001a403008041000001a40030009c068a06800000040f00000000004304350000000002000019000001d904400197000000000034043500000000007604350000000007070433000000007907043c000000000701034f000000400100043d0000056a0000213d0000000000bc004b000000010cc00039000000000d0a0433000000000b0a0433000000600aa00039000000010b00c039000000000b000039000000400ba00039000000000c0c0433000001b30bb0019700000000cb0a04340000000009a904360000000000dc0435000000000d0d043b000000400900043d000001b500b0009c00000000000c004b000000000b0000190000000100c0008c000000400800043d00000020044000390000000005000019000000410100003900000000060500190000000004000019000000400020043f0000000100300190000001b50020009c0000000103004039000000000032004b000001d903200197000000800300043d000000000035004b00000000001204350000000101000039000004ee2d6d415b00000024000000000200000000000000ffffffffffffffe07fffffffffffffff00000000ffffffff0000000102000039000005fb0000c13d000000000cb4034f000005fd0000c13d000005fb0000413d000000210100003900000000080200190000002008800039000000000a00001900000000090000390000000009090433000000000026004b000000000001042f00000000004204350000001f04400039000000000808043300000000060000190000000000450435000000010100002900000002030000290000000000140435000000000161019f00000000015101cf000000000151022f0000010005500089000000000656022f00000000065601cf0000000006040433000000000048004b000000400300043d0003000000010355000001d9033001970000001f033000390000000000050435000000000785001900000000002304350000000403000029000000000012004b00000000006504350000000006060433000000000013043500000003055002100000000001320019000000000787043600000007040000290000004003000039000000070300002900000006040000290000000000030435000000000654001900000000080300190000002001100039000001d9053001970000000002000039000000010770003900000000070000190000000002d20436000000a002200039000000800c20003900000000005b0435000000600b200039000000400c2000390000000200c0008c000000000bb20436000000000a060433000000000a420049000000010880003900000000090400190000000008000019000000800500003900000000008704350000008007000039000000200cc00039000000000da1034f000000000c09001900000000003b004b000000000bac0019000000440aa000390000000000b904350000004000d0043f0000000100e00190000001b500d0009c000000010e004039000000000e00003900000000009d004b000000000dd90019000001b60d9001970000003f09c00039000000050cb00210000000000b09043b000000000991034f0000002409a00039000000000c0bc019000001b90090009c000001b90c004041000001b909900197000001b90b008041000000000039004b0000004309a00039000000000a9a0019000001b500a0009c000000000a0a043b000000000aa1034f000000400c800039000000010c00c039000000000c000039000000000ca1034f000000000bb80436000001b300b0009c000000240a9000390000004000a0043f000000800a800039000001b70080009c000000800080008c000001b80080009c0000000008920049000001b50080009c000000000808043b000000000076004b000000600a80003900000040033002100000000002120049000001d904100197000000000037004b0000002406500039000001b50090009c000001b50050009c000001b301100197000001c20110009a000000000021004b000000000000043f00000007010000290000001f02200039000000200320008a00000000024200190000000502300210000000000008004b000000000036004b000001c30080009c0000012c0000813d000001b50040009c000000240230008c0000000301000039000001b4011001c7000001b30010009c000000010100c0390000000001000039000001b300100198068a06030000040f068a05700000040f0000000001030019000000040030008c000000400040043f000000800400003900000000030100199325c516c8771252da99e794edeb23979bd15cc8fbbfbc1853b071427d6e39e6eb71f42c3160b9823cef35a83f2c1a6a38236fd7a1588dd5cb0452bbe0e15990ffffffff0000000000000000ffffffe07ccc2ec2000000000200000200000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf265115bdc118c235bfd8c7dbab89d703809978f128b93471df49c4d535bdea7cd8ac32661a6876ae1b74283c20cac8d9c9414cd1a7801437273010006bd265cfb84ffffffffffffff7b6c740000000000004d61676963566175756c7420000000004d616769632056617f000000000000003839616263646566303132333435363700ffffffffffffff0000000005f5e100002386f26fc1000085acef80ffffffff85acef81000000006e38ed64bf6a1f01e93ff9f4daa797ed0000000000184f03ce992a36000000000000000000000001c9d06ce9f10c1a9db459436ab7bff70929fcba5677c79037d6f21326ab749d574e487b7100000000362f93160ef3e5634ba6bc95484008f6d60345a988386fc8290decd9548b62a8000000200000008000000004000000004d827f170000000000000040000000008000000000000000ffffffffffffff7f000000200000000000000000652b9b410000000054af84a100000000812617c7000000007a98742d0000000074449c600000000074449c5f000000009ac246870000000097331bf900000000f68790c700000000f396455100000000d126fc1900000000d126fc180000000097331bf8000000400000010000000002000000000000068a00000432000006880021042300000683002104210000067e0000613d000006680000613d00000000020204330000004001300210000006620000c13d0000000100400190000006620000213d00000001040040390000000004000039000000000041004b00000000012400190000001f01100039000000200410008a0000000001240049000006130000013d000006330000413d0000000004d40436000006130000613d000000a004400039000000800c40003900000000007b0435000000600b400039000000400c4000390000065c0000813d000000000bb40436000000000a010433000000000a6400490000063a0000813d000000000058004b000006160000013d00000000090600190000063a0000613d000000000464001900000005045002100000006006200039000000000054043500000040042000390000000005010433000000200400003900000020032000390000000001020019000005970000013d000005f10000413d0000000000ed0435000000200dd00039000000000e0e043b000000000eb4034f000000000d0a0019000005970000813d00000000001c004b000000000cdb0019000000440bb000390000000000ca04350000004000e0043f0000000100f00190000001b500e0009c000000010f004039000000000f0000390000000000ae004b000000000eea0019000000400a00043d000001b60ea001970000003f0ad00039000000050dc00210000001b500c0009c000000000c0a043b000000000aa4034f000000240ab00039000000000a0cc019000001b900e0009c000001b90a0040410000000000da004b000000000eda013f000001b90d100197000001b90aa00197000001b90c00804100000000001a004b000000430ab00039000000000bab0019000000000bb4034f0000000000cd0435000000400d9000390000000000dc004b000000010d00c039000000000d0000390000000100d0008c000000000db4034f000000000cc90436000001b300c0009c000000240ba000390000004000b0043f000000800b900039000001b70090009c000000800090008c000001b80090009c0000000009a30049000000000a590019000000000909043b000000000964034f000005f90000813d0000000000980435000000600b9000390000059e0000013d000005f90000613d000000000017004b00000000077600190000000000820435000000400060043f0000000100900190000001b50060009c00000001090040390000000006620019000001b6062001970000003f027000390000000507800210000005fd0000813d000000000802043b000000000224034f0000000402500039000005fb0000813d0000002302500039000000000502043b00000004024003700000000204000367000000240310008c000001b80010009c000005430000013d000005630000413d0000000000ab004b000000010bb000390000000003c30436000000000c0904330000002009900039000005430000613d000000a003300039000000000a090433000000800b30003900000000002a0435000000600a3000390000006009900039000000400b300039000000010a00c039000000000a000039000000400a9000390000000000ba04350000000100b0008c000000000aa30436000001b30aa0019700000000ba09043400000000090604330000000009530049000004d20000813d000000000047004b000005460000013d0000000008050019000000000602001900000040022002100000006001300210000000000161034f000005390000613d000005280000c13d0000052c0000613d0000000004620019000001d6063001980000001f0530018f000001a403300197000004f90000013d000005190000413d00000000009a004b000000010aa000390000000001b10436000000000b080433000004f90000613d000000a0011000390000000009080433000000800a100039000000000049043500000060091000390000006008800039000000400a100039000000010900c03900000040098000390000000000a904350000000100a0008c0000000009910436000001b30990019700000000a908043400000000080504330000000008310049000004320000813d0000000106600039000004fc0000013d0000000007030019000000000504001900000007060000290000000205000029000001d80400004100000003030000390000800d020000390000000002130049000000000400041100000060021000390000053f0000c13d000000000353001900000005034002100000000005430436000000800400043d0000004005100039000000000413004900000000033400190000000005340019000004bd0000413d000000000045004b0000000006350019000004c40000613d000000030800002900000000034504360000000004030433000000000415004900000000055400190000000000060435000004a80000413d000000000046004b00000000089600190000000007560019000004af0000613d0000000509000029000000a00510003900000080051000390000000004040433000000000321043600000080020000390000000702000029000000000030043f000000000232019f000001d702200197000000000201041a00000008010000290000000102000029000000000020043f000100000001001d000000000020041b00000001021000390000047a0000c13d0000000201000029000005200000613d000101a40030019d0000006003300270000000000121019f000000000131019f0000006001100210000000000131004900000001030000290000044b0000613d000004f40000c13d000000000131001900000005012002100000004403300039000100000003001d000000800200043d00000024013000390000000401300039000001d501000041000004f30000613d0000800202000039000001d4011001c70000000400100443000200000001001d0000000000200443000001d302000041000000400230021000000060012002100000000305600210000000000151034f0000040a0000613d000000000006004b000003f90000c13d000003fd0000613d00000000045300190000001f0620018f000001d905200198000001a402200197000101a40020019d00000060022002700000000002010019000003f20000013d00000001020000310000000301000367000004120000c13d000003ed0000613d0000800602000039000000c002500210000001a405008041000001a40050009c00000004031000390000000000310435000001d2030000410000006404100039000000840320008a0000000002230019000000000064043500000060060000390000000005000414000000440410003900000000000404350000000004230019000003bf0000413d000000000034004b00000000067400190000000005240019000003c60000613d0000000307000029000000000234043600000000030204330000000402000029000000a403100039000000000224004900000000044300190000000005430019000003a90000413d0000000006450019000003b00000613d0000000508000029000000e404100039000000c40410003900000000030304330000000603000029000001d10400004100000024031000390000008402100039000001d00010009c0000000102004039000001d90210019700000049011000390000000a0210003900000000000204350000000002310019000003810000413d000000200220003900000000064200190000000005320019000003880000613d00000000010204330000002a03500039000400000005001d000300000003001d000001cf010000410000002003500039000000400500043d0000036b0000213d0000000000510435000000000565019f000001cd05500197000001cc0550021f000001cb066001970000000006010433000000010110008a0000000a5330011a000000090030008c0000002101100039000003630000c13d000000000067004b000000001801043c00000000070400190000000006640019000003670000613d0000001f0550018f000001d9065001980000000004420436000000010430003900000000042400190000005f045000390000000103302039000000090040008c000000640440811a0000ffff0440818f0000000203308039000000640040008c000027100440811a000001a4044081970000000403308039000027100040008c000001ca0440812a000001b5044081970000000803308039000001ca0040009c000001c80440812a000001c90440819700000010033081bf000001c80040009c0000002003002039000001c60440212a000001c70040009c000003460000013d000001c50440012a0000033d0000413d000001c50030009c00000000024300190000004b022000390000000c0320003900000000035200190000031f0000413d000000000024004b0000000007340019000003260000613d00000000020404330000002c05600039000600000006001d0000000000250435000500000005001d000001ce020000410000002005600039000000400600043d000003090000213d0000000000620435000000000676019f000001cd06600197000001cc0660021f000001cb077001970000000007020433000000010220008a00000003066002100000000a6550011a000000090050008c000000070500002900000021022000390000000002240019000003010000c13d000000000068004b0000000006630019000003050000613d000000020110036700000000010000310000001f0510018f000001d90610019800000000033404360000000103200039000000400030043f0000000100500190000001b50030009c00000001050040390000000005000039000000000053004b0000000003450019000000400400043d0000005f03100039000001d9012001970000000102202039000000090010008c000000640110811a0000ffff0110818f0000000202208039000000640010008c000027100110811a000001a4011081970000000402208039000027100010008c000001ca0110812a000001b5011081970000000802208039000001ca0010009c000001c80110812a000001c90110819700000010022081bf000001c80010009c0000002002002039000001c60110212a000001c70010009c000001b4013001c7000001bd011001c7000001c402000041000000ad0000013d000000400700043d000001640000013d0000029c0000013d000002bc0000413d0000029c0000613d0000016f0000813d0000029f0000013d000002700000013d000002900000413d000002700000613d0000056a0000813d000000b80000813d000000000038004b000002730000013d0000020b0000013d000002630000413d0000020b0000813d0000000009480019000000000851034f000002c50000813d000000000065004b0000002007700039000002120000013d000001a90000013d000002010000413d000001a90000813d0000000009580019000000000861034f000002c30000813d0000000000840435000001bd013001c7000001bc01000041000002cf0000c13d000001b3011001980000000003024019000001a4030000410000000002080433000000000283001900000000003804350000000002820049000002970000c13d000000600480003900000040028000390000002001800039000001b00000c13d000001530000413d00000001055000390000000002620436000001b3066001970000000046040434000000a004000039000001590000613d000000c002400039000000a00240003900000080014000390000003201000039000001480000a13d000001b70040009c000000410160008a000001310000413d000000000014004b000000010440003900000001033000390000000005560436000000000503041a000001bf03000041000000a005000039000001620000a13d0000000007670019000000800090043f000000400080043f0000008008600039000001b70060009c000001b6066001970000003f067000390000000507900210000000000906043b000000000661034f00000004065000390000002306500039000000000505043b00000004051003700000000005000416000001420000813d000000000200041a000001490000013d0000000004020019000000a0010000390000012e0000c13d000002db0000013d000001c50110012a000002d20000413d000001c50010009c000700000001001d000002c70000c13d000800000001001d00000000020704330000000002730019000000000037043500000000027200490000026b0000c13d000000600470003900000040027000390000002001700039000002090000c13d00000000065600190000002405400039000000800080043f000000400070043f0000008007500039000001b70050009c000001b6055001970000003f0560003900000005068002100000013c0000813d000000000805043b000000000551034f00000004054000390000002305400039000000000404043b000000040410037000000000040004160000010a0000013d0000004001200210000001ac0020009c000000f20000613d000001ab0020009c000001b20020009c0000008e0000613d000001b10020009c000000660000013d000001aa0020009c0000010f0000613d000001a90020009c0000007b0000613d000001a80020009c0000005c0000a13d000001a70020009c000001a501000041000001200000044300000100001004430000002001000039000001b00020009c000000fe0000613d000001af0020009c0000006d0000613d000001ae0020009c000000420000a13d000001ad0020009c000000290000213d000001a60020009c000000e002200270000000000201043b000000210000c13d000001a40040019d00020000000103550003000000310355000001a40340019700000060043002700008000000000002000400000000000203e603e5012103e403e303e203e103e00120011f000a03df011e001603de03dd03dc03db03da03d903d803d703d603d503d4000100380010000100370036004d001400380010000103d303d203d103d0001403cf03ce03cd03cc03cb03ca03c90001003800100001011d011c011b000d003500130034001a004c0021011a0119011803c803c703c603c50001004b0016004a002b00010049000301170006000d008000130034001a004c00210010011901180036004d001403c403c303c20001003800100001011d011c011b0033007f0005000903c101160014004b0016004a002b000100490003000d003500130034001a004c03c0004b0016004a002b00010049000301170006000d011500130034001a004c00210036004d00140114001603bf0048000103be03bd0113000603bc007e011203bb03ba03b9011103b803b703b603b503b4000203b303b203b103b003af01100006010f03ae03ad0047002003ac007d004603ab010e010d003203aa03a9010c03a8010b007c03a7007b0045007a007900020078001f007700080007001903a600050009001e000c002a000500090029000c00280012000f000a0011000303a5000d00350013001d00080007001c00270012000f000a001100030021011a03a4003703a303a203a10034010a03a0039f00380010000100470037003601090010039e039d039c039b004b0016004a002b000100490003039a0108039901090107002101060036004d00140114001603980031000103970396010500060395011001120394039303920104000203910390038f038e0002038d038c038b0103038a01020389001a000b038803870076007503860385038403830382038103800101037f037e0026000d007400250024000b0026000d037d00250024000b037c00440020037b007d0046037a00320379037800730377037603750374007e0373010000050009001e000800070019000c0014003003720371004700200370007d0046036f010e010d0032036e036d010c036c010b007c036b007b0045007a007900020078001f0077000800070019036a00050009001e000c002a000500090029000c00280012000f000a00110003000d00350013001d00080007001c00270012000f000a0011003300050369036800ff00030021036703660365007f0364000b007200fe00430363002300fd0362036100fc00fb0006036000fa00f9000600f80016007100f7000200f600f500f40042002f00f3000600f2000e00f1004100700006002e000e0042002f001800f000ef0040000100ee0017000e00ed00ec00eb000600ea00e900e8006f00e700e60030002200e500e400e3006e000100e200e100e0006d000200df00de00dd006c00dc00db00da00d900d8000200d7001f00d600d500d400d300d20006003f035f00d100d0006b00cf006a000e003f035e035d00ce035c035b00fe004300cd002d035a0359035800fc00fb0006035700fa00f9000600f80016007100f7000200f600f500f40042002f00f3000600f2000e00f1004100700006002e000e0042002f001800f000ef0040000100ee0017000e00ed00ec00eb000600ea00e900e8006f00e700e60030002200e500e400e3006e000100e200e100e0006d000200df00de00dd006c00dc00db00da00d900d8000200d7001f00d600d500d400d300d20006003f035600d100d0006b00cf006a000e003f0355035400cc007500cb00ca035300c90352035100c80069002300c70068006700c6006600c50350002e0065003e00180064006300c400170062002c00c300c200c10061001700c00018034f0022000e006000bf005f005e034e034d00cc007500be00ca034c00bd0102034b00c80069002300c70068006700c600660070005d002e0065003e00180064006300c400170062002c00c300c200c10061001700c00018034a0022000e006000bf005f005e034903480071034703460345005c034400200008000700190343000b007f03420014010a0341034000bc033f033e033d033c033b033a0339033803370336033503340333033203310330032f032e032d032c032b00bb032a0329032803270326032500020324001f03230322032100ba0320031f031e031d031c031b005b00b9005a003d031a03190031031803170316031503140313031203110310030f030e030d030c030b030a0309030803070306030503040303002b0302007600b80301005900580072030002ff02fe00b702fd00b6005702fc007c02fb007b0045007a007900020078001f007700b502fa02f900b400b302f802f700b302f602f5004502f402f302f202f102f002ef02ee02ed02ec02eb02ea02e902e802e702e602e502e402e302e200bb02e1005602e001130002011f02df02de002d02dd02dc02db02da02d902d800b202d702d6003100b102d500b502d402d300b002d202d102d002cf02ce02cd02cc02cb02ca02c902c802c700af02c602c502c4001002c3005502c202c100ae00ad02c000ac02bf02be02bd02bc00ab00aa02bb02ba00b1010800bc02b9003c0002000a001f004402b8000202b702b602b5005400b4004602b402b302b2005702b1003202b002af007302ae00a900590058002d007e02ad02ac00a800a700a602ab02aa02a900aa02a802a702a6003202a502a4007602a302a200ae00ad007202a102a0029f029e029d029c029b029a00a700a60100029902980297005702960295029400b700050009001e000800070019000c029302920291000c002802900053000a028f00030010028e028d028c028b00a5028a0289028802870286028500a402840283005b00b9005a003d00a3028202810280027f027e00a200a100a00003009f009e009d009c009b00050009027d00520051027c000c000b027b027a010602790278001d00080007001c02770276000f000a027500030010001100a4027400af0273004700200272027100200270026f026e026d002b026c002a009a011e026b026a02690008000702680052005100ff026700050009002902660050005301210265026400a5000a02630099003c0002009900440262000d00800013001d00080007001c00270012000f000a001100030021001002610037003c00020260025f01070050003b0037025e025d00800013001d00080007001c00270012000f000a00110003025c003b025b000d00350013001d00080007001c00270012000f000a00110003025a0259009a0258003b025701150013001d00080007001c00270012000f000a001100030256003b0255005c025400b6025302520098025100480250024f0097024e024d009600cd0023024c024b00b8024a0095005602490248005400ab024702460048024502440073024300a900590058002d02420241024000a800950056023f023e023d0098023c023b023a023900480238023702360094023500050009001e000800070019000c002a000500090029000c0028023402330232023102300053000a0011005c005000200008000700190116001400930120022f0097022e022d022c0092022b022a00b2002d0229022802270226002c0225005d0224022300910030009002220221004302200096021f021e021d021c0043021b0030021a008f008e02190218021702160215021402130212021100330210020f005b008d005a003d00a3020e0031020d020c00b000a200a100a00003009f009e009d009c009b020b00050009020a000c000b020900be0208020700bd020602050204003d00230203020202010200003e01ff005d01fe01fd002c004f01fc01fb01fa004e01f9009101f801f701f601f5004e01f4004f01f3006f01f201f101f001ef01ee01ed01ec0026000d008c00250024000b01eb001501ea008b01e901e801e70105001501e600ac01e501e401e301e2011101e101e001df01de003301dd0092009001dc01db003a01da008a01d901d8010301d701d60015010f01d5008d01d4008e01d3004e01d2002300fd01d101d001cf0104001501ce01cd01cc001501cb008b006c01ca003a01c901c801c70089004101c6001501c5003901c4006b01c30015006a003900890041006e01c201c101c0008801bf01be003901bd002f006d001501bc01bb01ba002201b901b801b701b601b5008f01b401b301b2004f008801b101b001af01ae003a01ad01ac01ab01aa01a901a801a701a601a5003a01a4008a01a301a201a101a0019f00150040019e019d019c019b019a019900390040019801970196001b001a000b0026000d007400250024000b00330195019400540193019201910190018f018e0031018d00ce00cb018c018b00c9018a01890188006900ba0187006800670186006600c50185002e0065003e001800640063018400170062002c0183018201810061001701800018017f0022000e0060017e005f005e017d017c017b017a0094017901010178017701760175003c0174017301720044005200510171017000050009001e000c002a000500090029000c00280012000f000a016f0003001b0026000d008c00250024000b0026000d007400250024000b001a000b009300080007001900050009001e000c002a000500090029000c00280012000f000a016e0003001b001a000b016d0087001b0055001b016c0087001b0055001b016b0014000b0000000000000000000000000086016a000001690000000000000000016800000000000001670000000000000166000000000000016500000000000001640000000000000163000000000000016200000000000001610000000000000160000000000000015f000000000000015e000000000000015d000000000000015c000000860004000400000000015b000000000000000000040085000400040084000000000000015a0085000400040004015900000000000000830000000000000083000001580000015700000000000000000000015600000000000001550000015401530152015101500000000000000000000000820000014f014e014d014c00000000014b0000014a00000000000001490148014700000000000000810146000000000081014500000000000001440000000000040004000000000000014301420004000400040141014000000000013f000000000000013e013d00000000013c013b00000000000000000000013a0139013801370136013501340133013201310130012f012e012d000000820000012c000000000000000000000000012b0004012a000000000129012801270126000400040004008401250124012301220000000000000000000000000000", + "logIndex": 5, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x010001db5d767185714cc92b45e71aa204d217485b14dabe76b1c480a7f435a5", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 6, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x010001db5d767185714cc92b45e71aa204d217485b14dabe76b1c480a7f435a5", + "0x000000000000000000000000dafcfd04958f430d6e27d8085bdd573d7e4a73ef" + ], + "data": "0x", + "logIndex": 7, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + }, + { + "transactionIndex": 0, + "blockNumber": 692847, + "transactionHash": "0x84713d917b475a1f29623f1b6ab35e87793541ad762e6e398c856ee94032879c", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3" + ], + "data": "0x000000000000000000000000000000000000000000000000151b1a74a1205138", + "logIndex": 8, + "blockHash": "0x33912a19f93e072f026b32566e859611f27a836cda1c0c90344d128ec6c755ad" + } + ], + "blockNumber": 692847, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 2, + "solcInputHash": "add2d99d454de06c8434504df96c7cdf", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "name": "VaultAlreadyDeployed", + "type": "error" + }, + { + "inputs": [], + "name": "VaultDoesNotExist", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": true, + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "vaultId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct INftVault.CollectionData[]", + "name": "collections", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "creator", + "type": "address" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllVaults", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getVaultAt", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVaultLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "hashVault", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVault", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "vaultHashMap", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "name": "vaultIdMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "VaultAlreadyDeployed()": [ + { + "details": "Vault with identical configuration is already deployed" + } + ], + "VaultDoesNotExist()": [ + { + "details": "Vault does not exist" + } + ] + }, + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "params": { + "collections": "configuration used for vault creation", + "creator": "address of vault creator", + "name": "vault's name", + "symbol": "vault's name", + "vault": "vault's address as INftVault", + "vaultId": "vault's index in `vaults` AddressSet" + } + } + }, + "kind": "dev", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "details": "If vault already exists, function reverts", + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address of deployed vault" + } + }, + "exists((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "true if vault with given config exists" + } + }, + "getAllVaults()": { + "returns": { + "_0": "all deployed vaults" + } + }, + "getVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address" + } + }, + "getVaultAt(uint256)": { + "params": { + "index": "vaultId or index in NftVaultFactory.vaults array" + }, + "returns": { + "_0": "vault address" + } + }, + "getVaultLength()": { + "returns": { + "_0": "length of vault's EnumerableSet" + } + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "config hash" + } + }, + "isVault(address)": { + "params": { + "vault": "address" + }, + "returns": { + "_0": "true if vault is deployed by the factory" + } + } + }, + "stateVariables": { + "vaultHashMap": { + "params": { + "hash": "vault's config hash" + }, + "return": "address", + "returns": { + "_0": "address" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "notice": "Emitted when new vault is deployed" + } + }, + "kind": "user", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "notice": "Create new vault" + }, + "exists((address,uint8,bool,uint256[])[])": { + "notice": "Returns true if vault with given config exists" + }, + "getVault((address,uint8,bool,uint256[])[])": { + "notice": "Get vault by it's config" + }, + "getVaultAt(uint256)": { + "notice": "Get vault by its EnumerableSet vaultId" + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "notice": "Get config hash" + }, + "isVault(address)": { + "notice": "Returns true if vault has been deployed by factory" + }, + "vaultHashMap(bytes32)": { + "notice": "Get vault by its config hash" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Vault/NftVaultFactory.sol": "NftVaultFactory" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Vault/INftVault.sol": { + "keccak256": "0x1b55813c809306ff889c9a07ea9aae68a4267568b5d09226096779b2bc8f552c", + "license": "MIT", + "urls": [ + "bzz-raw://a890283e8f67d5c2d8ff78486e4d2c214587aac76dd941f5d0a3a7a1b02b2280", + "dweb:/ipfs/QmUBhfyiit6VHerjJGmQL2q9C3P3XiX1gjv97jVx37qn6v" + ] + }, + "contracts/Vault/INftVaultFactory.sol": { + "keccak256": "0x48b76dac0e86e80a6c31e9566a42445b82c30b5bb184a0f70badeb1ac4448c20", + "license": "MIT", + "urls": [ + "bzz-raw://6bc21cf0dd88cb6ca4a990513c0f88010a2b8745a6f3bceff9a8e55fe822ddca", + "dweb:/ipfs/QmU3UFqt2aU8W8MSBQznzGMT6Mh3jTGcvxZrKjBdrYB8yG" + ] + }, + "contracts/Vault/NftVault.sol": { + "keccak256": "0xfcc3dc2246c4519105987c2c55330caa44fd280bf12b9e17769cfb2d44d3af30", + "license": "MIT", + "urls": [ + "bzz-raw://92e5cc716c130e5ea8948a1d67d2c66967f05a59320bbdcd1e2f7d1b1178bd67", + "dweb:/ipfs/QmdyPtrKpLUNA9auRcweLK33EeBHammReNft4xEA56wfC8" + ] + }, + "contracts/Vault/NftVaultFactory.sol": { + "keccak256": "0x30fb7e6ba0a7016ba9d745883b070c96645e7e2af429e3435bf812dfae03881a", + "license": "MIT", + "urls": [ + "bzz-raw://755d95704a415d732c996a54a239821ad262f0b54c7846ec090b0599634c639f", + "dweb:/ipfs/QmWC2wg75hEYuDa3ATLitL5xM1zvLJawbTCkRpSnHfxNUK" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673", + "license": "MIT", + "urls": [ + "bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2", + "dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "keccak256": "0x5c879356795cc563440408404a52eaf672d4547949e0a5920fb17642303d9e1b", + "license": "MIT", + "urls": [ + "bzz-raw://fb210cdef017f9813af368e17ea1573bc26094dd8dba8b5db8bec4cc90883d0a", + "dweb:/ipfs/QmdixQwckiNVVWHaJD9ps5ALWsHkZGRAePkuUPw1ZhhJhM" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "keccak256": "0x6392f2cfe3a5ee802227fe7a2dfd47096d881aec89bddd214b35c5b46d3cd941", + "license": "MIT", + "urls": [ + "bzz-raw://bd9c47a375639888e726a99da718890ba16d17d7ad9eacb0ccc892d46d1b3ee0", + "dweb:/ipfs/Qmb41W5RUjy2sWg49A2rMnxekSeEk6SvGyJL5tyCCSr7un" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "keccak256": "0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b", + "license": "MIT", + "urls": [ + "bzz-raw://0e28648f994abf1d6bc345644a361cc0b7efa544f8bc0c8ec26011fed85a91ec", + "dweb:/ipfs/QmVVE7AiRjKaQYYji7TkjmTeVzGpNmms5eoxqTCfvvpj6D" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "keccak256": "0x2e024ca51ce5abe16c0d34e6992a1104f356e2244eb4ccbec970435e8b3405e3", + "license": "MIT", + "urls": [ + "bzz-raw://a74009db3c6fc8db851ba69ddb6795b5c1ef1120c5a00fd1a8dc3a717dd9d519", + "dweb:/ipfs/QmZMk8Yh2X3gPS51ckUVLEXjZUhMSEeGApnA53WtjvLb9h" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "keccak256": "0x3dd5e1a66a56f30302108a1da97d677a42b1daa60e503696b2bcbbf3e4c95bcb", + "license": "MIT", + "urls": [ + "bzz-raw://0808de0ae4918c664643c885ca7fa6503e8ef2bd75609dfc85152c0128a3422d", + "dweb:/ipfs/QmNrhFC1XgBKuuxfahFeiwi1MCdu3FLNpHj2uStgmf4iJj" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "keccak256": "0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d", + "license": "MIT", + "urls": [ + "bzz-raw://15f52f51413a9de1ff191e2f6367c62178e1df7806d7880fe857a98b0b66253d", + "dweb:/ipfs/QmaQG1fwfgUt5E9nu2cccFiV47B2V78MM1tCy1qB7n4MsH" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "keccak256": "0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca", + "license": "MIT", + "urls": [ + "bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd", + "dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68", + "license": "MIT", + "urls": [ + "bzz-raw://daae589a9d6fa7e55f99f86c0a16796ca490f243fb3693632c3711c0646c1d56", + "dweb:/ipfs/QmR3zpd7wNw3rcUdekwiv6FYHJqksuTCXLVioTxu6Fbxk3" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "keccak256": "0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da", + "license": "MIT", + "urls": [ + "bzz-raw://6e75cf83beb757b8855791088546b8337e9d4684e169400c20d44a515353b708", + "dweb:/ipfs/QmYvPafLfoquiDMEj7CKHtvbgHu7TJNPSVPSCjrtjV8HjV" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "keccak256": "0x0108bf6a6ebd5f96678bed33a35947537263f96766131ee91461fb6485805028", + "license": "MIT", + "urls": [ + "bzz-raw://ae2d274bf3d56a6d49a9bbd0a4871c54997a82551eb3eb1c0c39dc98698ff8bf", + "dweb:/ipfs/QmTT7ty5DPGAmRnx94Xu3TUDYGSPDVLN2bppJAjjedrg1e" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1", + "license": "MIT", + "urls": [ + "bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269", + "dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", + "license": "MIT", + "urls": [ + "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", + "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "keccak256": "0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a", + "license": "MIT", + "urls": [ + "bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634", + "dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "keccak256": "0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b", + "license": "MIT", + "urls": [ + "bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d", + "dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "keccak256": "0x0812bc73d6e30558840122fa48d6f64ae978ccc1b1fc42e616bac190c6360f46", + "license": "MIT", + "urls": [ + "bzz-raw://3d95a53b7e19ca1d46043eaad8967b6e0b02aab2b5fefc2108bfa6d1ad425f5b", + "dweb:/ipfs/QmQq7AUGT9juE3hun2Wy7r2BDoDBFdBn43DVwhJpK2StLV" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "license": "MIT", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "keccak256": "0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6", + "license": "MIT", + "urls": [ + "bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b", + "dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "keccak256": "0x5094b17cb46143943f3206d0738b91a05a7005e979681af7210d534cd3e72f54", + "license": "MIT", + "urls": [ + "bzz-raw://a55fbc9ee8080ec3b397e8e32e5dafcff2c377ce44d553bfc93dfce1be2d5b12", + "dweb:/ipfs/QmYSk6bNHnpKRyNWXmEBKbkPxXi7Hco9JZHHyxMdrZGWpb" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0xc3ff3f5c4584e1d9a483ad7ced51ab64523201f4e3d3c65293e4ca8aeb77a961", + "license": "MIT", + "urls": [ + "bzz-raw://d7d3dd6067a994690471b5fc71b6f81fac3847798b37d404f74db00b4d3c3d0e", + "dweb:/ipfs/QmRHF1RarifjNi93RttouNPkYZGyu6CD926PgRDzD5iL35" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252", + "deployedBytecode": "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252", + "devdoc": { + "errors": { + "VaultAlreadyDeployed()": [ + { + "details": "Vault with identical configuration is already deployed" + } + ], + "VaultDoesNotExist()": [ + { + "details": "Vault does not exist" + } + ] + }, + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "params": { + "collections": "configuration used for vault creation", + "creator": "address of vault creator", + "name": "vault's name", + "symbol": "vault's name", + "vault": "vault's address as INftVault", + "vaultId": "vault's index in `vaults` AddressSet" + } + } + }, + "kind": "dev", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "details": "If vault already exists, function reverts", + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address of deployed vault" + } + }, + "exists((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "true if vault with given config exists" + } + }, + "getAllVaults()": { + "returns": { + "_0": "all deployed vaults" + } + }, + "getVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address" + } + }, + "getVaultAt(uint256)": { + "params": { + "index": "vaultId or index in NftVaultFactory.vaults array" + }, + "returns": { + "_0": "vault address" + } + }, + "getVaultLength()": { + "returns": { + "_0": "length of vault's EnumerableSet" + } + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "config hash" + } + }, + "isVault(address)": { + "params": { + "vault": "address" + }, + "returns": { + "_0": "true if vault is deployed by the factory" + } + } + }, + "stateVariables": { + "vaultHashMap": { + "params": { + "hash": "vault's config hash" + }, + "return": "address", + "returns": { + "_0": "address" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "notice": "Emitted when new vault is deployed" + } + }, + "kind": "user", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "notice": "Create new vault" + }, + "exists((address,uint8,bool,uint256[])[])": { + "notice": "Returns true if vault with given config exists" + }, + "getVault((address,uint8,bool,uint256[])[])": { + "notice": "Get vault by it's config" + }, + "getVaultAt(uint256)": { + "notice": "Get vault by its EnumerableSet vaultId" + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "notice": "Get config hash" + }, + "isVault(address)": { + "notice": "Returns true if vault has been deployed by factory" + }, + "vaultHashMap(bytes32)": { + "notice": "Get vault by its config hash" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 36309, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "vaults", + "offset": 0, + "slot": "0", + "type": "t_struct(AddressSet)90826_storage" + }, + { + "astId": 36314, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "vaultHashMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_contract(INftVault)35244)" + }, + { + "astId": 36319, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "vaultIdMap", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_contract(INftVault)35244,t_uint256)" + } + ], + "types": { + "t_array(t_bytes32)dyn_storage": { + "base": "t_bytes32", + "encoding": "dynamic_array", + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(INftVault)35244": { + "encoding": "inplace", + "label": "contract INftVault", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_contract(INftVault)35244)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => contract INftVault)", + "numberOfBytes": "32", + "value": "t_contract(INftVault)35244" + }, + "t_mapping(t_bytes32,t_uint256)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_contract(INftVault)35244,t_uint256)": { + "encoding": "mapping", + "key": "t_contract(INftVault)35244", + "label": "mapping(contract INftVault => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(AddressSet)90826_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "astId": 90825, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "_inner", + "offset": 0, + "slot": "0", + "type": "t_struct(Set)90511_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)90511_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.Set", + "members": [ + { + "astId": 90506, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "_values", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 90510, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "_indexes", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_uint256)" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + }, + "factoryDeps": [ + "0x00020000000000020010000000000002000000000e01034f00010000000e035500000000010e0019000000600110027000000632031001970000000100200190000000570000c13d0000008002000039000000400020043f000000040030008c00000dd20000413d00000000010e043b000000e0011002700000063b0010009c000001250000213d000006530010009c000001340000213d0000065f0010009c000001890000213d000006650010009c0000026b0000213d000006680010009c000003f90000613d000006690010009c00000dd20000c13d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000010001000039000000400010043f000000800000043f000000a00000043f000000c00000043f0000006001000039000000e00010043f0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c000006430000613d000000000001004b00000dd40000c13d000b00000001001d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b0000000b01000029000006430000c13d000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000006910000013d000000c002000039000000400020043f0000000001000416000000000001004b00000dd20000c13d0000001f013000390000063301100197000000c001100039000000400010043f0000001f0430018f0000063405300198000000c001500039000000690000613d00000000060e034f000000006706043c0000000002720436000000000012004b000000650000c13d000000000004004b000000760000613d00000000025e034f0000000304400210000000000501043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f0000000000210435000000400030008c00000dd20000413d000000c00400043d000006350040009c00000dd20000213d0000001f01400039000000000031004b000000000200001900000636020080410000063601100197000000000001004b00000000050000190000063605004041000006360010009c000000000502c019000000000005004b00000dd20000c13d000000c0014000390000000002010433000006350020009c000005930000213d0000001f01200039000006a8011001970000003f01100039000006a801100197000000400600043d0000000005160019000000000065004b00000000010000390000000101004039000006350050009c000005930000213d0000000100100190000005930000c13d000000c001300039000000400050043f000c00000006001d0000000005260436000b00000005001d000000e0044000390000000005420019000000000015004b00000dd20000213d000000000002004b0000000b08000029000000ac0000613d000000000500001900000000065800190000000007450019000000000707043300000000007604350000002005500039000000000025004b000000a50000413d0000000c0220002900000020022000390000000000020435000000e00400043d000006350040009c00000dd20000213d0000001f02400039000000000032004b000000000300001900000636030080410000063602200197000000000002004b00000000050000190000063605004041000006360020009c000000000503c019000000000005004b00000dd20000c13d000000c0024000390000000002020433000006350020009c000005930000213d0000001f03200039000006a8033001970000003f03300039000006a803300197000000400600043d0000000003360019000000000063004b00000000050000390000000105004039000006350030009c000005930000213d0000000100500190000005930000c13d000000400030043f000a00000006001d0000000003260436000900000003001d000000e0034000390000000004320019000000000014004b00000dd20000213d000000000002004b0000000906000029000000e20000613d000000000100001900000000041600190000000005310019000000000505043300000000005404350000002001100039000000000021004b000000db0000413d0000000a01200029000000200110003900000000000104350000000c010000290000000004010433000006350040009c000005930000213d0000000303000039000000000103041a000000010210019000000001051002700000007f0550618f0000001f0050008c00000000010000390000000101002039000000000012004b000005d50000c13d000700000005001d000000200050008c000800000004001d000001130000413d000000000030043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d00000008040000290000001f024000390000000502200270000000200040008c0000000002004019000000000301043b00000007010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b0000000303000039000001130000813d000000000002041b0000000102200039000000000012004b0000010f0000413d0000001f0040008c000007120000a13d000000000030043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000200200008a0000000802200180000000000101043b000007dc0000c13d0000002003000039000007e90000013d0000063c0010009c000001730000213d000006480010009c0000019c0000213d0000064e0010009c0000027e0000213d000006510010009c0000040a0000613d000006520010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000501000039000005df0000013d000006540010009c000001ad0000213d0000065a0010009c0000031c0000213d0000065d0010009c000004110000613d0000065e0010009c00000dd20000c13d000000640030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d0000066a0010009c00000dd20000213d0000004401e00370000000000101043b000a00000001001d0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b00000000020004110000066a02200197000900000002001d000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000006a90010009c000006890000c13d0000000c010000290000000b020000290000000a0300002918c317bf0000040f0000062b0000013d0000063d0010009c0000024d0000213d000006430010009c0000034d0000213d000006460010009c000004180000613d000006470010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000201043b0000066a0020009c00000dd20000213d0000002401e00370000000000301043b000000000100041118c317bf0000040f0000027c0000013d000006600010009c000003b80000213d000006630010009c000004570000613d000006640010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b18c3123d0000040f000005fa0000013d000006490010009c000003c10000213d0000064c0010009c0000046a0000613d0000064d0010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000001000412001000000001001d000f00200000003d000080050100003900000044030000390000000004000415000000100440008a000005570000013d000006550010009c000003cc0000213d000006580010009c000005040000613d000006590010009c00000dd20000c13d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000dd20000213d000000000005004b000001e00000613d000000800500003900000000062e034f000000000606043b0000066a0060009c00000dd20000213d000000200550003900000000006504350000002002200039000000000042004b000001d70000413d0000004402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000700000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000706000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000002130000613d000000070400002900000000062e034f000000000606043b000000200440003900000000006404350000002002200039000000000052004b0000020c0000413d0000006402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000400000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000406000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000002460000613d000000040300002900000000042e034f000000000404043b000000200330003900000000004304350000002002200039000000000052004b0000023f0000413d000000800200043d000000000002004b000800000000001d00000a310000c13d000000400100043d00000008020000290000062d0000013d0000063e0010009c000003df0000213d000006410010009c0000054d0000613d000006420010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d000000000010043f0000000a01000039000000200010043f00000040020000390000000001000019000c0000000e035318c3188b0000040f0000000c0200035f0000002402200370000000000202043b000000000020043f000000200010043f00000000010000190000004002000039000003dd0000013d000006660010009c0000055d0000613d000006670010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000201043b0000066a0020009c00000dd20000213d0000002401e00370000000000301043b000000000100041118c318330000040f0000000101000039000005fa0000013d0000064f0010009c0000057d0000613d000006500010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d000000010010008c00000dd20000213d0000004401e00370000000000101043b000a00000001001d0000066a0010009c00000dd20000213d0000006401e00370000000000101043b000900000001001d0000000a01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000002b90000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000002db0000613d0000000a01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000202100039000000000202041a000000ff002001900000070a0000c13d0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff001001900000070a0000c13d0000000b0000006b0000072b0000c13d0000067b0100004100000000001004430000000a0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400300043d00000044013000390000000902000029000000000021043500000024013000390000000c0200002900000000002104350000068001000041000000000013043500000000010004100000066a01100197000c00000003001d0000000402300039000000000012043500000000010004140000000a02000029000000040020008c000007860000613d0000000c02000029000006320020009c00000632020080410000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000a0200002918c318b90000040f00000000030100190000006003300270000006320030019d0000000100200190000007860000c13d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000003170000c13d000008ea0000013d0000065b0010009c000005990000613d0000065c0010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a00000024020000390000000102200367000000000202043b000000000012001a00000de10000413d0000000003120019000006280000013d000006440010009c000005a00000613d000006450010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000004401e00370000000000101043b000006350010009c00000dd20000213d0000002304100039000000000034004b00000dd20000813d000000040410003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024011000390000000004140019000000000034004b00000dd20000213d000000000005004b0000037f0000613d00000000051e034f000000000505043b000000200220003900000000005204350000002001100039000000000041004b000003780000413d0000006401e00370000000000101043b000006350010009c00000dd20000213d0000002302100039000000000032004b000000000400001900000636040080410000063602200197000000000002004b00000000050000190000063605004041000006360020009c000000000504c019000000000005004b00000dd20000c13d000000040210003900000000022e034f000000000402043b000006350040009c000005930000213d00000005054002100000003f025000390000066f06200197000000400200043d0000000006620019000000000026004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f000000000042043500000024011000390000000005150019000000000035004b00000dd20000213d000000000004004b000003af0000613d00000000041e034f000000000404043b000000200220003900000000004204350000002001100039000000000051004b000003a80000413d0000008401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f0000067101000041000005fa0000013d000006610010009c000005b00000613d000006620010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000201000039000005df0000013d0000064a0010009c000005c60000613d0000064b0010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ef70000040f18c30f9a0000040f000005fa0000013d000006560010009c000005db0000613d000006570010009c00000dd20000c13d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d000000000010043f000000200000043f0000004002000039000000000100001918c3188b0000040f000005df0000013d0000063f0010009c000005e30000613d000006400010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000008401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f0000066b01000041000005fa0000013d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000006a50010019800000dd20000c13d000006a60010009c00000000020000390000000102006039000006a70010009c00000001022061bf000000800020043f0000066d01000041000018c40001042e0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ee30000040f18c315a20000040f000005fa0000013d0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ee30000040f18c313720000040f000005fa0000013d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0000000b0310006c000006280000813d000000400100043d00000064021000390000067303000041000000000032043500000044021000390000067403000041000000000032043500000024021000390000002503000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c500010430000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000302043b0000000002030019000000010030008c00000dd20000213d000c00000002001d18c310010000040f000000400100043d0000000c020000290000062d0000013d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000dd20000213d000000000005004b000004970000613d000000800500003900000000062e034f000000000606043b0000066a0060009c00000dd20000213d000000200550003900000000006504350000002002200039000000000042004b0000048e0000413d0000004402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000600000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000606000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000004ca0000613d000000060400002900000000062e034f000000000606043b000000200440003900000000006404350000002002200039000000000052004b000004c30000413d0000006402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000200000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000206000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000004fd0000613d000000020300002900000000042e034f000000000404043b000000200330003900000000004304350000002002200039000000000052004b000004f60000413d000000800200043d000000000002004b000700000000001d00000c1a0000c13d000000400100043d00000007020000290000062d0000013d0000000001000416000000000001004b00000dd20000c13d0000000601000039000000000101041a000006350010009c000005930000213d00000005041002100000003f024000390000066f02200197000006700020009c000005930000213d0000008002200039000000400020043f000000800010043f0000001f0240018f000000000004004b0000051d0000613d00000000033e034f000000a004400039000000a005000039000000003603043c0000000005650436000000000045004b000005190000c13d000000000002004b000000800400043d000000000004004b000005330000613d00000008020000390000000003000019000000000031004b00000dda0000a13d0000068d0530009a000000000505041a000000000050043f000000200020043f000000000034004b00000dda0000a13d0000066a045001970000000505300210000000a00550003900000000004504350000000103300039000000800400043d000000000043004b000005230000413d000000400100043d00000020020000390000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005440000613d00000080040000390000000005000019000000200440003900000000060404330000066a0660019700000000026204360000000105500039000000000035004b0000053d0000413d0000000002120049000006320020009c00000632020080410000006002200210000006320010009c00000632010080410000004001100210000000000112019f000018c40001042e0000000001000416000000000001004b00000dd20000c13d0000000001000412000e00000001001d000d00000000003d0000800501000039000000440300003900000000040004150000000e0440008a00000005044002100000066e0200004118c318a00000040f000000800010043f0000066d01000041000018c40001042e0000000001000416000000000001004b00000dd20000c13d0000000303000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f0000000100600190000005d50000c13d000000800010043f000000000005004b000006040000613d000000000030043f000000020020008c0000000002000019000006170000413d000006a3030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b000005750000413d000006170000013d000000240130008c00000dd20000413d0000000002000416000000000002004b00000dd20000c13d0000000402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000704043b000006350070009c000005930000213d00000005067002100000003f046000390000066f04400197000006700040009c000006330000a13d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000416000000000001004b00000dd20000c13d0000001201000039000000800010043f0000066d01000041000018c40001042e000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b18c311f30000040f000000000001004b0000000001000039000000010100c039000005fa0000013d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000006401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f000006a201000041000005fa0000013d0000000001000416000000000001004b00000dd20000c13d0000000403000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f0000000100600190000006010000613d0000069b01000041000000000010043f0000002201000039000000040010043f0000069601000041000018c5000104300000000001000416000000000001004b00000dd20000c13d0000000601000039000000000101041a000000800010043f0000066d01000041000018c40001042e000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000c00000002001d0000066a0020009c00000dd20000213d000000000010043f0000000101000039000000200010043f0000004002000039000000000100001918c3188b0000040f0000000c0200002918c30f8a0000040f000000000101041a000000400200043d0000000000120435000006320020009c000006320200804100000040012002100000066c011001c7000018c40001042e000000800010043f000000000005004b0000060a0000c13d000006aa01200197000000a00010043f000000000004004b00000020020000390000000002006039000006170000013d000000000030043f000000020020008c0000000002000019000006170000413d00000677030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b000006100000413d0000002002200039000000800100003918c30e880000040f000000400100043d000c00000001001d000000800200003918c30e730000040f0000000c020000290000000001210049000006320010009c00000632010080410000006001100210000006320020009c00000632020080410000004002200210000000000121019f000018c40001042e00000000010004110000000c0200002918c318330000040f000000400100043d00000001020000390000000000210435000006320010009c000006320100804100000040011002100000066c011001c7000018c40001042e0000008004400039000000400040043f000000800070043f00000024052000390000000006560019000000000036004b00000dd20000213d000000000007004b0000069c0000c13d00000692010000410000000000140435000006320040009c000006320400804100000040014002100000067f011001c7000018c500010430000b00000001001d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000201100039000000000101041a000a00000001001d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000400400043d000006700040009c000005930000213d0000000a02000029000000ff00200190000000000101043b0000008002400039000000400020043f0000000002000039000000010200c0390000004003400039000000000023043500000020024000390000000b0300002900000000003204350000000c02000029000a00000004001d00000000002404350000000101100039000000000301041a000000400200043d000c00000002001d000b00000003001d0000000002320436000900000002001d000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d0000000b0000006b000007be0000c13d0000000904000029000007c80000013d0008000a00100074000006fe0000813d000000400100043d0000004402100039000006a103000041000000000032043500000024021000390000001d03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000008004000039000006a50000013d00000020044000390000006009700039000000000089043500000000007404350000002005500039000000000065004b0000083d0000813d00000000075e034f000000000707043b000006350070009c00000dd20000213d00000000082700190000000007810049000006880070009c00000dd20000213d000000800070008c00000dd20000413d000000400700043d000006700070009c000005930000213d0000008009700039000000400090043f0000002409800039000000000a9e034f000000000a0a043b0000066a00a0009c00000dd20000213d000000000aa704360000002009900039000000000b9e034f000000000b0b043b0000000100b0008c00000dd20000213d0000000000ba04350000002009900039000000000a9e034f000000000a0a043b00000000000a004b000000000b000039000000010b00c0390000000000ba004b00000dd20000c13d000000400b7000390000000000ab0435000000200990003900000000099e034f000000000909043b000006350090009c00000dd20000213d00000000098900190000004308900039000000000038004b000000000a000019000006360a0080410000063608800197000000000008004b000000000b000019000006360b004041000006360080009c000000000b0ac01900000000000b004b00000dd20000c13d000000240890003900000000088e034f000000000a08043b0000063500a0009c000005930000213d000000050ba002100000003f08b000390000066f0c800197000000400800043d000000000cc8001900000000008c004b000000000d000039000000010d0040390000063500c0009c000005930000213d0000000100d00190000005930000c13d0000004000c0043f0000000000a804350000004409900039000000000a9b001900000000003a004b00000dd20000213d0000000000a9004b0000069e0000813d000000000b080019000000000c9e034f000000000c0c043b000000200bb000390000000000cb043500000020099000390000000000a9004b000006f60000413d0000069e0000013d0000000c0000006b0000071f0000c13d000000400100043d00000064021000390000069f0300004100000000003204350000004402100039000006a0030000410000000000320435000000240210003900000024030000390000044c0000013d000000400100043d00000687020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c500010430000000080000006b0000000001000019000007170000613d0000000b01000029000000000101043300000008040000290000000302400210000006a90220027f000006a902200167000000000121016f0000000102400210000000000121019f000007f70000013d000000090000006b0000078d0000c13d000000400100043d00000064021000390000069d03000041000000000032043500000044021000390000069e030000410000000000320435000000240210003900000022030000390000044c0000013d000000400100043d000b00000001001d0000067a0010009c000005930000213d0000000b020000290000002001200039000800000001001d000000400010043f00000000000204350000067b0100004100000000001004430000000a0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400400043d0000067d01000041000000000014043500000084010000390000000101100367000000000101043b0000008402400039000000a00300003900000000003204350000006402400039000000000012043500000044014000390000000902000029000000000021043500000024014000390000000c02000029000000000021043500000000010004100000066a01100197000000040240003900000000001204350000000b010000290000000001010433000000a4024000390000000000120435000c00000004001d000000c402400039000000000001004b00000008060000290000076a0000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000007630000413d0000000002210019000000000002043500000000020004140000000a03000029000000040030008c000007860000613d0000001f01100039000006a801100197000000c401100039000006320010009c000006320100804100000060011002100000000c03000029000006320030009c00000632030080410000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000112019f0000000a0200002918c318b90000040f00000000030100190000006003300270000006320030019d0000000100200190000008de0000613d0000000c01000029000006350010009c000005930000213d0000000c01000029000000400010043f0000000001000019000018c40001042e0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000802000029000000000021041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d0200003900000003030000390000069c040000410000000c05000029000000090600002918c318b90000040f00000001002001900000016e0000c13d00000dd20000013d000000000101043b000000000200001900000009040000290000000b05000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000007c20000413d0000000c0140006a0000001f01100039000006a8021001970000000c01200029000000000021004b00000000030000390000000103004039000006350010009c0000000a02000029000005930000213d0000000100300190000005930000c13d000000400010043f00000060012000390000000c030000290000000000310435000000400100043d000c00000001001d18c30e490000040f0000061e0000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000c0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000007e20000c13d000000080020006c000007f40000813d00000008020000290000000302200210000000f80220018f000006a90220027f000006a9022001670000000c033000290000000003030433000000000223016f000000000021041b0000000801000029000000010110021000000001011001bf0000000302000039000000000012041b0000000a010000290000000001010433000c00000001001d000006350010009c000005930000213d0000000401000039000000000101041a000000010010019000000001021002700000007f0220618f000b00000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000005d50000c13d0000000b01000029000000200010008c000008290000413d0000000401000039000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d0000000c030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b0000000b010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b000008290000813d000000000002041b0000000102200039000000000012004b000008250000413d0000000c010000290000001f0010008c000008780000a13d0000000401000039000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000200200008a0000000c02200180000000000101043b000008860000c13d0000002003000039000008930000013d000000400400043d000000800100043d000000000001004b0000063c0000613d0000000601000039000000000101041a000000000001004b000008840000c13d0000002001400039000000200200003900000000002104350000004002400039000000800300043d0000000000320435000000600540003900000005023002100000000002520019000000000003004b000008b20000c13d0000000002420049000000200320008a00000000003404350000001f02200039000006a8032001970000000002430019000000000032004b00000000030000390000000103004039000006350020009c000005930000213d0000000100300190000005930000c13d000000400020043f000006320010009c000006320100804100000040011002100000000002040433000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000502000039000000000012041b000000800100043d000000000001004b000008fd0000c13d0000000001000019000018c40001042e0000000c0000006b00000000010000190000087d0000613d000000090100002900000000010104330000000c040000290000000302400210000006a90220027f000006a902200167000000000221016f0000000101400210000008a10000013d00000689010000410000063d0000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000a0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b0000088c0000c13d0000000c0020006c0000089e0000813d0000000c020000290000000302200210000000f80220018f000006a90220027f000006a9022001670000000a033000290000000003030433000000000223016f000000000021041b00000001010000390000000c020000290000000102200210000000000112019f0000000402000039000000000012041b0000063801000041000000800010043f0000063902000041000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a0002004430000010000100443000000020100003900000120001004430000063a01000041000018c40001042e000000800600003900000000070000190000000008060019000008b90000013d0000000107700039000000000037004b000008500000813d0000000009420049000000600990008a00000000059504360000002008800039000000000908043300000000ba0904340000066a0aa00197000000000aa20436000000000b0b04330000000100b0008c00000dd40000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b2000390000000000ab043500000060099000390000000009090433000000600a20003900000000006a0435000000800b200039000000000a0904330000000000ab0435000000a00220003900000000000a004b000008b60000613d000000000b0000190000002009900039000000000c0904330000000002c20436000000010bb000390000000000ab004b000008d70000413d000008b60000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000008e60000c13d000000000005004b000008f70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300000000002000019000009040000013d00000006020000290000000102200039000000800100043d000000000012004b000008760000813d0000000501200210000000a00110003900000000030104330000004001300039000c00000001001d0000000001010433000000000001004b0000006004300039000009110000613d00000000010404330000000001010433000000000001004b00000e370000c13d000800000004001d000600000002001d0000002001300039000700000001001d0000000002010433000000010020008c00000dd40000213d00000000010304330000066a01100197000900000002001d000b00000003001d18c310010000040f0000000b0100002900000000010104330000066a01100197000a00000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000021041b0000000a01000029000000000010043f0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000e0e0000c13d0000000601000039000000000101041a000006350010009c0000801002000039000005930000213d00000001041000390000000603000039000000000043041b0000068d0110009a0000000a04000029000000000041041b000000000103041a000900000001001d000000000040043f0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000021041b0000000c010000290000000001010433000a00000001001d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000201100039000000000201041a000006aa022001970000000a0000006b000000010220c1bf000000000021041b000000400100043d000000200200003900000000022104360000000b0300002900000000030304330000066a03300197000000000032043500000007020000290000000002020433000000010020008c00000dd40000213d000000400310003900000000002304350000000c020000290000000002020433000000000002004b0000000002000039000000010200c0390000006003100039000000000023043500000008020000290000000002020433000000800310003900000080040000390000000000430435000000a00310003900000000040204330000000000430435000000c003100039000000000004004b0000099b0000613d00000000050000190000002002200039000000000602043300000000036304360000000105500039000000000045004b000009950000413d0000000002130049000006320020009c00000632020080410000006002200210000006320010009c00000632010080410000004001100210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000121019f0000068a011001c70000800d0200003900000001030000390000068e0400004118c318b90000040f0000000100200190000080100200003900000dd20000613d0000000c010000290000000001010433000000000001004b000008ff0000c13d000000080100002900000000010104330000000003010433000000000003004b00000e3a0000613d00000000030000190000000004000019000a00000003001d0000000503300210000000000131001900000020011000390000000001010433000c00000001001d000000000041004b00000de70000413d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff0010019000000dea0000c13d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a000006aa0220019700000001022001bf000000000021041b0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000101100039000000000301041a000006350030009c0000801002000039000005930000213d000900000003001d0000000103300039000000000031041b000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b00000009011000290000000c04000029000000000041041b0000000a030000290000000103300039000000080100002900000000010104330000000002010433000000000023004b0000801002000039000009bb0000413d000008ff0000013d0009066a0010019b00000000010004100003066a0010019b0000000002000019000800000000001d00000007010000290000000001010433000000000021004b0000000003020019000000040200002900000dda0000a13d0000000001020433000000000031004b00000dda0000a13d000500000003001d000000050130021000000000030200190000002002100039000000a00110003900000000010104330000066a0410019700000007012000290000000001010433000b00000001001d00000000013200190000000001010433000a00000001001d000c00000004001d000000000040043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000a6c0000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000e080000613d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000202100039000000000202041a000000ff0020019000000a8e0000c13d0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff0010019000000e080000613d0000000c01000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000600000001001d0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c00000ae00000613d000000000001004b00000dd40000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000000500000613d000000060000006b00000000010000190000000a030000290000000c0200002900000b730000c13d000000400a00043d000006950100004100000000001a04350000000401a000390000000b0300002900000000003104350000000001000414000000040020008c00000b310000c13d0000000003000031000000200030008c0000002004000039000000000403401900000b5c0000013d000000400a00043d0000002401a000390000000b020000290000000000210435000006930100004100000000001a04350000000401a000390000000302000029000000000021043500000000010004140000000c02000029000000040020008c00000af20000c13d0000000003000031000000200030008c0000002004000039000000000403401900000b1d0000013d0000063200a0009c000006320300004100000000030a40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700020000000a001d18c318be0000040f000000020a000029000000000301001900000060033002700000063203300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000b0d0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000b090000c13d0000001f0740019000000b1a0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000000003001f000000010020019000000e110000613d0000001f01400039000000600210018f00000000040a00190000000001a20019000000000021004b00000000020000390000000102004039000006350010009c000005930000213d0000000100200190000005930000c13d000000400010043f000000200030008c00000dd20000413d0000000001040433000000060110006c0000000a0300002900000de10000413d0000000c0200002900000b740000013d0000063200a0009c000006320300004100000000030a40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700060000000a001d18c318be0000040f000000060a000029000000000301001900000060033002700000063203300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000b4c0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000b480000c13d0000001f0740019000000b590000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000000003001f000000010020019000000e3d0000613d0000001f01400039000000600210018f00000000040a00190000000001a20019000000000021004b00000000020000390000000102004039000006350010009c000005930000213d0000000100200190000005930000c13d000000400010043f000000200030008c00000dd20000413d00000000010404330000066a0010009c00000dd20000213d0000000002000410000000000021004b000000000100003900000001010060390000000a030000290000000c02000029000000010110018f000000010330008a000000000013004b00000ded0000813d000000000020043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000a03000029000000000032001a00000de10000413d0000000002320019000000000021041b000000400100043d000000200210003900000000003204350000000b020000290000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d020000390000000303000039000006980400004100000009050000290000000c0600002918c318b90000040f000000010020019000000dd20000613d0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000401043b0000000a0200002900000000032400a9000000000004004b00000bc30000613d00000000014300d9000000000021004b00000de10000c13d0000000201000039000000000101041a000000000001004b00000be20000613d000a00000001001d000b00000004001d000c00000003001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000101043b0000000b0110006b0000000c0300002900000de10000413d0000000a0010006b0000000a0100002900000be20000213d000000000313004b00000de10000413d000000090000006b00000df00000613d0000000201000039000000000101041a000000000031001a00000de10000413d000c00000003001d00000000013100190000000202000039000000000012041b0000000901000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000c030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000005000019000000090600002918c318b90000040f000000010020019000000dd20000613d0000000c02000029000000080020002a00000de10000413d000800080020002d00000005020000290000000102200039000000800100043d000000000012004b00000a360000413d0000024a0000013d0005066a0010019b00000000010004100008066a0010019b0000000002000019000700000000001d00000006010000290000000001010433000000000021004b000000020300002900000dda0000a13d0000000001030433000000000021004b00000dda0000a13d000400000002001d0000000502200210000000200120003900000000033100190000000003030433000c00000003001d000000000003004b00000ded0000613d000000a00220003900000000020204330000066a0320019700000006011000290000000001010433000900000001001d000b00000003001d000000000030043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0000000c0010006c00000ded0000413d0000000b01000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000c0220006c00000de10000413d000000000021041b0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000401043b0000000c034000b9000000000004004b00000c870000613d00000000014300d90000000c0010006c00000de10000c13d0000000201000039000000000101041a000000000031004b00000cc50000c13d000300000004001d000a00000003001d0000000801000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b00000003030000290000000a0230006b00000de10000413d000300000002001d000000000101041a000100000001001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000101043b0000000302000029000000000021001a0000000a0300002900000de10000413d0000000001210019000000010010006b000000080100002900000cc60000413d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000301041a0000000801000029000a00000003001d000000000001004b00000df70000613d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0003000a0010007400000e010000413d0000000801000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000302000029000000000021041b0000000202000039000000000102041a0000000a030000290000000001310049000000000012041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000805000029000000000600001918c318b90000040f000000010020019000000dd20000613d0000000b01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c00000d570000613d000000000001004b00000dd40000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000000500000613d0000000c01000029000000010010008c00000e0b0000c13d0000067b0100004100000000001004430000000b0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400600043d0000004401600039000000090200002900000000002104350000002401600039000000050200002900000000002104350000068001000041000000000016043500000004016000390000000802000029000000000021043500000000010004140000000b02000029000000040020008c00000daf0000613d000006320060009c000006320200004100000000020640190000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000b02000029000300000006001d18c318b90000040f000000030600002900000000030100190000006003300270000006320030019d000000010020019000000daf0000c13d00000e1d0000013d000000400200043d0000067a0020009c000005930000213d0000002001200039000300000001001d000000400010043f000100000002001d00000000000204350000067b0100004100000000001004430000000b0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400600043d0000008401600039000000a002000039000000000021043500000064016000390000000c0200002900000000002104350000004401600039000000090200002900000000002104350000002401600039000000050200002900000000002104350000067d01000041000000000016043500000004016000390000000802000029000000000021043500000001010000290000000001010433000000a4026000390000000000120435000000c402600039000000000001004b000000030700002900000d910000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00000d8a0000413d0000000002210019000000000002043500000000020004140000000b03000029000000040030008c00000daf0000613d0000001f01100039000006a801100197000000c401100039000006320010009c00000632010080410000006001100210000006320060009c000006320300004100000000030640190000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000112019f0000000b02000029000300000006001d18c318b90000040f000000030600002900000000030100190000006003300270000006320030019d000000010020019000000e2a0000613d000006350060009c000005930000213d000000400060043f0000000901000029000000000016043500000020016000390000000c020000290000000000210435000006320060009c000006320600804100000040016002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d020000390000000303000039000006820400004100000005050000290000000b0600002918c318b90000040f000000010020019000000dd20000613d0000000a02000029000000070020002a00000de10000413d000700070020002d00000004020000290000000102200039000000800100043d000000000012004b00000c1f0000413d000005010000013d0000000001000019000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000003201000039000000040010043f0000069601000041000018c500010430000000000001042f0000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000400100043d00000690020000410000070c0000013d000000400100043d0000068f020000410000070c0000013d000000400100043d00000697020000410000070c0000013d000000400100043d00000044021000390000069903000041000000000032043500000024021000390000001f03000039000006910000013d000000400100043d000000640210003900000685030000410000000000320435000000440210003900000686030000410000000000320435000000240210003900000021030000390000044c0000013d000000400100043d00000064021000390000068303000041000000000032043500000044021000390000068403000041000007270000013d000000400100043d0000069a020000410000070c0000013d000000400100043d0000067e020000410000070c0000013d000000400100043d0000068c020000410000070c0000013d0000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e180000c13d000008ea0000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e250000c13d000008ea0000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e320000c13d000008ea0000013d000000400100043d0000068b020000410000070c0000013d000000400100043d00000691020000410000070c0000013d0000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e440000c13d000008ea0000013d0000002003000039000000000331043600000000540204340000066a0440019700000000004304350000000003050433000000020030008c00000e6d0000813d0000004004100039000000000034043500000040032000390000000003030433000000000003004b0000000003000039000000010300c0390000006004100039000000000034043500000060022000390000000002020433000000800310003900000080040000390000000000430435000000a00410003900000000030204330000000000340435000000c001100039000000000003004b00000e6c0000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b00000e660000413d000000000001042d0000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c50001043000000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000e820000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000e7b0000413d000000000321001900000000000304350000001f02200039000006a8022001970000000001210019000000000001042d0000001f02200039000006a8022001970000000001120019000000000021004b00000000020000390000000102004039000006350010009c00000e940000213d000000010020019000000e940000c13d000000400010043f000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000001f03100039000000000023004b0000000004000019000006360400404100000636052001970000063603300197000000000653013f000000000053004b00000000030000190000063603002041000006360060009c000000000304c019000000000003004b00000ee10000613d0000000105000367000000000315034f000000000303043b000006ab0030009c00000edb0000813d0000001f04300039000006a8044001970000003f04400039000006a807400197000000400400043d0000000007740019000000000047004b00000000080000390000000108004039000006350070009c00000edb0000213d000000010080019000000edb0000c13d000000400070043f000000000434043600000020011000390000000007310019000000000027004b00000ee10000213d000000000215034f000006a8053001980000001f0630018f000000000154001900000ecb0000613d000000000702034f0000000008040019000000007907043c0000000008980436000000000018004b00000ec70000c13d000000000006004b00000ed80000613d000000000252034f0000000305600210000000000601043300000000065601cf000000000656022f000000000202043b0000010005500089000000000252022f00000000025201cf000000000262019f000000000021043500000000013400190000000000010435000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000019000018c500010430000006880010009c00000ef50000213d000000830010008c00000ef50000a13d00000001040003670000000401400370000000000101043b0000066a0010009c00000ef50000213d0000002402400370000000000202043b0000066a0020009c00000ef50000213d0000004403400370000000000303043b0000006404400370000000000404043b000000000001042d0000000001000019000018c500010430000006880010009c00000f820000213d000000240310008c00000f820000413d00000001040003670000000402400370000000000502043b000006350050009c00000f820000213d0000002302500039000000000012004b00000f820000813d0000000402500039000000000224034f000000000802043b000006ab0080009c00000f840000813d00000005078002100000003f027000390000066f06200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000006350060009c00000f840000213d000000010090019000000f840000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b00000f820000213d000000000008004b00000f800000613d000000000802001900000f250000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b00000f800000813d000000000964034f000000000909043b000006350090009c00000f820000213d000000000a5900190000000009a30049000006880090009c00000f820000213d000000800090008c00000f820000413d000000400900043d000006700090009c00000f840000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b0000066a00c0009c00000f820000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c00000f820000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b00000f820000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b0000063500b0009c00000f820000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000006360c008041000006360aa00197000006360d100197000000000eda013f0000000000da004b000000000a000019000006360a0040410000063600e0009c000000000a0cc01900000000000a004b00000f820000c13d000000240ab00039000000000aa4034f000000000c0a043b0000063500c0009c00000f840000213d000000050dc002100000003f0ad000390000066f0ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f0040390000063500e0009c00000f840000213d0000000100f0019000000f840000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cbd001900000000001c004b00000f820000213d0000000000cb004b00000f1e0000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b00000f780000413d00000f1e0000013d0000000001020019000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000066a02200197000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000f980000613d000000000101043b000000000001042d0000000001000019000018c500010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004460019000000000005004b00000fd10000613d0000008007000039000000000800001900000fac0000013d0000000108800039000000000058004b00000fd10000813d0000000009240049000000600990008a00000000069604360000002001100039000000000901043300000000ba0904340000066a0aa00197000000000aa40436000000000b0b04330000000200b0008c00000ff30000813d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b4000390000000000ab043500000060099000390000000009090433000000600a40003900000000007a0435000000800b400039000000000a0904330000000000ab0435000000a00440003900000000000a004b00000fa90000613d000000000b0000190000002009900039000000000c0904330000000004c40436000000010bb000390000000000ab004b00000fca0000413d00000fa90000013d0000000001240049000000200410008a00000000004204350000001f01100039000006a8041001970000000001240019000000000041004b00000000040000390000000104004039000006350010009c00000ff90000213d000000010040019000000ff90000c13d000000400010043f000006320030009c000006320300804100000040013002100000000002020433000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f000000010020019000000fff0000613d000000000101043b000000000001042d0000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000019000018c5000104300006000000000002000200000002001d0000000006010019000000400100043d0000002002100039000006a60300004100000000003204350000002404100039000000000034043500000024070000390000000000710435000006ac0010009c000011e70000813d0000006003100039000000400030043f000000040060008c000300000006001d000010190000c13d0000000001020433000000000010043f0000000003000031000000200030008c000010480000813d0000105c0000013d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010330000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000102f0000c13d000000000005004b000010400000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f000000010020019000000024070000390000105b0000613d000000000100043d0000000306000029000000200030008c0000105c0000413d000000000001004b0000105c0000613d000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006ae0500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000010610000c13d0000000001020433000000000010043f000010920000013d00000003060000290000000008000415000000060880008a0000000508800210000600000000003d000010ec0000013d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000107b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010770000c13d000000000005004b000010880000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000001f0030008c00000000010000390000000101002039000000000112016f000000010010019000000024070000390000109a0000613d000000000100043d00000003060000290000000008000415000000040880008a0000000508800210000000000001004b000400000000003d000400010000603d000010ec0000c13d0000109f0000013d0000000008000415000000050880008a0000000508800210000500010000003d0000000306000029000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006b00500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000010b50000c13d0000000001020433000000000010043f000000200030008c000010e60000413d000000000001004b0000000001000039000000010100c039000010ea0000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010d00000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010cc0000c13d000000000005004b0000000108000029000010de0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f00000001002001900000002407000039000010e80000613d000000000100043d0000000306000029000000200030008c000010b10000813d0000000001000019000010ea0000013d0000000001000019000000030600002900000005028002700000000102100195000000400100043d0000002002100039000006a6040000410000000000420435000000240510003900000000004504350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011140000c13d0000000001020433000000000010043f000000200030008c000011460000413d000000000001004b0000000001000019000011c80000613d000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006ae0500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011480000c13d0000000001020433000000000010043f000000000001004b0000000001000019000011c80000c13d000011800000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000112f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000112b0000c13d000000000005004b00000024070000390000113d0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000000100200190000000000100001900000003060000290000000108000029000011c80000613d000000000100043d000000200030008c000010fd0000813d0000000001000019000011c80000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011630000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000115f0000c13d000000000005004b0000000108000029000011710000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000001f0030008c00000000010000390000000101002039000000000112016f000000010010008c00000024070000390000117f0000c13d000000000100043d0000000306000029000000000001004b0000000001000019000011c80000c13d000011800000013d0000000306000029000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006b10500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011940000c13d0000000002020433000000000020043f000000200030008c0000000001000019000011c50000813d000011c80000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011af0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000011ab0000c13d000000000005004b000011bc0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f000000010020019000000000010000190000000108000029000011c80000613d000000000200043d000000200030008c0000000001000019000011c80000413d000000000002004b0000000001000039000000010100c03900000005028002700000000000020032000011d50000613d0000000100100190000011e30000c13d0000000201000029000000020010008c000011ed0000813d000000000001004b000011e60000613d000000400100043d000006b202000041000011dd0000013d0000000100100190000011e30000613d0000000201000029000000010010008c000011ed0000213d000011e60000613d000000400100043d000006b3020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c5000104300000000201000029000000010010008c000011ed0000213d000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300002000000000002000100000002001d0000066a01100197000200000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000000001004b000012160000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000000001004b000012390000613d0000000201000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000201043b0000000201200039000000000101041a000000ff01100190000012290000613d000000000001042d0000000101000029000000000010043f000000200020043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000ff0110018f000000000001042d0000000001000019000000000001042d0000000001000019000018c5000104300003000000000002000200000002001d0000066a01100197000300000001001d000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b0000000202000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000100000001001d0000000301000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000000010010008c000012910000613d000000000001004b0000132b0000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000000000001004b000013310000613d000000010000006b00000000010000190000000302000029000013210000c13d000000400b00043d000006950100004100000000001b04350000000401b00039000000020300002900000000003104350000000001000414000000040020008c000012e10000c13d0000000003000031000000200030008c000000200400003900000000040340190000130d0000013d000000400b00043d0000002401b0003900000002020000290000000000210435000006930100004100000000001b043500000000010004100000066a011001970000000402b00039000000000012043500000000010004140000000302000029000000040020008c000012a40000c13d0000000003000031000000200030008c00000020040000390000000004034019000012d00000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700030000000b001d18c318be0000040f000000030b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000012c00000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000012bc0000c13d000000000006004b000012cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000013480000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c000013250000213d0000000100200190000013250000c13d000000400010043f000000200030008c000013230000413d00000000010b0433000000010110006c000013420000413d000000000001042d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700030000000b001d18c318be0000040f000000030b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000012fd0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000012f90000c13d000000000006004b0000130a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000013540000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c000013250000213d0000000100200190000013250000c13d000000400010043f000000200030008c000013230000413d00000000010b04330000066a0010009c000013230000213d0000000002000410000000000021004b00000000010000390000000101006039000000010110018f000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c5000104300000001f0530018f0000063406300198000000400200043d00000000046200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d0000135f0000013d0000001f0530018f0000063406300198000000400200043d00000000046200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300006000000000002000400000004001d000500000003001d000300000001001d0000066a01200197000600000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000013970000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000015530000613d0000000601000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000202100039000000000202041a000000ff00200190000013b90000c13d0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000ff00100190000015530000613d0000000601000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000200000001001d0000000601000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000010010008c0000140b0000613d000000000001004b000015610000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000015670000613d000000020000006b0000000001000019000000040300002900000006020000290000149f0000c13d000000400b00043d000006950100004100000000001b04350000000401b00039000000050300002900000000003104350000000001000414000000040020008c0000145d0000c13d0000000003000031000000200030008c00000020040000390000000004034019000014890000013d000000400b00043d0000002401b0003900000005020000290000000000210435000006930100004100000000001b043500000000010004100000066a011001970000000402b00039000000000012043500000000010004140000000602000029000000040020008c0000141e0000c13d0000000003000031000000200030008c000000200400003900000000040340190000144a0000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700010000000b001d18c318be0000040f000000010b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000143a0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000014360000c13d000000000006004b000014470000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000015780000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c0000155b0000213d00000001002001900000155b0000c13d000000400010043f000000200030008c000015400000413d00000000010b0433000000020110006c0000000403000029000015420000413d0000000602000029000014a00000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700020000000b001d18c318be0000040f000000020b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000014790000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000014750000c13d000000000006004b000014860000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000015840000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c0000155b0000213d00000001002001900000155b0000c13d000000400010043f000000200030008c000015400000413d00000000010b04330000066a0010009c000015400000213d0000000002000410000000000021004b0000000001000039000000010100603900000004030000290000000602000029000000010110018f000000010330008a000000000013004b000015490000813d000000000020043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000201041a0000000403000029000000000032001a000015420000413d0000000002320019000000000021041b000000400100043d0000002002100039000000000032043500000005020000290000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000003020000290000066a0520019700000672011001c70000800d0200003900000003030000390000069804000041000500000005001d000000060600002918c318b90000040f0000000100200190000015400000613d0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000015480000613d000000000501043b000000040200002900000000042500a9000000000005004b0000000503000029000014f20000613d00000000015400d9000000000021004b000015420000c13d0000000202000039000000000102041a000000000001004b000015130000613d000300000001001d000400000005001d000600000004001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000015480000613d000000000101043b000000040110006b000000050300002900000006040000290000000202000039000015420000413d000000030010006b0000000301000029000015130000213d000000000414004b000015420000413d000000000003004b0000154c0000613d000000000102041a000000000041001a000015420000413d0000000001410019000000000012041b000000000030043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c70000801002000039000600000004001d18c318be0000040f0000000100200190000015400000613d000000000101043b000000000201041a00000006030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000005000019000000050600002918c318b90000040f0000000100200190000015400000613d0000000601000029000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000000001042f000000400100043d0000069702000041000015550000013d000000400100043d00000044021000390000069903000041000000000032043500000024021000390000001f030000390000156d0000013d000000400100043d0000069a020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000001f0530018f0000063406300198000000400200043d00000000046200190000158f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000157f0000c13d0000158f0000013d0000001f0530018f0000063406300198000000400200043d00000000046200190000158f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000158b0000c13d000000000005004b0000159c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300008000000000002000500000003001d000300000001001d000800000004001d000000000004004b0000175a0000613d0000066a01200197000700000001001d000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000080010006c0000175a0000413d0000000701000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000201041a000000080220006c000017540000413d000000000021041b0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000017530000613d000000000401043b00000008034000b9000000000004004b000015fb0000613d00000000014300d9000000080010006c000017540000c13d00000000010004100000066a021001970000000201000039000000000101041a000000000031004b000400000002001d0000163c0000c13d000200000004001d000600000003001d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000203000029000000060230006b000017540000413d000200000002001d000000000101041a000100000001001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000017530000613d000000000101043b0000000202000029000000000021001a0000000603000029000017540000413d0000000001210019000000010010006b00000004020000290000163c0000413d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000301041a0000000402000029000600000003001d000000000002004b000017630000613d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a00020006001000740000176d0000413d0000000401000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000202000029000000000021041b0000000203000039000000000103041a00000006020000290000000001210049000000000013041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000405000029000000000600001918c318b90000040f0000000100200190000017510000613d0000000701000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000010010008c000016dc0000613d000000000001004b000017810000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000000001004b000017870000613d0000000801000029000000010010008c000017980000c13d0000067b010000410000000000100443000000070100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f0000000100200190000017530000613d000000000101043b000000000001004b000017510000613d000000400600043d0000004401600039000000050200002900000000002104350000068001000041000000000016043500000004016000390000000402000029000000000021043500000003010000290000066a051001970000002401600039000000000051043500000000010004140000000702000029000000040020008c000017370000613d000006320060009c000006320200004100000000020640190000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000702000029000400000006001d000300000005001d18c318b90000040f0000000305000029000000040600002900000000030100190000006003300270000006320030019d0000000100200190000017370000c13d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000017ac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016d70000c13d000017ac0000013d000000400200043d000006b40020009c0000175d0000813d0000002001200039000200000001001d000000400010043f000100000002001d00000000000204350000067b010000410000000000100443000000070100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f0000000100200190000017530000613d000000000101043b000000000001004b000017510000613d000000400600043d0000008401600039000000a00200003900000000002104350000006401600039000000080200002900000000002104350000004401600039000000050200002900000000002104350000067d01000041000000000016043500000004016000390000000402000029000000000021043500000003010000290000066a051001970000002401600039000000000051043500000001010000290000000001010433000000a4026000390000000000120435000000c402600039000000000001004b0000000208000029000017170000613d000000000300001900000000042300190000000007830019000000000707043300000000007404350000002003300039000000000013004b000017100000413d0000000002120019000000000002043500000000020004140000000703000029000000040030008c000017370000613d0000001f01100039000006a801100197000000c401100039000006320010009c00000632010080410000006001100210000006320060009c000006320300004100000000030640190000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000121019f0000000702000029000400000006001d000300000005001d18c318b90000040f0000000305000029000000040600002900000000030100190000006003300270000006320030019d0000000100200190000017a00000613d000006350060009c0000175d0000213d000000400060043f00000005010000290000000000160435000000200160003900000008020000290000000000210435000006320060009c000006320600804100000040016002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d0200003900000003030000390000068204000041000000070600002918c318b90000040f0000000100200190000017510000613d0000000601000029000000000001042d0000000001000019000018c500010430000000000001042f0000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000400100043d00000697020000410000179a0000013d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c500010430000000400100043d00000064021000390000068503000041000000000032043500000044021000390000068603000041000000000032043500000024021000390000002103000039000017760000013d000000400100043d00000064021000390000068303000041000000000032043500000044021000390000068403000041000000000032043500000024021000390000002203000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c500010430000000400100043d0000067e020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c50001043000000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000017ac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000017a80000c13d000000000005004b000017b90000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300004000000000002000400000003001d0000066a011001980000180b0000613d0002066a0020019c000018150000613d000300000001001d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b000000000101041a00010004001000740000181f0000413d0000000301000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b0000000102000029000000000021041b0000000201000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b000000000201041a00000004030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000305000029000000020600002918c318b90000040f0000000100200190000018090000613d000000000001042d0000000001000019000018c500010430000000400100043d0000006402100039000006b90300004100000000003204350000004402100039000006ba03000041000000000032043500000024021000390000002503000039000018280000013d000000400100043d0000006402100039000006b70300004100000000003204350000004402100039000006b803000041000000000032043500000024021000390000002303000039000018280000013d000000400100043d0000006402100039000006b50300004100000000003204350000004402100039000006b603000041000000000032043500000024021000390000002603000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c50001043000030000000000020000066a011001980000186c0000613d000200000003001d0003066a0020019c000018760000613d000100000001001d000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000003030000290000186a0000613d000000000101043b000000000030043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000030600002900000001002001900000186a0000613d000000000101043b0000000202000029000000000021041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d0200003900000003030000390000069c04000041000000010500002918c318b90000040f00000001002001900000186a0000613d000000000001042d0000000001000019000018c500010430000000400100043d00000064021000390000069f0300004100000000003204350000004402100039000006a0030000410000000000320435000000240210003900000024030000390000187f0000013d000000400100043d00000064021000390000069d03000041000000000032043500000044021000390000069e03000041000000000032043500000024021000390000002203000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c500010430000000000001042f000006320010009c00000632010080410000004001100210000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f00000001002001900000189e0000613d000000000101043b000000000001042d0000000001000019000018c50001043000000000050100190000000000200443000000040100003900000005024002700000000002020031000000000121043a0000002004400039000000000031004b000018a30000413d000006320030009c000006320300804100000060013002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f000006bb011001c7000000000205001918c318be0000040f0000000100200190000018b80000613d000000000101043b000000000001042d000000000001042f000018bc002104210000000102000039000000000001042d0000000002000019000000000001042d000018c1002104230000000102000039000000000001042d0000000002000019000000000001042d000018c300000432000018c40001042e000018c5000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000ddd2935029d800000000002000000000000000000000000000000c0000001000000000000000000000000000000000000000000000000000000000000000000000000007bfe950b00000000000000000000000000000000000000000000000000000000a457c2d600000000000000000000000000000000000000000000000000000000c2ee3a0700000000000000000000000000000000000000000000000000000000dd62ed3d00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000f23a6e6100000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000cbf1304d00000000000000000000000000000000000000000000000000000000b58d774f00000000000000000000000000000000000000000000000000000000b58d775000000000000000000000000000000000000000000000000000000000bc197c8100000000000000000000000000000000000000000000000000000000a457c2d700000000000000000000000000000000000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000086937eb30000000000000000000000000000000000000000000000000000000095d89b400000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000008b878cb2000000000000000000000000000000000000000000000000000000007ccc2ec1000000000000000000000000000000000000000000000000000000007ccc2ec2000000000000000000000000000000000000000000000000000000007ddc2cd1000000000000000000000000000000000000000000000000000000007bfe950c000000000000000000000000000000000000000000000000000000007cc253700000000000000000000000000000000000000000000000000000000020e8c564000000000000000000000000000000000000000000000000000000003a51f3820000000000000000000000000000000000000000000000000000000056359ba90000000000000000000000000000000000000000000000000000000056359baa0000000000000000000000000000000000000000000000000000000070a08231000000000000000000000000000000000000000000000000000000003a51f383000000000000000000000000000000000000000000000000000000004c4c45de00000000000000000000000000000000000000000000000000000000313ce56600000000000000000000000000000000000000000000000000000000313ce56700000000000000000000000000000000000000000000000000000000395093510000000000000000000000000000000000000000000000000000000020e8c5650000000000000000000000000000000000000000000000000000000023b872dd000000000000000000000000000000000000000000000000000000000c7056b700000000000000000000000000000000000000000000000000000000150b7a0100000000000000000000000000000000000000000000000000000000150b7a020000000000000000000000000000000000000000000000000000000018160ddd000000000000000000000000000000000000000000000000000000000c7056b800000000000000000000000000000000000000000000000000000000139f11440000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000095ea7b30000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000006d81bf4000000000000000000000000fffffffffffffffffffffffffffffffffffffffff23a6e610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000800000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7fbc197c81000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000207a65726f00000000000000000000000000000000000000000000000000000045524332303a2064656372656173656420616c6c6f77616e63652062656c6f7708c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000000000000000000000008a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0200000200000000000000000000000000000044000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000000000000000000000000000ffffffffffffffdf1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000545c577100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000f341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567636500000000000000000000000000000000000000000000000000000000000045524332303a206275726e20616d6f756e7420657863656564732062616c616e730000000000000000000000000000000000000000000000000000000000000045524332303a206275726e2066726f6d20746865207a65726f20616464726573af1ad76e000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5daa87a000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000099b777de0000000000000000000000000000000000000000000000000000000033195adc0000000000000000000000000000000000000000000000000000000009addddcec1d7ba6ad726df49aeea3e93fb0c1037d551236841a60c0c883f2c12ebca503d1d899889b8a6d039632aa576bbff8cb8233491fbaece7f7773c3417403b2b67000000000000000000000000000000000000000000000000000000007c4ef3dc0000000000000000000000000000000000000000000000000000000090f22bf1000000000000000000000000000000000000000000000000000000008004ef9a0000000000000000000000000000000000000000000000000000000000fdd58e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006352211e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000049986e7300000000000000000000000000000000000000000000000000000000dcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d745524332303a206d696e7420746f20746865207a65726f206164647265737300edcb51b1000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925737300000000000000000000000000000000000000000000000000000000000045524332303a20617070726f766520746f20746865207a65726f206164647265726573730000000000000000000000000000000000000000000000000000000045524332303a20617070726f76652066726f6d20746865207a65726f2061646445524332303a20696e73756666696369656e7420616c6c6f77616e6365000000150b7a0200000000000000000000000000000000000000000000000000000000c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000004e2312e000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa00000000000007530000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f80ac58cd00000000000000000000000000000000000000000000000000000000d9b67a2600000000000000000000000000000000000000000000000000000000185e917c00000000000000000000000000000000000000000000000000000000520b404e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffe0616c616e6365000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062657373000000000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220746f20746865207a65726f2061646472647265737300000000000000000000000000000000000000000000000000000045524332303a207472616e736665722066726f6d20746865207a65726f206164020000020000000000000000000000000000000000000000000000000000000021075256c6208e4b0222227178cfff61ecbe7936dc58d50674e8b5266c15b4f4", + "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252" + ] +} \ No newline at end of file diff --git a/deployments/treasureMainnet/NftVaultManager.json b/deployments/treasureMainnet/NftVaultManager.json new file mode 100644 index 0000000..2cab134 --- /dev/null +++ b/deployments/treasureMainnet/NftVaultManager.json @@ -0,0 +1,376 @@ +{ + "address": "0xe519aaEaEED43f0Ed0cFF4e952C2fD725c8156B7", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address[]", + "name": "_collections", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + } + ], + "name": "depositBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address[]", + "name": "_collections", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + } + ], + "name": "withdrawBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x39C6bF2F2360E993a5eD8E1A30edC01001af64f3", + "contractAddress": "0xe519aaEaEED43f0Ed0cFF4e952C2fD725c8156B7", + "transactionIndex": 0, + "gasUsed": "994786", + "logsBloom": "0x00000000000400080000010000000000000000000000400000000000000000000000000000000000000000000001000000000000000000000000000000000000000100000004040000000028000040000400000000000000000004000000080000000000020100002000000000000800000000000000400000000010000000000400001000000000000004000100000000000100000000080000000000000080820000000000100000000000800100000000002000000000002000010000000000000002008000000000000008000000000010000100000000000000000020800000040000000000000000000001000000000040000000000020000080000000", + "blockHash": "0x1a92344834d4133931581e50ce04d3877bd89fa357c6e12f730e94a443b81694", + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 692848, + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x0000000000000000000000000000000000000000000000001238165f93e8bacc", + "logIndex": 0, + "blockHash": "0x1a92344834d4133931581e50ce04d3877bd89fa357c6e12f730e94a443b81694" + }, + { + "transactionIndex": 0, + "blockNumber": 692848, + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002340000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e7c6316c8e53acab1c01d00b3b7e70cc2b98088a4a1fe4e3b004dacf11a402f87", + "logIndex": 1, + "blockHash": "0x1a92344834d4133931581e50ce04d3877bd89fa357c6e12f730e94a443b81694" + }, + { + "transactionIndex": 0, + "blockNumber": 692848, + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x7c6316c8e53acab1c01d00b3b7e70cc2b98088a4a1fe4e3b004dacf11a402f87" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001e2202750000000000000000000000fd0000213d000001100000213d0000000100200190000000000005004bffffffffffffffff000000200030008c0000013001008041000001300010009c0000000000210435000001100000c13d0000000006000019000000fd0000c13d000000fd0000413d000000000707043b000001300330019700000060033002700000000003010019000000000048004b0000000008980436000000007907043c0000000008020019000000000701034f0000049f0000613d0000000004620019000000400200043d0000013c063001980000001f0530018f0001000000010355000000000006004b000004bf000104300000049f0000013d000000000121019f000000c0011002100000000402000029000000000100041400000000040340190000002004000039000000400800043d000000000035004b000001350040009c0000002005500039000000000036004b000001350050009c00000000080504330000013002008041000001300020009c04bd04b30000040f000000400220021000000005020000290000000000650435000000070a00002900000000050504330000000001010433000000000001004b000000000064004b00000000070000190000002004400039000000000007004b000000000505043b000000000001042d0000001f01400039000000000003001f000000000686019f00000000066701cf000000000767022f0000010006600089000000000868022f00000000086801cf0000000306600210000000000771034f000000000059004b0000000009a90436000000008a08043c000000000801034f00000020074001900000001f0640018f000000400020043f000000000101043b04bd04b80000040f0000013e01000041000000040010043f000000000010043f0000013d01000041000004be0001042e000500000008001d0000002404400039000000400070043f0000000100800190000000010800403900000000080000390000013607700197000000000551034f0000000405400039000000fd0000613d000000000706c01900000139055001970000002305400039000000000404043b000000fd0000813d000000040030008c000000600110018f000000060200002900000130020000410000000603000029000004550000a13d0000000000a2004b000001350020009c0000000102004039000000000200003900000000001204350000000508000029000001300030019d000001300080009c000000000054004b000001350060009c000000000300003100000000020000190000000504000029000000000004004b0000000000180435000000240180003900000020033000390000013906008041000000000741034f0000000006460019000001350070009c0000003f076000390000000506500210000001390050009c000000400080043f000001340020009c000000000002004b0000002400000000ffffffffffffffe07fffffffffffffff00000000ffffffff0000000102000039000000000001042f00000142011001c7000001300030009c0000006001100210000000000112019f000000c0022002100000004001100210000000000042043500000000002504350000000609000029000000060570002900000140011001c700000000020300190000000002084019000002d60000613d000000000200041100000044018000390000046d0000613d000080020200003900000147011001c70000000400b004430000000000100443000001460100004100000000020204330000000002040433000001350080009c00000000005604350000000000520435000000400010043f000001350010009c000000000021004b0000000005020433000000000131019f00000040033002100000000402800039000000040020008c000500000002001d000300000006001d000000000075004b0000019f0000613d0000000507600210000000000200041400000002050000290000000000130435000000050300002900000001033000390000002006600039000000000300001900000000040204330000000000240435000000000500001900000004018000390000000001000411000000800100043d00000139070040410000006404100370000000000075043500000003050000290000000000570435000000000087004b0000000007780019000001390700204100000139060040410000004404100370000000000065004b000001380070009c0000002405500039000000000202043b00000004021003700000000002000416000000840030008c000000400040043f807324cebbca051e28fef17f1357bd79ad40785e1f4e285fda758078210431754c4c45de00000000000000c400000000f242432a0000000042842e0e000000000200000200000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf26506d81bf4000000000000000000000001000000200000000086937eb400000000000000640000000023b872dd000000004e487b710000000000000000ffffffe00000000400000000c2ee3a080000000080000000000000000000000100000000ffffffffffffff7f000000004c4c45de0000000086937eb400000040000001000000000200000000000004bd00000432000004bb00210423000004b60021042100000060013002100000000000140435000000000161019f00000000015101cf000000000151022f0000010005500089000000000656022f00000000065601cf00000000060404330000000305500210000000000161034f000004ac0000613d0000049b0000c13d0000048f0000c13d000004820000c13d000004750000c13d0000002101000039000004620000c13d000000320100003900000011010000390000044a0000c13d0000043e0000c13d0000000001420019000000600210018f000004430000613d0000041e0000613d0000040d0000c13d0000000509000029000004110000613d00000005057000290000013003008041000000000131004900000040012002100000000601000029000000010010019000000001010040390000000001000039000000000012004b0000000602100029000004940000613d000003d90000613d000003c80000c13d000003cc0000613d000000c0024002100000013004008041000001300040009c00000000020340190000000001320049000003df0000613d000000040050008c00000005050000290000000004000414000003a20000413d000000010440003900000000026204360000000006070433000000200770003900000007070000290000000004000019000003a80000613d00000000025404360000000702000029000000640550003900000006050000290000000002240049000003910000413d000000000056004b00000001066000390000000004740436000000000708043300000020088000390000000208000029000003970000613d00000000045404360000004406600039000000060600002900000000052400490000037f0000413d000000000067004b000000010770003900000000048404360000013408800197000003860000613d000000a4047000390000000000640435000000800600043d00000084047000390000000304000029000000040270003900000000002704350000014102000041000000800500003900000024027000390000000607000029000000000042004b000000010400c0390000000004000039000600000002001d00000004021000290000045b0000613d0000035a0000613d000003490000c13d00000004090000290000034d0000613d00000004057000290000000401000029000003600000613d000000040040008c00000000006204350000000402500039000001340620019700000024025000390000013f02000041000000440450003900000004050000290000044f0000c13d00000000055200d9000003220000613d00000000025400a9000400000004001d000000000014004b0000000604100029000004370000613d000003060000613d000002f50000c13d000002f90000613d0000013b011001c7000000a90000013d000001af0000413d00000000001a004b000000010aa00039000004870000613d00000134011001970000014801000041000500000001001d00000000013100190000047a0000013d000002d60000c13d0000014a011001c70000000000010435000000a401800039000001490100004100000001020000290000006401800039000000a0020000390000008401800039000100000001001d000000000141001900000000023100190000029c0000c13d0000000204000029000000000203043300000003030000290000002001c00039000004670000213d000000010010008c000000000102043300000000005104350000006001100039000002450000413d0000000000730435000000004704043400000000030500190000024a0000813d0000000006470019000000010090019000000001090040390000000009000039000000000058004b0000000008850019000000400500043d00000136085001970000003f057000390000000046040434000000000506c019000001390080009c0000013905004041000000000875013f00000139073001970000001f05400039000000000445001900000060054000390000004006100039000000010600c03900000000060000390000004005400039000000010050008c000000000221043600000000520404340000008002100039000001370010009c000000800020008c000001450020009c0000000002430049000000000482001900000000038300190000000002080433000001450030009c00000000018200190000014c021001970000001f01300039000000000151019f00000000014101cf000000000141022f0000010004400089000000000545022f00000000054501cf0000000304500210000000000141034f000001ed0000613d0000001f05300190000001dc0000c13d000000000026004b0000000006760436000000005705043c0000000006080019000000000501034f000001e00000613d00000000024800190000014c04300198000000010c000029000000060b0000290000046e0000613d0000013e011001c70000000003084019000001300300004100010000000c001d000001d70000013d0000000101000367000001c00000c13d00060000000b001d00070000000a001d0000000000b20435000001340b10019700000000002804350000014402000041000000a001c00039000000050ca00210000000000a0000190000030a0000013d000002de0000c13d0000013402200197000600000003001d0000013a01000041000000400300043d000001960000413d000000000013004b00000000066500190000044f0000413d000000000065001a000000000554001900000005053002100000000701000029000001880000413d0000000000630435000000000606043b000000000651034f0000000703000029000200000009001d000000000037004b000000000757001900000000046404360000000704000029000000000084004b000700000008001d000000000448001900000136044001970000003f04700039000000000604043b000000000441034f0000000404500039000001390040009c0000013904400197000000000034004b0000002304500039000000000504043b000001530000413d00000000050900190000015a0000613d0000000000590435000000000097004b0000000007790019000000400900043d000001200000413d00000000007604350000008006000039000001290000613d0000000005450019000000800060043f00000080077000390000004101000039000001160000a13d000001370070009c0000003f075000390000000505600210000000000605043b00000024041003700000000001000019000000ff0000a13d00000131010000410000012000000443000001000010044300000020010000390000000001000416000004220000013d000003f20000c13d0000000403000029000000dd0000413d000000000032004b000000010220003900000000014104360000000004050433000000e30000613d000000000003004b00000000013204360000000003010433000000020100002900000064033000390000000001120049000000cc0000413d000000000043004b000000000252043600000000050604330000000306000029000000d20000613d0000000002430436000000030200002900000044044000390000000002130049000000ba0000413d000000000045004b00000001055000390000000003630436000001340660019700000000060204330000002002200039000000c10000613d000000a4038000390000000000430435000000800400043d0000008403800039000000000031043500000134031001970000014b010000410000008002000039000001ae0000c13d000401340020019b0000009d0000413d0000000000530435000000000541034f0000000203000029000000a40000613d0000000207000029000200000008001d0000006a0000413d000000710000613d0000000307000029000300000008001d000000350000413d0000000000740435000000000751034f0000003e0000613d0000000006560019000000800070043f0000008008800039000001370080009c00000136088001970000003f086000390000000506700210000001100000813d000001430070009c000000000706043b000000000661034f000000040650003900000023065000390000002405100370000001330020009c000000f40000613d000001320020009c000000e002200270000000000201043b000000ec0000c13d00000080040000390001000000310355000700000000000200020000000000020274027300110010000f0272027100d1000302700064000d026f026e026d026c026b000c00d0000d00cf0084000c00ce00cd00830001026a003b002b00010269002a00630268026702660265026402630262026102600002025f0082025e00cc025d002a0001003a025c025b000e00cb00630039025a002900ca025900c900620028000100610027000b00c800600004003800c70081005f003a005e005d005c003b002b00020080007f005b002600c6025800c5005a0059007e00020058000a0057025700c40056007d002a00010004025600c3007c000e002900c200390037025500c100620028000100610027000b007b00600004003800c00081005f003a000c005d005c003b002b00020080007f005b002600c6025400c5005a0059007e00020058000a0057025300c40056007d002a00010004025202510250003b007a024f00390037024e0026024d00bf0036024c0079024b0009024a007800be024900bd0248024702460245005502440077024300bc024202410240023f023e023d023c023b0076023a00bb023900ba02380077023700b9023600b80235023400b702330232023100b6023000b5022f022e022d022c022b007500b40029022a022902280227022600b30225006402240074000600250024022302220036000c02210220021f021e005400d0000d00cf0084000c00ce00cd0083021d021c001e021b006200280001006100270063005d005c021a0073000202190218005b0217021600530052021500510050001e0214005702130056021200270001001d02110210007c000e00cb006300b8020f00390072020e00c900620028000100610027000b00c800600004003800c70081005f003a005e005d005c003b002b00020080007f005b020d020c020b005a0059007e00020058000a0057020a0056007d002a0001000402090208007c000e002900c200390037020700c10206002b000102050204000b007b02030077003800c00202005f003a000c0201020001ff0073000200b201fe01fd002601fc01fb01fa005a0059002800020058000a00d101f901f800cc01f701f6000101f5001d000b00b101f401f301f2007a01f1002900b001f001ef00350036000b00b100b9000b01ee01ed003401ec01eb01ea00b701e901e800af01e701e601e500b5002301e400ae00ad01e3007400060025002401e201e101e001df003501de01dd00ac01dc01db0023002200ad01da01d901d801d7007401d601d50071005501d401d300ab00080007002100aa01d2004f001100100070000f001c000301d1006f003301d001cf01ce01cd01cc01cb01ca01c901c801c701c601c501c401c301c200a901c101c0004e01bf01be01bd01bc006e01bb01ba01b900a8006d006c00a700020003000a00a601b800010006000d01b7006b000101b601b501b401b3000101b2000d01b1000201b0004d01af0083000101ae003401ad000100a501ac0034000401ab01aa00ca000c01a900a401a80034002b000101a701a60027000b007b006001a501a400b000bc01a301a201a10004000c01a00073000200b2019f019e019d019c019b019a019900a300020198000a008200320197002a0001003701960195007a019401930037019201910190018f018e018d018c018b018a01890188006a006900a2006a0069018700a100ae01860035018500a0009f009e0023000800070021009d009c004f0003009b004e003600330068005e0026018401830009018201810009009a003100090079002200090180007800bd00990009017f017e00230064009800710067009700300008000700210020017d00960055002f0033006f001100100070001c0003017c017b006a0069017a0035017900a0009f009e0023000800070021009d009c004f0003009b004e003600330068005e0026009a003100090079002200090178007800be017700ac006e00230064009800710067009700300008000700210020009500960055002f0033006f001100100070001c0003017600a300020082017500bf0174017301720066002e002d0030000800070021002001710031004f00110010000f000600250024004c004b00940170004a0093004900480047016f001d016e00460045002c00440043000e004200410040003f0032003e001c0003016d003d0065016c016b006d006c016a002800020003000a0022004d0006000d006600ba00c30169000401680167007201660165016400bb0163009201620076009100990161016000af015f00b3015e015d015c000800070090002e002d008f008e00950031002f00110010000f000600250024004c004b015b015a004a01590049004800470158001d015700460045002c00440043000e004200410040003f0032003e001c00030156003d006501550154006b00020066004d0006000d002200a10084015301520151000c0150014f014e00a5014d014c014b014a00910149014801470146001d014500380029002c01440143014201410140013f013e013d00a400b40034013c0004013b000b013a0139013801370136013501340133013201310092013000a9012f0004012e012d012c012b012a012901280072012701260125012401230068012200080007008d008c00670121003000200120011f011e00200031002f00110010000f000600250024004c004b0094011d004a0093004900480047011c001d011b00460045002c00440043000e004200410040003f0032003e001c0003011a003d00650119011801170116006b00020115000a004d0006000d01140035006e002e002d0113008b005400b6011200080007008d008c011100ab00aa002e002d008f00200022002f00110010000f000600250024004c004b0110010f004a010e004900480047010d001d010c00460045002c00440043000e004200410040003f0032003e001c0003010b003d010a0076010900a8006d006c00a700020003000a00a60006000d00a20009000800070090008b0054001b001a001900180017001600150014001300120108001f001b001a001900180017001600150014001300120107001f00530052010600510050001e00530052010500510050001e001b001a001900180017001600150014001300120104001f00530052010300510050001e008a001b001a001900180017001600150014001300120102001f000f001b001a001900180017001600150014001300120101001f000f001b001a001900180017001600150014001300120100001f001b001a0019001800170016001500140013001200ff000400fe00fd00fc00fb00fa00f9004e00f800f700f600f500f400f3002e002d0030008e001e008a00f20089003c0075003c00f10089003c0075003c00f00054001e000000000000008800ef000000ee000000000000000000ed00000000000000ec00000088000500050000000000000005008700050005008600000000000000eb000000ea0000000000e900000000000000e80000000000000000000000e7000000000000000000e600e5000000000000000000000085000000e40000000000000000000000e3000000e20000000000000000000000e100000000000000e0000000df000000000000008700050005000500de00dd00dc00db00da00000085000000d900000000000000d80000000000000000000000d7000000d60000000000000005000500050086000000000000000000d500d400d300d2000000000000000000000000000000000000000000000000000000000000", + "logIndex": 2, + "blockHash": "0x1a92344834d4133931581e50ce04d3877bd89fa357c6e12f730e94a443b81694" + }, + { + "transactionIndex": 0, + "blockNumber": 692848, + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x0100014f7eff0225bb4ea532b10563e7ba3d2f50c895b53ebff931d851622fc5", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x1a92344834d4133931581e50ce04d3877bd89fa357c6e12f730e94a443b81694" + }, + { + "transactionIndex": 0, + "blockNumber": 692848, + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x0100014f7eff0225bb4ea532b10563e7ba3d2f50c895b53ebff931d851622fc5", + "0x000000000000000000000000e519aaeaeed43f0ed0cff4e952c2fd725c8156b7" + ], + "data": "0x", + "logIndex": 4, + "blockHash": "0x1a92344834d4133931581e50ce04d3877bd89fa357c6e12f730e94a443b81694" + }, + { + "transactionIndex": 0, + "blockNumber": 692848, + "transactionHash": "0x2508d8c1620781bc6352830219d9122502f13dd0fc0d55be893503c047a7bdbc", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3" + ], + "data": "0x00000000000000000000000000000000000000000000000004e94ea73ece08c0", + "logIndex": 5, + "blockHash": "0x1a92344834d4133931581e50ce04d3877bd89fa357c6e12f730e94a443b81694" + } + ], + "blockNumber": 692848, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 2, + "solcInputHash": "add2d99d454de06c8434504df96c7cdf", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address[]", + "name": "_collections", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + } + ], + "name": "depositBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address[]", + "name": "_collections", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + } + ], + "name": "withdrawBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Vault/NftVaultManager.sol": "NftVaultManager" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Vault/INftVault.sol": { + "keccak256": "0x1b55813c809306ff889c9a07ea9aae68a4267568b5d09226096779b2bc8f552c", + "license": "MIT", + "urls": [ + "bzz-raw://a890283e8f67d5c2d8ff78486e4d2c214587aac76dd941f5d0a3a7a1b02b2280", + "dweb:/ipfs/QmUBhfyiit6VHerjJGmQL2q9C3P3XiX1gjv97jVx37qn6v" + ] + }, + "contracts/Vault/NftVaultManager.sol": { + "keccak256": "0x1464b7d64c2244dca137c8564d3e7ecbf71da5acd5b276f76951611ab29eabb7", + "license": "MIT", + "urls": [ + "bzz-raw://1cd7394bd5718fe50a49f2ec79ebc802b3ca98de6c85ec51b1ae6ef2ed74ea1b", + "dweb:/ipfs/QmSAnZitbAwQQgxFWdQa2DGPjRNcjVe4bqnoemsguM4qvx" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "keccak256": "0x6392f2cfe3a5ee802227fe7a2dfd47096d881aec89bddd214b35c5b46d3cd941", + "license": "MIT", + "urls": [ + "bzz-raw://bd9c47a375639888e726a99da718890ba16d17d7ad9eacb0ccc892d46d1b3ee0", + "dweb:/ipfs/Qmb41W5RUjy2sWg49A2rMnxekSeEk6SvGyJL5tyCCSr7un" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68", + "license": "MIT", + "urls": [ + "bzz-raw://daae589a9d6fa7e55f99f86c0a16796ca490f243fb3693632c3711c0646c1d56", + "dweb:/ipfs/QmR3zpd7wNw3rcUdekwiv6FYHJqksuTCXLVioTxu6Fbxk3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "license": "MIT", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0002000000000002000700000000000200000000030100190000006003300270000001300330019700010000003103550000008004000039000000400040043f0000000100200190000000ec0000c13d000000040030008c000000fd0000413d000000000201043b000000e002200270000001320020009c000000f40000613d000001330020009c000000fd0000c13d000000840030008c000000fd0000413d0000000002000416000000000002004b000000fd0000c13d0000000402100370000000000202043b000001340020009c000000fd0000213d0000002405100370000000000505043b000001350050009c000000fd0000213d0000002306500039000000000036004b000000fd0000813d0000000406500039000000000661034f000000000706043b000001430070009c000001100000813d00000005067002100000003f086000390000013608800197000001370080009c000001100000213d0000008008800039000000400080043f000000800070043f00000024055000390000000006560019000000000036004b000000fd0000213d000000000007004b0000003e0000613d000000000751034f000000000707043b000001380070009c000000fd0000813d000000200440003900000000007404350000002005500039000000000065004b000000350000413d0000004404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060040410000013905500197000000000005004b00000000070000190000013907002041000001390050009c000000000706c019000000000007004b000000fd0000613d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400800043d0000000007780019000300000008001d000000000087004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f0000000307000029000000000057043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b000000710000613d0000000305000029000000000741034f000000000707043b000000200550003900000000007504350000002004400039000000000064004b0000006a0000413d0000006404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060080410000013905500197000000000005004b00000000070000190000013907004041000001390050009c000000000706c019000000000007004b000000fd0000c13d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400800043d0000000007780019000200000008001d000000000087004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f0000000207000029000000000057043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b000000a40000613d0000000203000029000000000541034f000000000505043b000000200330003900000000005304350000002004400039000000000064004b0000009d0000413d000000400800043d000401340020019b000000800100043d000000000001004b000001ae0000c13d0000002401800039000000800200003900000000002104350000014b01000041000000000018043500000000010004110000013403100197000000040180003900000000003104350000008403800039000000800400043d0000000000430435000500000008001d000000a403800039000000000004004b000000c10000613d000000000500001900000020022000390000000006020433000001340660019700000000036304360000000105500039000000000045004b000000ba0000413d0000000002130049000000050400002900000044044000390000000000240435000000030200002900000000040204330000000002430436000000000004004b000000d20000613d000000000300001900000003060000290000002006600039000000000506043300000000025204360000000103300039000000000043004b000000cc0000413d0000000001120049000000050300002900000064033000390000000000130435000000020100002900000000030104330000000001320436000000000003004b000000e30000613d000000000200001900000002050000290000002005500039000000000405043300000000014104360000000102200039000000000032004b000000dd0000413d00000000020004140000000403000029000000040030008c000003f20000c13d0000000003000031000000200030008c00000020040000390000000004034019000004220000013d0000000001000416000000000001004b000000fd0000c13d0000002001000039000001000010044300000120000004430000013101000041000004be0001042e000000840030008c000000fd0000413d0000000002000416000000000002004b000000fd0000c13d0000000402100370000000000202043b000001340020009c000000ff0000a13d0000000001000019000004bf000104300000002404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000fd0000813d0000000405400039000000000551034f000000000605043b000001350060009c000001100000213d00000005056002100000003f075000390000013607700197000001370070009c000001160000a13d0000013d01000041000000000010043f0000004101000039000000040010043f0000013e01000041000004bf000104300000008007700039000000400070043f000000800060043f00000024044000390000000005450019000000000035004b000000fd0000213d000000000006004b000001290000613d0000008006000039000000000741034f000000000707043b000001380070009c000000fd0000813d000000200660003900000000007604350000002004400039000000000054004b000001200000413d0000004404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060040410000013905500197000000000005004b00000000070000190000013907002041000001390050009c000000000706c019000000000007004b000000fd0000613d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400900043d0000000007790019000000000097004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f000000000059043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b0000015a0000613d0000000005090019000000000741034f000000000707043b000000200550003900000000007504350000002004400039000000000064004b000001530000413d0000006404100370000000000504043b000001350050009c000000fd0000213d0000002304500039000000000034004b000000000600001900000139060080410000013904400197000000000004004b00000000070000190000013907004041000001390040009c000000000706c019000000000007004b000000fd0000c13d0000000404500039000000000441034f000000000604043b000001350060009c000001100000213d00000005076002100000003f047000390000013604400197000000400800043d0000000004480019000700000008001d000000000084004b00000000080000390000000108004039000001350040009c000001100000213d0000000100800190000001100000c13d000000400040043f0000000704000029000000000464043600000024055000390000000007570019000000000037004b000000fd0000213d000200000009001d000000000006004b00000000060000190000019f0000613d0000000703000029000000000651034f000000000606043b000000200330003900000000006304350000002005500039000000000075004b000001880000413d00000007010000290000000001010433000000000001004b00000000060000190000019f0000613d00000000030000190000000006000019000000050530021000000000055400190000000005050433000000000065001a0000044f0000413d00000000066500190000000103300039000000000013004b000001960000413d000300000006001d000000400300043d0000013a01000041000600000003001d000000000013043500000000010004140000013402200197000500000002001d000000040020008c000002de0000c13d0000000003000031000000200030008c000000200400003900000000040340190000030a0000013d000000000a000019000000050ca00210000000a001c000390000000001010433000001440200004100000000002804350000000402800039000001340b1001970000000000b2043500000000010004140000000402000029000000040020008c00070000000a001d00060000000b001d000001c00000c13d00000001010003670000000003000031000001d70000013d00010000000c001d000001300080009c000500000008001d000001300300004100000000030840190000004003300210000001300010009c0000013001008041000000c001100210000000000131019f0000013e011001c704bd04b80000040f00000000030100190000006003300270000001300030019d0000013003300197000100000001035500000001002001900000046e0000613d0000000508000029000000070a000029000000060b000029000000010c0000290000014c043001980000000002480019000001e00000613d000000000501034f0000000006080019000000005705043c0000000006760436000000000026004b000001dc0000c13d0000001f05300190000001ed0000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f013000390000014c021001970000000001820019000000000021004b00000000020000390000000102004039000001350010009c000001100000213d0000000100200190000001100000c13d000000400010043f000001450030009c000000fd0000213d000000200030008c000000fd0000413d0000000002080433000001350020009c000000fd0000213d000000000383001900000000048200190000000002430049000001450020009c000000fd0000213d000000800020008c000000fd0000413d000001370010009c000001100000213d0000008002100039000000400020043f0000000052040434000001340020009c000000fd0000213d00000000022104360000000005050433000000010050008c000000fd0000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000000fd0000c13d0000004006100039000000000056043500000060054000390000000005050433000001350050009c000000fd0000213d00000000044500190000001f05400039000000000035004b0000000006000019000001390600804100000139055001970000013907300197000000000875013f000000000075004b00000000050000190000013905004041000001390080009c000000000506c019000000000005004b000000fd0000c13d0000000046040434000001350060009c000001100000213d00000005076002100000003f057000390000013608500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000001350080009c000001100000213d0000000100900190000001100000c13d000000400080043f00000000006504350000000006470019000000000036004b000000fd0000213d000000000064004b0000024a0000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b000002450000413d000000600110003900000000005104350000000001020433000000010010008c000004670000213d0000002001c000390000000303000029000000000203043300000002040000290000029c0000c13d0000000000a2004b000004550000a13d00000000020404330000000000a2004b000004550000a13d00000000023100190000000002020433000500000002001d00000000014100190000000001010433000100000001001d000001460100004100000000001004430000000400b004430000000001000414000001300010009c0000013001008041000000c00110021000000147011001c7000080020200003904bd04b80000040f00000001002001900000046d0000613d000000000101043b000000000001004b000000070a0000290000000603000029000000fd0000613d000000400800043d0000008401800039000000a002000039000000000021043500000064018000390000000102000029000000000021043500000044018000390000000502000029000000000021043500000024018000390000000402000029000000000021043500000149010000410000000000180435000000040180003900000000020004110000000000210435000000a40180003900000000000104350000000001000414000000040030008c000002d60000613d000001300080009c000001300200004100000000020840190000004002200210000001300010009c0000013001008041000000c001100210000000000121019f0000014a011001c70000000002030019000500000008001d04bd04b30000040f000000070a000029000000050800002900000000030100190000006003300270000001300030019d00010000000103550000000100200190000002d60000c13d0000047a0000013d0000000000a2004b000004550000a13d00000000013100190000000001010433000500000001001d000001460100004100000000001004430000000400b004430000000001000414000001300010009c0000013001008041000000c00110021000000147011001c7000080020200003904bd04b80000040f00000001002001900000046d0000613d000000000101043b000000000001004b000000070a0000290000000603000029000000fd0000613d000000400800043d0000004401800039000000050200002900000000002104350000002401800039000000040200002900000000002104350000014801000041000000000018043500000000010004110000013401100197000000040280003900000000001204350000000001000414000000040030008c000002d60000613d000001300080009c000001300200004100000000020840190000004002200210000001300010009c0000013001008041000000c001100210000000000121019f00000140011001c70000000002030019000500000008001d04bd04b30000040f000000070a000029000000050800002900000000030100190000006003300270000001300030019d00010000000103550000000100200190000004870000613d000001350080009c000001100000213d000000400080043f000000010aa00039000000800100043d00000000001a004b000001af0000413d000000a90000013d0000000602000029000001300020009c00000130020080410000004002200210000001300010009c0000013001008041000000c001100210000000000121019f0000013b011001c7000000050200002904bd04b80000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000002f90000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000002f50000c13d000000000006004b000003060000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004370000613d0000001f01400039000000600110018f0000000604100029000000000014004b00000000020000390000000102004039000400000004001d000001350040009c000001100000213d0000000100200190000001100000c13d0000000402000029000000400020043f000000200030008c000000fd0000413d00000006020000290000000004020433000000030500002900000000025400a9000000000005004b000003220000613d00000000055200d9000000000054004b0000044f0000c13d0000000405000029000000440450003900000000002404350000013f020000410000000000250435000000240250003900000005040000290000000000420435000000000200041100000134062001970000000402500039000300000006001d00000000006204350000000002000414000000040040008c000003600000613d0000000401000029000001300010009c00000130010080410000004001100210000001300020009c0000013002008041000000c002200210000000000112019f00000140011001c7000000050200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000004057000290000034d0000613d000000000801034f0000000409000029000000008a08043c0000000009a90436000000000059004b000003490000c13d000000000006004b0000035a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000100000001035500000001002001900000045b0000613d0000001f01400039000000600110018f0000000402100029000600000002001d000001350020009c000001100000213d0000000602000029000000400020043f000000200030008c000000fd0000413d00000004020000290000000002020433000000000002004b0000000004000039000000010400c039000000000042004b000000fd0000c13d0000000607000029000000240270003900000080050000390000000000520435000001410200004100000000002704350000000402700039000000030400002900000000004204350000008404700039000000800600043d0000000000640435000000a404700039000000000006004b000003860000613d000000000700001900000020055000390000000008050433000001340880019700000000048404360000000107700039000000000067004b0000037f0000413d0000000005240049000000060600002900000044066000390000000000560435000000020500002900000000050504330000000004540436000000000005004b000003970000613d000000000600001900000002080000290000002008800039000000000708043300000000047404360000000106600039000000000056004b000003910000413d0000000002240049000000060500002900000064055000390000000000250435000000070200002900000000050204330000000002540436000000000005004b000003a80000613d000000000400001900000007070000290000002007700039000000000607043300000000026204360000000104400039000000000054004b000003a20000413d00000000040004140000000505000029000000040050008c000003df0000613d00000006030000290000000001320049000001300010009c00000130010080410000006001100210000001300030009c000001300200004100000000020340190000004002200210000000000121019f000001300040009c0000013004008041000000c002400210000000000121019f000000050200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000003cc0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000003c80000c13d000000000006004b000003d90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004940000613d0000001f01400039000000600110018f0000000602100029000000000012004b00000000010000390000000101004039000001350020009c000001100000213d0000000100100190000001100000c13d000000400020043f000000200030008c000000fd0000413d000000060100002900000000010104330000000000120435000001300020009c0000013002008041000000400120021000000142011001c7000004be0001042e00000005030000290000000001310049000001300010009c00000130010080410000006001100210000001300030009c00000130030080410000004003300210000000000131019f000001300020009c0000013002008041000000c002200210000000000121019f000000040200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000505700029000004110000613d000000000801034f0000000509000029000000008a08043c0000000009a90436000000000059004b0000040d0000c13d000000000006004b0000041e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004430000613d0000001f01400039000000600210018f00000005040000290000000001420019000000000021004b00000000020000390000000102004039000001350010009c000001100000213d0000000100200190000001100000c13d000000400010043f000000200030008c000000fd0000413d00000000020404330000000000210435000001300010009c0000013001008041000000400110021000000142011001c7000004be0001042e0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000043e0000c13d0000049f0000013d0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000044a0000c13d0000049f0000013d0000013d01000041000000000010043f0000001101000039000000040010043f0000013e01000041000004bf000104300000013d01000041000000000010043f0000003201000039000000040010043f0000013e01000041000004bf000104300000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004620000c13d0000049f0000013d0000013d01000041000000000010043f0000002101000039000000040010043f0000013e01000041000004bf00010430000000000001042f0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004750000c13d0000049f0000013d00000130033001970000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004820000c13d0000049f0000013d00000130033001970000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000048f0000c13d0000049f0000013d0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000049b0000c13d000000000005004b000004ac0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001300020009c00000130020080410000004002200210000000000112019f000004bf00010430000000000001042f000004b6002104210000000102000039000000000001042d0000000002000019000000000001042d000004bb002104230000000102000039000000000001042d0000000002000019000000000001042d000004bd00000432000004be0001042e000004bf0001043000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000004c4c45de000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f00000000000000000000000100000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe04e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000001000000000000000006d81bf4000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000042842e0e00000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000000000000000000000004c4c45de00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000da75807821043175ad40785e1f4e285f28fef17f1357bd79807324cebbca051e", + "deployedBytecode": "0x0002000000000002000700000000000200000000030100190000006003300270000001300330019700010000003103550000008004000039000000400040043f0000000100200190000000ec0000c13d000000040030008c000000fd0000413d000000000201043b000000e002200270000001320020009c000000f40000613d000001330020009c000000fd0000c13d000000840030008c000000fd0000413d0000000002000416000000000002004b000000fd0000c13d0000000402100370000000000202043b000001340020009c000000fd0000213d0000002405100370000000000505043b000001350050009c000000fd0000213d0000002306500039000000000036004b000000fd0000813d0000000406500039000000000661034f000000000706043b000001430070009c000001100000813d00000005067002100000003f086000390000013608800197000001370080009c000001100000213d0000008008800039000000400080043f000000800070043f00000024055000390000000006560019000000000036004b000000fd0000213d000000000007004b0000003e0000613d000000000751034f000000000707043b000001380070009c000000fd0000813d000000200440003900000000007404350000002005500039000000000065004b000000350000413d0000004404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060040410000013905500197000000000005004b00000000070000190000013907002041000001390050009c000000000706c019000000000007004b000000fd0000613d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400800043d0000000007780019000300000008001d000000000087004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f0000000307000029000000000057043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b000000710000613d0000000305000029000000000741034f000000000707043b000000200550003900000000007504350000002004400039000000000064004b0000006a0000413d0000006404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060080410000013905500197000000000005004b00000000070000190000013907004041000001390050009c000000000706c019000000000007004b000000fd0000c13d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400800043d0000000007780019000200000008001d000000000087004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f0000000207000029000000000057043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b000000a40000613d0000000203000029000000000541034f000000000505043b000000200330003900000000005304350000002004400039000000000064004b0000009d0000413d000000400800043d000401340020019b000000800100043d000000000001004b000001ae0000c13d0000002401800039000000800200003900000000002104350000014b01000041000000000018043500000000010004110000013403100197000000040180003900000000003104350000008403800039000000800400043d0000000000430435000500000008001d000000a403800039000000000004004b000000c10000613d000000000500001900000020022000390000000006020433000001340660019700000000036304360000000105500039000000000045004b000000ba0000413d0000000002130049000000050400002900000044044000390000000000240435000000030200002900000000040204330000000002430436000000000004004b000000d20000613d000000000300001900000003060000290000002006600039000000000506043300000000025204360000000103300039000000000043004b000000cc0000413d0000000001120049000000050300002900000064033000390000000000130435000000020100002900000000030104330000000001320436000000000003004b000000e30000613d000000000200001900000002050000290000002005500039000000000405043300000000014104360000000102200039000000000032004b000000dd0000413d00000000020004140000000403000029000000040030008c000003f20000c13d0000000003000031000000200030008c00000020040000390000000004034019000004220000013d0000000001000416000000000001004b000000fd0000c13d0000002001000039000001000010044300000120000004430000013101000041000004be0001042e000000840030008c000000fd0000413d0000000002000416000000000002004b000000fd0000c13d0000000402100370000000000202043b000001340020009c000000ff0000a13d0000000001000019000004bf000104300000002404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000fd0000813d0000000405400039000000000551034f000000000605043b000001350060009c000001100000213d00000005056002100000003f075000390000013607700197000001370070009c000001160000a13d0000013d01000041000000000010043f0000004101000039000000040010043f0000013e01000041000004bf000104300000008007700039000000400070043f000000800060043f00000024044000390000000005450019000000000035004b000000fd0000213d000000000006004b000001290000613d0000008006000039000000000741034f000000000707043b000001380070009c000000fd0000813d000000200660003900000000007604350000002004400039000000000054004b000001200000413d0000004404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060040410000013905500197000000000005004b00000000070000190000013907002041000001390050009c000000000706c019000000000007004b000000fd0000613d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400900043d0000000007790019000000000097004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f000000000059043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b0000015a0000613d0000000005090019000000000741034f000000000707043b000000200550003900000000007504350000002004400039000000000064004b000001530000413d0000006404100370000000000504043b000001350050009c000000fd0000213d0000002304500039000000000034004b000000000600001900000139060080410000013904400197000000000004004b00000000070000190000013907004041000001390040009c000000000706c019000000000007004b000000fd0000c13d0000000404500039000000000441034f000000000604043b000001350060009c000001100000213d00000005076002100000003f047000390000013604400197000000400800043d0000000004480019000700000008001d000000000084004b00000000080000390000000108004039000001350040009c000001100000213d0000000100800190000001100000c13d000000400040043f0000000704000029000000000464043600000024055000390000000007570019000000000037004b000000fd0000213d000200000009001d000000000006004b00000000060000190000019f0000613d0000000703000029000000000651034f000000000606043b000000200330003900000000006304350000002005500039000000000075004b000001880000413d00000007010000290000000001010433000000000001004b00000000060000190000019f0000613d00000000030000190000000006000019000000050530021000000000055400190000000005050433000000000065001a0000044f0000413d00000000066500190000000103300039000000000013004b000001960000413d000300000006001d000000400300043d0000013a01000041000600000003001d000000000013043500000000010004140000013402200197000500000002001d000000040020008c000002de0000c13d0000000003000031000000200030008c000000200400003900000000040340190000030a0000013d000000000a000019000000050ca00210000000a001c000390000000001010433000001440200004100000000002804350000000402800039000001340b1001970000000000b2043500000000010004140000000402000029000000040020008c00070000000a001d00060000000b001d000001c00000c13d00000001010003670000000003000031000001d70000013d00010000000c001d000001300080009c000500000008001d000001300300004100000000030840190000004003300210000001300010009c0000013001008041000000c001100210000000000131019f0000013e011001c704bd04b80000040f00000000030100190000006003300270000001300030019d0000013003300197000100000001035500000001002001900000046e0000613d0000000508000029000000070a000029000000060b000029000000010c0000290000014c043001980000000002480019000001e00000613d000000000501034f0000000006080019000000005705043c0000000006760436000000000026004b000001dc0000c13d0000001f05300190000001ed0000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f013000390000014c021001970000000001820019000000000021004b00000000020000390000000102004039000001350010009c000001100000213d0000000100200190000001100000c13d000000400010043f000001450030009c000000fd0000213d000000200030008c000000fd0000413d0000000002080433000001350020009c000000fd0000213d000000000383001900000000048200190000000002430049000001450020009c000000fd0000213d000000800020008c000000fd0000413d000001370010009c000001100000213d0000008002100039000000400020043f0000000052040434000001340020009c000000fd0000213d00000000022104360000000005050433000000010050008c000000fd0000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000000fd0000c13d0000004006100039000000000056043500000060054000390000000005050433000001350050009c000000fd0000213d00000000044500190000001f05400039000000000035004b0000000006000019000001390600804100000139055001970000013907300197000000000875013f000000000075004b00000000050000190000013905004041000001390080009c000000000506c019000000000005004b000000fd0000c13d0000000046040434000001350060009c000001100000213d00000005076002100000003f057000390000013608500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000001350080009c000001100000213d0000000100900190000001100000c13d000000400080043f00000000006504350000000006470019000000000036004b000000fd0000213d000000000064004b0000024a0000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b000002450000413d000000600110003900000000005104350000000001020433000000010010008c000004670000213d0000002001c000390000000303000029000000000203043300000002040000290000029c0000c13d0000000000a2004b000004550000a13d00000000020404330000000000a2004b000004550000a13d00000000023100190000000002020433000500000002001d00000000014100190000000001010433000100000001001d000001460100004100000000001004430000000400b004430000000001000414000001300010009c0000013001008041000000c00110021000000147011001c7000080020200003904bd04b80000040f00000001002001900000046d0000613d000000000101043b000000000001004b000000070a0000290000000603000029000000fd0000613d000000400800043d0000008401800039000000a002000039000000000021043500000064018000390000000102000029000000000021043500000044018000390000000502000029000000000021043500000024018000390000000402000029000000000021043500000149010000410000000000180435000000040180003900000000020004110000000000210435000000a40180003900000000000104350000000001000414000000040030008c000002d60000613d000001300080009c000001300200004100000000020840190000004002200210000001300010009c0000013001008041000000c001100210000000000121019f0000014a011001c70000000002030019000500000008001d04bd04b30000040f000000070a000029000000050800002900000000030100190000006003300270000001300030019d00010000000103550000000100200190000002d60000c13d0000047a0000013d0000000000a2004b000004550000a13d00000000013100190000000001010433000500000001001d000001460100004100000000001004430000000400b004430000000001000414000001300010009c0000013001008041000000c00110021000000147011001c7000080020200003904bd04b80000040f00000001002001900000046d0000613d000000000101043b000000000001004b000000070a0000290000000603000029000000fd0000613d000000400800043d0000004401800039000000050200002900000000002104350000002401800039000000040200002900000000002104350000014801000041000000000018043500000000010004110000013401100197000000040280003900000000001204350000000001000414000000040030008c000002d60000613d000001300080009c000001300200004100000000020840190000004002200210000001300010009c0000013001008041000000c001100210000000000121019f00000140011001c70000000002030019000500000008001d04bd04b30000040f000000070a000029000000050800002900000000030100190000006003300270000001300030019d00010000000103550000000100200190000004870000613d000001350080009c000001100000213d000000400080043f000000010aa00039000000800100043d00000000001a004b000001af0000413d000000a90000013d0000000602000029000001300020009c00000130020080410000004002200210000001300010009c0000013001008041000000c001100210000000000121019f0000013b011001c7000000050200002904bd04b80000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000002f90000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000002f50000c13d000000000006004b000003060000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004370000613d0000001f01400039000000600110018f0000000604100029000000000014004b00000000020000390000000102004039000400000004001d000001350040009c000001100000213d0000000100200190000001100000c13d0000000402000029000000400020043f000000200030008c000000fd0000413d00000006020000290000000004020433000000030500002900000000025400a9000000000005004b000003220000613d00000000055200d9000000000054004b0000044f0000c13d0000000405000029000000440450003900000000002404350000013f020000410000000000250435000000240250003900000005040000290000000000420435000000000200041100000134062001970000000402500039000300000006001d00000000006204350000000002000414000000040040008c000003600000613d0000000401000029000001300010009c00000130010080410000004001100210000001300020009c0000013002008041000000c002200210000000000112019f00000140011001c7000000050200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000004057000290000034d0000613d000000000801034f0000000409000029000000008a08043c0000000009a90436000000000059004b000003490000c13d000000000006004b0000035a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000100000001035500000001002001900000045b0000613d0000001f01400039000000600110018f0000000402100029000600000002001d000001350020009c000001100000213d0000000602000029000000400020043f000000200030008c000000fd0000413d00000004020000290000000002020433000000000002004b0000000004000039000000010400c039000000000042004b000000fd0000c13d0000000607000029000000240270003900000080050000390000000000520435000001410200004100000000002704350000000402700039000000030400002900000000004204350000008404700039000000800600043d0000000000640435000000a404700039000000000006004b000003860000613d000000000700001900000020055000390000000008050433000001340880019700000000048404360000000107700039000000000067004b0000037f0000413d0000000005240049000000060600002900000044066000390000000000560435000000020500002900000000050504330000000004540436000000000005004b000003970000613d000000000600001900000002080000290000002008800039000000000708043300000000047404360000000106600039000000000056004b000003910000413d0000000002240049000000060500002900000064055000390000000000250435000000070200002900000000050204330000000002540436000000000005004b000003a80000613d000000000400001900000007070000290000002007700039000000000607043300000000026204360000000104400039000000000054004b000003a20000413d00000000040004140000000505000029000000040050008c000003df0000613d00000006030000290000000001320049000001300010009c00000130010080410000006001100210000001300030009c000001300200004100000000020340190000004002200210000000000121019f000001300040009c0000013004008041000000c002400210000000000121019f000000050200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000003cc0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000003c80000c13d000000000006004b000003d90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004940000613d0000001f01400039000000600110018f0000000602100029000000000012004b00000000010000390000000101004039000001350020009c000001100000213d0000000100100190000001100000c13d000000400020043f000000200030008c000000fd0000413d000000060100002900000000010104330000000000120435000001300020009c0000013002008041000000400120021000000142011001c7000004be0001042e00000005030000290000000001310049000001300010009c00000130010080410000006001100210000001300030009c00000130030080410000004003300210000000000131019f000001300020009c0000013002008041000000c002200210000000000121019f000000040200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000505700029000004110000613d000000000801034f0000000509000029000000008a08043c0000000009a90436000000000059004b0000040d0000c13d000000000006004b0000041e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004430000613d0000001f01400039000000600210018f00000005040000290000000001420019000000000021004b00000000020000390000000102004039000001350010009c000001100000213d0000000100200190000001100000c13d000000400010043f000000200030008c000000fd0000413d00000000020404330000000000210435000001300010009c0000013001008041000000400110021000000142011001c7000004be0001042e0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000043e0000c13d0000049f0000013d0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000044a0000c13d0000049f0000013d0000013d01000041000000000010043f0000001101000039000000040010043f0000013e01000041000004bf000104300000013d01000041000000000010043f0000003201000039000000040010043f0000013e01000041000004bf000104300000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004620000c13d0000049f0000013d0000013d01000041000000000010043f0000002101000039000000040010043f0000013e01000041000004bf00010430000000000001042f0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004750000c13d0000049f0000013d00000130033001970000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004820000c13d0000049f0000013d00000130033001970000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000048f0000c13d0000049f0000013d0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000049b0000c13d000000000005004b000004ac0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001300020009c00000130020080410000004002200210000000000112019f000004bf00010430000000000001042f000004b6002104210000000102000039000000000001042d0000000002000019000000000001042d000004bb002104230000000102000039000000000001042d0000000002000019000000000001042d000004bd00000432000004be0001042e000004bf0001043000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000004c4c45de000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f00000000000000000000000100000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe04e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000001000000000000000006d81bf4000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000042842e0e00000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000000000000000000000004c4c45de00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000da75807821043175ad40785e1f4e285f28fef17f1357bd79807324cebbca051e", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + }, + "factoryDeps": [ + "0x0002000000000002000700000000000200000000030100190000006003300270000001300330019700010000003103550000008004000039000000400040043f0000000100200190000000ec0000c13d000000040030008c000000fd0000413d000000000201043b000000e002200270000001320020009c000000f40000613d000001330020009c000000fd0000c13d000000840030008c000000fd0000413d0000000002000416000000000002004b000000fd0000c13d0000000402100370000000000202043b000001340020009c000000fd0000213d0000002405100370000000000505043b000001350050009c000000fd0000213d0000002306500039000000000036004b000000fd0000813d0000000406500039000000000661034f000000000706043b000001430070009c000001100000813d00000005067002100000003f086000390000013608800197000001370080009c000001100000213d0000008008800039000000400080043f000000800070043f00000024055000390000000006560019000000000036004b000000fd0000213d000000000007004b0000003e0000613d000000000751034f000000000707043b000001380070009c000000fd0000813d000000200440003900000000007404350000002005500039000000000065004b000000350000413d0000004404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060040410000013905500197000000000005004b00000000070000190000013907002041000001390050009c000000000706c019000000000007004b000000fd0000613d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400800043d0000000007780019000300000008001d000000000087004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f0000000307000029000000000057043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b000000710000613d0000000305000029000000000741034f000000000707043b000000200550003900000000007504350000002004400039000000000064004b0000006a0000413d0000006404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060080410000013905500197000000000005004b00000000070000190000013907004041000001390050009c000000000706c019000000000007004b000000fd0000c13d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400800043d0000000007780019000200000008001d000000000087004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f0000000207000029000000000057043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b000000a40000613d0000000203000029000000000541034f000000000505043b000000200330003900000000005304350000002004400039000000000064004b0000009d0000413d000000400800043d000401340020019b000000800100043d000000000001004b000001ae0000c13d0000002401800039000000800200003900000000002104350000014b01000041000000000018043500000000010004110000013403100197000000040180003900000000003104350000008403800039000000800400043d0000000000430435000500000008001d000000a403800039000000000004004b000000c10000613d000000000500001900000020022000390000000006020433000001340660019700000000036304360000000105500039000000000045004b000000ba0000413d0000000002130049000000050400002900000044044000390000000000240435000000030200002900000000040204330000000002430436000000000004004b000000d20000613d000000000300001900000003060000290000002006600039000000000506043300000000025204360000000103300039000000000043004b000000cc0000413d0000000001120049000000050300002900000064033000390000000000130435000000020100002900000000030104330000000001320436000000000003004b000000e30000613d000000000200001900000002050000290000002005500039000000000405043300000000014104360000000102200039000000000032004b000000dd0000413d00000000020004140000000403000029000000040030008c000003f20000c13d0000000003000031000000200030008c00000020040000390000000004034019000004220000013d0000000001000416000000000001004b000000fd0000c13d0000002001000039000001000010044300000120000004430000013101000041000004be0001042e000000840030008c000000fd0000413d0000000002000416000000000002004b000000fd0000c13d0000000402100370000000000202043b000001340020009c000000ff0000a13d0000000001000019000004bf000104300000002404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000fd0000813d0000000405400039000000000551034f000000000605043b000001350060009c000001100000213d00000005056002100000003f075000390000013607700197000001370070009c000001160000a13d0000013d01000041000000000010043f0000004101000039000000040010043f0000013e01000041000004bf000104300000008007700039000000400070043f000000800060043f00000024044000390000000005450019000000000035004b000000fd0000213d000000000006004b000001290000613d0000008006000039000000000741034f000000000707043b000001380070009c000000fd0000813d000000200660003900000000007604350000002004400039000000000054004b000001200000413d0000004404100370000000000404043b000001350040009c000000fd0000213d0000002305400039000000000035004b000000000600001900000139060040410000013905500197000000000005004b00000000070000190000013907002041000001390050009c000000000706c019000000000007004b000000fd0000613d0000000405400039000000000551034f000000000505043b000001350050009c000001100000213d00000005065002100000003f076000390000013607700197000000400900043d0000000007790019000000000097004b00000000080000390000000108004039000001350070009c000001100000213d0000000100800190000001100000c13d000000400070043f000000000059043500000024044000390000000006460019000000000036004b000000fd0000213d000000000005004b0000015a0000613d0000000005090019000000000741034f000000000707043b000000200550003900000000007504350000002004400039000000000064004b000001530000413d0000006404100370000000000504043b000001350050009c000000fd0000213d0000002304500039000000000034004b000000000600001900000139060080410000013904400197000000000004004b00000000070000190000013907004041000001390040009c000000000706c019000000000007004b000000fd0000c13d0000000404500039000000000441034f000000000604043b000001350060009c000001100000213d00000005076002100000003f047000390000013604400197000000400800043d0000000004480019000700000008001d000000000084004b00000000080000390000000108004039000001350040009c000001100000213d0000000100800190000001100000c13d000000400040043f0000000704000029000000000464043600000024055000390000000007570019000000000037004b000000fd0000213d000200000009001d000000000006004b00000000060000190000019f0000613d0000000703000029000000000651034f000000000606043b000000200330003900000000006304350000002005500039000000000075004b000001880000413d00000007010000290000000001010433000000000001004b00000000060000190000019f0000613d00000000030000190000000006000019000000050530021000000000055400190000000005050433000000000065001a0000044f0000413d00000000066500190000000103300039000000000013004b000001960000413d000300000006001d000000400300043d0000013a01000041000600000003001d000000000013043500000000010004140000013402200197000500000002001d000000040020008c000002de0000c13d0000000003000031000000200030008c000000200400003900000000040340190000030a0000013d000000000a000019000000050ca00210000000a001c000390000000001010433000001440200004100000000002804350000000402800039000001340b1001970000000000b2043500000000010004140000000402000029000000040020008c00070000000a001d00060000000b001d000001c00000c13d00000001010003670000000003000031000001d70000013d00010000000c001d000001300080009c000500000008001d000001300300004100000000030840190000004003300210000001300010009c0000013001008041000000c001100210000000000131019f0000013e011001c704bd04b80000040f00000000030100190000006003300270000001300030019d0000013003300197000100000001035500000001002001900000046e0000613d0000000508000029000000070a000029000000060b000029000000010c0000290000014c043001980000000002480019000001e00000613d000000000501034f0000000006080019000000005705043c0000000006760436000000000026004b000001dc0000c13d0000001f05300190000001ed0000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f013000390000014c021001970000000001820019000000000021004b00000000020000390000000102004039000001350010009c000001100000213d0000000100200190000001100000c13d000000400010043f000001450030009c000000fd0000213d000000200030008c000000fd0000413d0000000002080433000001350020009c000000fd0000213d000000000383001900000000048200190000000002430049000001450020009c000000fd0000213d000000800020008c000000fd0000413d000001370010009c000001100000213d0000008002100039000000400020043f0000000052040434000001340020009c000000fd0000213d00000000022104360000000005050433000000010050008c000000fd0000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000000fd0000c13d0000004006100039000000000056043500000060054000390000000005050433000001350050009c000000fd0000213d00000000044500190000001f05400039000000000035004b0000000006000019000001390600804100000139055001970000013907300197000000000875013f000000000075004b00000000050000190000013905004041000001390080009c000000000506c019000000000005004b000000fd0000c13d0000000046040434000001350060009c000001100000213d00000005076002100000003f057000390000013608500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000001350080009c000001100000213d0000000100900190000001100000c13d000000400080043f00000000006504350000000006470019000000000036004b000000fd0000213d000000000064004b0000024a0000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b000002450000413d000000600110003900000000005104350000000001020433000000010010008c000004670000213d0000002001c000390000000303000029000000000203043300000002040000290000029c0000c13d0000000000a2004b000004550000a13d00000000020404330000000000a2004b000004550000a13d00000000023100190000000002020433000500000002001d00000000014100190000000001010433000100000001001d000001460100004100000000001004430000000400b004430000000001000414000001300010009c0000013001008041000000c00110021000000147011001c7000080020200003904bd04b80000040f00000001002001900000046d0000613d000000000101043b000000000001004b000000070a0000290000000603000029000000fd0000613d000000400800043d0000008401800039000000a002000039000000000021043500000064018000390000000102000029000000000021043500000044018000390000000502000029000000000021043500000024018000390000000402000029000000000021043500000149010000410000000000180435000000040180003900000000020004110000000000210435000000a40180003900000000000104350000000001000414000000040030008c000002d60000613d000001300080009c000001300200004100000000020840190000004002200210000001300010009c0000013001008041000000c001100210000000000121019f0000014a011001c70000000002030019000500000008001d04bd04b30000040f000000070a000029000000050800002900000000030100190000006003300270000001300030019d00010000000103550000000100200190000002d60000c13d0000047a0000013d0000000000a2004b000004550000a13d00000000013100190000000001010433000500000001001d000001460100004100000000001004430000000400b004430000000001000414000001300010009c0000013001008041000000c00110021000000147011001c7000080020200003904bd04b80000040f00000001002001900000046d0000613d000000000101043b000000000001004b000000070a0000290000000603000029000000fd0000613d000000400800043d0000004401800039000000050200002900000000002104350000002401800039000000040200002900000000002104350000014801000041000000000018043500000000010004110000013401100197000000040280003900000000001204350000000001000414000000040030008c000002d60000613d000001300080009c000001300200004100000000020840190000004002200210000001300010009c0000013001008041000000c001100210000000000121019f00000140011001c70000000002030019000500000008001d04bd04b30000040f000000070a000029000000050800002900000000030100190000006003300270000001300030019d00010000000103550000000100200190000004870000613d000001350080009c000001100000213d000000400080043f000000010aa00039000000800100043d00000000001a004b000001af0000413d000000a90000013d0000000602000029000001300020009c00000130020080410000004002200210000001300010009c0000013001008041000000c001100210000000000121019f0000013b011001c7000000050200002904bd04b80000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000002f90000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000002f50000c13d000000000006004b000003060000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004370000613d0000001f01400039000000600110018f0000000604100029000000000014004b00000000020000390000000102004039000400000004001d000001350040009c000001100000213d0000000100200190000001100000c13d0000000402000029000000400020043f000000200030008c000000fd0000413d00000006020000290000000004020433000000030500002900000000025400a9000000000005004b000003220000613d00000000055200d9000000000054004b0000044f0000c13d0000000405000029000000440450003900000000002404350000013f020000410000000000250435000000240250003900000005040000290000000000420435000000000200041100000134062001970000000402500039000300000006001d00000000006204350000000002000414000000040040008c000003600000613d0000000401000029000001300010009c00000130010080410000004001100210000001300020009c0000013002008041000000c002200210000000000112019f00000140011001c7000000050200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000004057000290000034d0000613d000000000801034f0000000409000029000000008a08043c0000000009a90436000000000059004b000003490000c13d000000000006004b0000035a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000100000001035500000001002001900000045b0000613d0000001f01400039000000600110018f0000000402100029000600000002001d000001350020009c000001100000213d0000000602000029000000400020043f000000200030008c000000fd0000413d00000004020000290000000002020433000000000002004b0000000004000039000000010400c039000000000042004b000000fd0000c13d0000000607000029000000240270003900000080050000390000000000520435000001410200004100000000002704350000000402700039000000030400002900000000004204350000008404700039000000800600043d0000000000640435000000a404700039000000000006004b000003860000613d000000000700001900000020055000390000000008050433000001340880019700000000048404360000000107700039000000000067004b0000037f0000413d0000000005240049000000060600002900000044066000390000000000560435000000020500002900000000050504330000000004540436000000000005004b000003970000613d000000000600001900000002080000290000002008800039000000000708043300000000047404360000000106600039000000000056004b000003910000413d0000000002240049000000060500002900000064055000390000000000250435000000070200002900000000050204330000000002540436000000000005004b000003a80000613d000000000400001900000007070000290000002007700039000000000607043300000000026204360000000104400039000000000054004b000003a20000413d00000000040004140000000505000029000000040050008c000003df0000613d00000006030000290000000001320049000001300010009c00000130010080410000006001100210000001300030009c000001300200004100000000020340190000004002200210000000000121019f000001300040009c0000013004008041000000c002400210000000000121019f000000050200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000003cc0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000003c80000c13d000000000006004b000003d90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004940000613d0000001f01400039000000600110018f0000000602100029000000000012004b00000000010000390000000101004039000001350020009c000001100000213d0000000100100190000001100000c13d000000400020043f000000200030008c000000fd0000413d000000060100002900000000010104330000000000120435000001300020009c0000013002008041000000400120021000000142011001c7000004be0001042e00000005030000290000000001310049000001300010009c00000130010080410000006001100210000001300030009c00000130030080410000004003300210000000000131019f000001300020009c0000013002008041000000c002200210000000000121019f000000040200002904bd04b30000040f000000000301001900000060033002700000013003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000505700029000004110000613d000000000801034f0000000509000029000000008a08043c0000000009a90436000000000059004b0000040d0000c13d000000000006004b0000041e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00010000000103550000000100200190000004430000613d0000001f01400039000000600210018f00000005040000290000000001420019000000000021004b00000000020000390000000102004039000001350010009c000001100000213d0000000100200190000001100000c13d000000400010043f000000200030008c000000fd0000413d00000000020404330000000000210435000001300010009c0000013001008041000000400110021000000142011001c7000004be0001042e0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000043e0000c13d0000049f0000013d0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000044a0000c13d0000049f0000013d0000013d01000041000000000010043f0000001101000039000000040010043f0000013e01000041000004bf000104300000013d01000041000000000010043f0000003201000039000000040010043f0000013e01000041000004bf000104300000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004620000c13d0000049f0000013d0000013d01000041000000000010043f0000002101000039000000040010043f0000013e01000041000004bf00010430000000000001042f0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004750000c13d0000049f0000013d00000130033001970000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004820000c13d0000049f0000013d00000130033001970000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000048f0000c13d0000049f0000013d0000001f0530018f0000013c06300198000000400200043d00000000046200190000049f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000049b0000c13d000000000005004b000004ac0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001300020009c00000130020080410000004002200210000000000112019f000004bf00010430000000000001042f000004b6002104210000000102000039000000000001042d0000000002000019000000000001042d000004bb002104230000000102000039000000000001042d0000000002000019000000000001042d000004bd00000432000004be0001042e000004bf0001043000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000004c4c45de000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f00000000000000000000000100000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe04e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000001000000000000000006d81bf4000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000042842e0e00000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000000000000000000000004c4c45de00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000da75807821043175ad40785e1f4e285f28fef17f1357bd79807324cebbca051e" + ] +} \ No newline at end of file diff --git a/deployments/treasureMainnet/StakingContractMainnet.json b/deployments/treasureMainnet/StakingContractMainnet.json new file mode 100644 index 0000000..c9aa52a --- /dev/null +++ b/deployments/treasureMainnet/StakingContractMainnet.json @@ -0,0 +1,1805 @@ +{ + "address": "0xD5D369e15891074711BA80D80295E2A6D3Ae32eE", + "abi": [ + { + "inputs": [], + "name": "AlreadySubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyUnsubscribed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "innerErorr", + "type": "bytes" + } + ], + "name": "BatchError", + "type": "error" + }, + { + "inputs": [], + "name": "FullyPacked", + "type": "error" + }, + { + "inputs": [], + "name": "IncentiveOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientStakedAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIndex", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimeFrame", + "type": "error" + }, + { + "inputs": [], + "name": "NoToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonZero", + "type": "error" + }, + { + "inputs": [], + "name": "NotStaked", + "type": "error" + }, + { + "inputs": [], + "name": "NotSubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyCreator", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isRewardRounded", + "type": "bool" + } + ], + "name": "IncentiveCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "changeAmount", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newStartTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEndTime", + "type": "uint256" + } + ], + "name": "IncentiveUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Subscribe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Unsubscribe", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "accrueRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "datas", + "type": "bytes[]" + } + ], + "name": "batch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimAllRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint112", + "name": "rewardAmount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "startTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "isRewardRounded", + "type": "bool" + } + ], + "name": "createIncentive", + "outputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "incentiveCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "incentives", + "outputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "isRewardRounded", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "rewardPerLiquidity", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "lastRewardTime", + "type": "uint32" + }, + { + "internalType": "uint112", + "name": "rewardRemaining", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "liquidityStaked", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardPerLiquidityLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeAndSubscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "subscribeToIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "subscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "unstakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "incentiveIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "ignoreRewards", + "type": "bool" + } + ], + "name": "unsubscribeFromIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + }, + { + "internalType": "int112", + "name": "changeAmount", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "newStartTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "newEndTime", + "type": "uint32" + } + ], + "name": "updateIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userStakes", + "outputs": [ + { + "internalType": "uint112", + "name": "liquidity", + "type": "uint112" + }, + { + "internalType": "uint144", + "name": "subscribedIncentiveIds", + "type": "uint144" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x39C6bF2F2360E993a5eD8E1A30edC01001af64f3", + "contractAddress": "0xD5D369e15891074711BA80D80295E2A6D3Ae32eE", + "transactionIndex": 0, + "gasUsed": "3243173", + "logsBloom": "0x00000000000400080000010000000000000000000000400000000000000000000000000000000000000000000001000000000000000000000004010000000000000100000004040000000028000042000400000000000000001000000000080000000000020100002080000000000800000000000000402000000010000000000000001000000000000004000100000000000100000000000000000000000080800004000000100000000000800100100002000000000000002000010000000000000002008000000000000000000000000010000100000000000000000020000000040000000000000000000000000000000040000000000000000080000000", + "blockHash": "0x18d31069b599b0668562a0efe58e446a48359c84e7eac4120563fe79ff501afe", + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 692849, + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x000000000000000000000000000000000000000000000000396ff3f54ac004ae", + "logIndex": 0, + "blockHash": "0x18d31069b599b0668562a0efe58e446a48359c84e7eac4120563fe79ff501afe" + }, + { + "transactionIndex": 0, + "blockNumber": 692849, + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002350000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e9fa8faadcd5235e3a670c3f883ddc1da75bcaa686ef90fbb60e1007b70ce83d8", + "logIndex": 1, + "blockHash": "0x18d31069b599b0668562a0efe58e446a48359c84e7eac4120563fe79ff501afe" + }, + { + "transactionIndex": 0, + "blockNumber": 692849, + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x9fa8faadcd5235e3a670c3f883ddc1da75bcaa686ef90fbb60e1007b70ce83d8" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000062fa06280000000000000000000005c40010009c0000000100200190000005c401008041000000000101043b000000c0011002100000000001000414170c17020000040f00000b630000613d000000200010043f000005e5011001c70000801002000039000000000010043f000000000101041a00000b630000213d000000000020043fffffffffffffffff000000400100043d0000000001000411000000000001004b000000000112019f00000b630000c13d0000001002000029000000000002004b0000000301000039000000000202041a0000000f020000290000000102000039000000200030008c0000004001100210000005dd022001970000170e00010430170c16fd0000040f000005c4033001970000000003010019000006e70000613d00000b630000413d0000000201000039000000000200001900000000003204350000000e02000029000000000223019f0000000000210435000000010010008c000000000021041b000005c402008041000005c40020009c000000000003004b000000000034004b000000000012041b0000800d020000390000000104006039000100000003001f0000006003300270000000000403401900000020040000390000000103000031000000000201041a00000000040000390000000002230049000000000113019f000000040020008c00000b6b0000213d000000000121019f0000800b02000039000005e7011001c70000000000100443000005e601000041000d00000001001d000f00000001001d00000000010004160000000d060000290000000303000039000005df1010012a000014480000613d0000000401000039000000c00220021000000000020004140000000000140435000000000161019f00000000015101cf000000000151022f0000010005500089000000000656022f00000000065601cf0000000006040433000000030550021000000b6b0000c13d001000000001001d0000000103000039000000000010041b000000000001042d00000b080000013d0000000003000039000005c403008041000005c40030009c00000b6b0000413d000000000021004b0000000401c003700000000102200039000006170000213d000000000032004b000005df0020009c0000000001000039000000000600041100000001030060390000001f0030008c000000000100043d000000000141034f000000000047004b0000000007870436000000006806043c0000000007000019000000000601034f0000000100100190000000000405001900000000054400a90000000a04000039000000000343019f000000800330021000000000011200490000000f03000029000000000201043b0000000c020000290000001001000029000005f2011001c7000000000500003900000000004304350000000008980436000000007907043c000000000701034f000005e902200197000000200220021000000000056500d9000005df052000d100000000022500d900000000055700a9000000000521004b000000a00330027000000004012000390000000201200039000007180000c13d0000170d0001042e00000000001204350000000b010000290000000002240049000005df2020012a000000000454019f00000080044002100000000c030000290000062501000041000000040010043f000006240100004100000090022002100000000f01000029000000000232019f000011ae0000613d000005f1011001c700000000040004110000000000310435000005df0030009c000005df023000d1000005fd011001c7000014490000613d000c00000001001d000005dd0010009c000000000005004b000000000202043b000000000301043b000005eb01100197000000000023041b000000000100041a00000004021000390000000001010433000000240310003900000000033200d9000005ec02600197000005eb0060009c000b00000001001d000900000002001d0000000802000029000000240030008c000d00000006001d0000002402100039000011ad0000613d000a00000001001d000000100500002900000090021002700000000e05000029000000000045004b0000002401c00370000000800100043d000005f304000041000000c00330021000000000030004140000000403100039000005f00300004100000000012300a9000000400010043f000005e20010009c000000000131019f00000040033002100000000d01000029000005e80060009c000005c402600197000e00000001001d000000000303041a170c16f00000040f0000000000650435000000000686019f0000000008050433000000000042004b02000000000000000000162d0000613d00000601011001c7000000000048004b00000000080200190000000004620019000000400200043d000005fe063001980000001f0530018f0000000002020433000400000001001d0000000c0100002900000020044001900000001f0540018f00000000004204350000000e0100002900000044021000390000002003000039000000000141016f000000010400203900000001010060390000000a03000029000e00000002001d000000000043004b000000000404041a000000000224019f000005e9033001970000002003300210000000000020041b000000000012004b000000010100c0390000004401c00370000000000100001900000009010000290000000a02000029000000000254016f00000001050020390000001f05500190000000200450019000000000050340190000002005000039000000000023004b00000000022100d9000000010110027200000000033400a9000000010330027200000000022400a900000001003001900000004d0010008c000000ff0010008c00000001020040390000000002000039000000600210018f0000001f01400039000005c403000041000005fc01000041000005de00200198000005ee0030009c000000000343004b0000000104004039000000000323004b0000000003320019000005ed03500197000000010550208a000005ed045000d1000005ed3530012a000005ed04200197000000800420027000000000020060190000000002010019000006310010009c000005ea034001970000000005560019000005df073001970000002003400270000000900640027200000000010440190000000001030019000000000401043b0000000101000039000006170000c13d00000000067601cf000000000676022f0000010007700089000000000606043b000000000878022f00000000087801cf000000000006004b000000050220021000000b630000813dffffffff0000000000000000ffffffff000000000001042f0000004001300210000010ec0000613d00000000001304350000000902000029000000000061043500000000006304350000000006010019000000000316004b000000000016004b00000000022600d90000000002060019000005ef061000d1000005df0620012a000500000001001d000005fa0010009c000000400300043d000005ea03300197000000000056041b0000000005570019000000000706041a0000000306600039000005df074001970000002004300270000005ee0040009c000000000454004b0000000105004039000000000434004b0000000004430019000005ed04600197000000010660208a000005ed056000d1000005ed4640012a000005ed05300197000000800530027000000000030060190000000003020019000006310020009c000000900630027200000000010340190000000001040019000005c404300197000000800010043f00000613011001c7000005df033001970000007002200210000000000301041a0000000003340049000005df031001970000000702000029000600000002001d000005df0010009c000000a00110003900000a1d0000a13d0000000f050000290000001004000029000e00000012005300000000010a04330000000001a200190000000307700210000000000661034f0000001f07400190000000000058004b00000000080a001900000000056a0019000000200640019000000000030a4019000005c400a0009c00000000001a0435000000400a00043d000000000015041b000000000057041b000000000607041a0000000e0700002900000a1a0000813d000a00000002001d0000000803000029000005e20040009c00000000040000190000000402c00370000000000000ffff0000000506000029000010ec0000013d0000060002000041000012330000413d0000000602000029000e0000002100530000000d0300002900000b630000013d0000000c012000fa0000000c0000006b0000000a0a000029000a0000000a001d0000000c032000b90000000c433000b9000000000221004900000008010000290000000c021000b90000000c322000b9000e00030050003d000005fb01100197000000000112022f000000700220027000000018012000c90000000501004039000000060100003900000ec90000413d000005f90010009c00000000010304330000000b0300002900000bbd0000413d000005f80010009c000005f70010009c00000000002304350000000b020000290000004002200210000005df011001970000001201000039000005e80050009c000005c4025001970000000002000411000005f60010009c001000000003001d00000001044000390000061404000041000000000232001900000612044001970000005804300270000005fb022001980000000301100039000005c404200197000005df001001980000084e0000c13d00008010030000390000000202000039000c00000003001d000800000001001d0000000302000029170c16770000040f000300000001001d000000640030008c000900000001001d00000010030000290000000e0300002900000002011003670000000203000039000000000404043b000005e20020009c000005df02100197001000000002001d000003450000013d0000000004d4016f000005c404008041000005c40040009c000000000054004b0000000005000019000f00000002001d000003450000613d00000000022c034f0000000002000416000000240000000000000000000000015452414e534645520000002000000000ffffffffffff00000000000000010000000000040000000002000002000000007fffffffffffffff0000ffffffffffff000016de0000613d000016430000613d0000162f0000413d0000162f0000c13d000016350000613d000500000006001d0000162d0000213d000000000207041a000000050900002900000004080000290000062c0200004100000b5e0000013d0000000f03000039000005ff0300004100000014030000390000061d03000041000000c0034002100000006001300210000000000161034f000005df032000d1000005ec022001970000000d02000029000005eb0040009c00000004011000390000000003030433000000000242019f00000000040404330000000202000029000000000403041a0000000102000029000100000002001d000200000002001d0000004002300039000000050020006c000000070220002900000000023200d9000005df03300198000005ef032000d100000004022000b900000004011000b9000005df0330012a000000060000006b000500040000003d00000011010000390000061e0030009c0000000c04000029000005dd021001970000000004000414000000040230003900000024023000390000061b022001970000002003200270000005df043001970000000903000029000000000013041b0000000f0600002900000acc0000813d0000000d0010006b000005c402100197000500020000003d000500010000003d000011b30000013d000005f0020000410000000703000029000000030200003900000ad50000413d0000000a01000029000005ef022000d1000005df0230012a000005c40110019700000003031000390000000401300039000005dd01100197000000000103041a0000000e0000006b000b00000002001d0000006401c00370000000410100003900000ad50000013d000000200020043f0000068a0000813d000000090040006c0000000b04000029000000000105041a000006110030009c00000eb50000613d000005ec03700197000000000053004b000005eb0070009c000000000334019f000005ea04500197000000000061041b0000000006670019000000000701041a00000000067600d9000005df063000d100000000033600d900000000066800a9000005df08400197000000200450027000000090075002720000000e09000029000005e80070009c000000000501043b000000a002200270000005c4037001970000000d07000029000005b60000613d0000000002030019000000010140008a001000000004001d00000000040104330000000501400210000b00000004001d000000000041004b000005f50020009c000700000002001d000009e60000c13d000000010020008c000000000200041a00000020022000390000000000340435000000000035004b000000840030008c0000060204000041000005f50010009c000005f4011001970000000702300029000700000001001d000000000004004b000007320000013d000000080020006c00000000013100a900000002013003670000000c05000029000000000018041b0000000b06000029000000010210008a0000000701200029000000080000006b000000000024004b0000000004540436000000001501043c000000a004000039000000a0022000390000001f0320018f000000800030043f000000400030043f0000008003300039000005e40030009c000005e3033001970000003f03200039000000000030041b000000010030008c000000000300041a0000000704200029000700240020003d000800000004001d00000000044c034f00000004042000390000002304200039000000a00010043f000000440030008c0000002001000039000000000868022f00000100066000890000000306600210000000c10000613d000005c400b0009c0000000002000410000000000059004b0000000009a90436000000008a08043c000000000904001900000020044000390000061e05002041000000200d00008a0000001002200029000000040030008c000000400040043f0000008004000039747400d51e2c6f0f6222b96f487962c389336ffe0a26acf0a8f5989a7380745c79d93f4900000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf265d935448500000000d06ff88e000000006df327edd2cc811c3d7b930eb066a0e6e5d66ab10df69b6f390b1276974b9463237e6c28000000000000006400000080039f2e1800000000dfa8318d00000000bbfd9e31000000005fd8a1320000000043590000000000005245454e5452414e4e487b710000000063df817100000000172f94ce000000001d0cfdb14dff0228b14c56f887b41ad734cb422145b37c590caf3cdf1c8646c07cb22efb552b712a18b4318cf9a79082053748381ba1d4e551703ddde1b61a1d00000060000000008000000000000000494c4544000000005f46524f4d5f464123b872dd00000000085712170000000047bc7cc80000000000007fffffffffffffff8000000000000000800000000000947bd79cdc4695c1a8f85ca3be88f5cd89d22fc98f1c6c671dd3c6bbd98f0e82ffffffffff000000000000ffffffffff0000000400000080b4fa3fb3000000000000004000000080ea4a6a6b0000000068f6458b18591f3bc54701786d738ba488c30dcf4ee1946b9d78e53230a30507000000a000000000ffffffffffffff00fffffffffffffedf0000000001000000289ea4db381f85f7a971babf0b519848616c5196ee8b2ecf99039fcf0a98f484000000640000000008c379a0000000005f4641494c45440000000000ffffffe0313ce567000000000000000000ffffff00000100000000000100000000000000000000010000000000000000000001000001000000000000ffff000000000000c522be0bc544f303e13656b9ed16526007c1bf935e34a6673ed1528b0fdc7c520000004400000000a9059cbb00000000fffefffffffffffffffffffefffffffffffffffffffffffe08cc6b5d955391325d622183e25ac5afcd93958e4c903827796b89b91644bc980000004000000000ffffffffffffff7fffffffffffffffe00000002000000080000001200000008000000000000000ff000000001e897afb00000000069def880000000052526c800000000022e0772c0000000022e0772b000000005eac62390000000058ff9fe500000000711c316b000000006472119100000000647211900000000058ff9fe400000000862d2d7c0000000073455b9f0000000093d1692f0000000088e70f290000000088e70f2800000000cc40105800000000a2beb51000000000e1a472b900000000e121c10200000000e121c10100000000a2beb50f0000000073455b9e000000400000010000000002000000000000170c000004320000170a0021042500001705002104230000170000210421000016fb0000613d0000063401000041000016c40000613d000016b30000c13d000016b70000613d000016c60000013d0000169f0000c13d0000061c0100004100000024013000390000004401300039000016d70000613d000016d60000613d000080020200003900000633011001c70000000400100443000200000001001d000000000020044300000632020000410002000000000002000016710000613d000016600000c13d000016640000613d0000000605000029000016070000613d000015f60000c13d000015fa0000613d0000160a0000013d000015e20000c13d0000000401000029000300000012005300000000018200d9000000000008004b000015aa0000613d000015a00000613d000015a00000013d0000159d0000c13d0000158c0000c13d000015810000c13d000015980000613d0000162f0000213d00000000010b04330000162d0000413d000016530000c13d000016530000213d0000000001b2001900000001080000290000000207000029000016590000613d00000000066701cf000000000767022f000000000707043b00000000086801cf000000000771034f000015640000613d000015530000c13d00000000090b0019000000000801034f000015570000613d00000000057b001900000020074001900000001f0640018f000000030b00002900030000000b001d00000000030b4019000200000007001d000100000008001d000015aa0000013d000015690000013d000015390000c13d00000000001b0435000000400b00043d000015370000613d0000000201900039000005df3080012a000015250000013d0000151c0000c13d00000000028100a900000000328200a9000005df08300197000000040300002900000003079000390000163b0000613d000400000003001d0006000000000002000014d40000813d000014d40000213d000014d30000013d0000000106000029000014d60000613d000000000308041a000014cc0000a13d000014cc0000413d00000002030000290000000306000029000014d50000613d000100000001001d000000020210003900040000000000020000148d0000413d00000000015104360000000005020433000014930000613d000000400110003900000000030204330000000004310436000014800000c13d00000628020000410000145e0000a13d000014530000c13d000004100000013d000012370000413d000000060020006c000014150000613d00000005022000b9000014380000c13d000013e20000613d000013d10000c13d000013d50000613d000013e50000013d000013be0000c13d000013850000613d0000137b0000613d0000136d0000c13d000013620000c13d000013750000613d000014790000613d000013450000613d000013340000c13d000013380000613d000013850000013d000013480000013d0000131d0000c13d0000131b0000613d00000005011000b90000140f0000013d000014080000c13d0000130a0000013d000013030000c13d000012cb0000613d00000064010000390000128d0000813d0000128d0000213d0000128b0000013d000012850000a13d000012850000413d000600000001001d000600040000003d000005f90020009c000012270000c13d00000621040000410000001802200270000000000242016f0000001804400210000000000332016f000005eb0330027f000005ea04006041000000000445019f000005ea0530027f00000000045401cf000001000530008900000018033000ca0000000603300089000000000400c019000000010400008a0000061e03000041000012120000213d000000050030008c00000070021002700000009003100270000000000001041b170c14dc0000040f000011d00000c13d000011c80000813d000011c80000213d00000b600000013d00000620040000410000061f011001c7000000a00110027000000000002404350000002004300039000005c402200197000011800000613d0000116f0000c13d000011730000613d000011820000013d0000115b0000c13d00000000034300490000000004058019000005df053001970000000003300089000011910000c13d000011350000613d000011240000613d000011130000c13d000011170000613d000010f90000613d000010e80000c13d000009d20000013d00000ecd0000413d000000070220006a0000000d023000fa00000000022300d9000010b10000613d000010d10000c13d0000107e0000613d0000106d0000c13d000010710000613d000010810000013d0000105a0000c13d000010210000613d000010170000613d000010090000c13d00000ffe0000c13d000010110000613d0000144c0000613d00000fe10000613d00000fd00000c13d00000fd40000613d000010210000013d000010b10000013d000010ae0000c13d000010a40000c13d00000f250000613d000005df0110019800000fe40000013d00000fb90000c13d00000fb70000613d00000f650000013d00000f5e0000c13d00000f760000613d00000f230000813d00000f230000213d00000f210000013d00000f1b0000a13d00000f1b0000413d000012320000013d0000122c0000813d000005f80020009c000600020000003d000005f70020009c000005f60020009c000600010000003d0000062902000041000014580000c13d00000e740000813d00000e740000213d0000000d040000290000060c011001c700000000070004110000060b0400004100000004030000390000060a011001c7000000200210003900000040021000390000006002100039000000800210003900000004020000290000000004006019000006090400004100000005040000290000060804400197000000a004400210000000030400002900000607044001970000000203100039000006060440019700000001031000390000060603300197000000000001043500000100013000390000002002300039000300000002001d0000006002300039000500000002001d00000080023000390000060501000041000000a002300039000800000002001d000000c002300039000000e0023000390000012001300039000006040010009c000003920000013d00000bc10000413d00000d9f0000613d00000dc20000c13d00000d6c0000613d00000d5b0000c13d00000d5f0000613d00000d6f0000013d00000d480000c13d00000d0f0000613d00000d050000613d00000cf70000c13d00000cec0000c13d00000cff0000613d000012200000613d00000ccf0000613d00000cbe0000c13d00000cc20000613d00000d0f0000013d00000cd20000013d00000ca70000c13d00000ca50000613d00000d9f0000013d00000d9c0000c13d00000d920000c13d00000c940000013d00000c8d0000c13d00000c520000613d00000c170000813d00000c170000213d00000c150000013d00000c0f0000a13d00000c0f0000413d000011c60000013d0000000906000029000011be0000a13d000011be0000413d0000113c0000c13d000006160030009c000011910000413d000005490000c13d0000062d0400004100000b3e0000613d00000b2d0000c13d00000b310000613d00000ec80000013d00000ec20000813d0000062302000041000006220200004100000b710000c13d0000000003002019000000ff0040008c000005fb03300197000000100340024f000000180010008c0000000f012000fa00000adf0000613d000c0018001000cd00000b060000813d0000000f0020006b0000000502004039000000060200003900000004020000390000061a02000041000011260000013d000010ff0000c13d0000061c0200004100000000040004100000004402300039000000000343001900000b650000613d0000000f0000006b00000b650000213d000006050030009c000005c403200197000000a0021002700000061902200197000000000203041a0000060801100197000000a0011002100000000d0100802900000a9f0000013d00000a8a0000c13d0000000d0000006b000005ec011001970000000e020080290000000e0010006b00000a850000613d000e05c40010019c000000080600002900000e720000013d00000e6a0000a13d00000e6a0000413d0000000d0500002900000032010000390000060f0200004100000a6c0000013d00000a6e0000813d00000a6e0000213d0000060d0200004100000dd20000413d000006030010009c0000000101100039000000000102041a0000000c0020006c000d00000002001d0000000d0200802900000bbc0000013d00000bb60000813d0000000a03000039000006260300004100000b400000013d00000b180000c13d000005dd033001970000000303000029000000000300041100000b0e0000813d00000b6b0000813d00000acf0000813d00000060022002100000004402400039000000000002043500000000022300190000001f04200039000009af0000413d000000000025004b00000020055000390000000000760435000000000707043300000000075400190000000006350019000009b60000613d000000440310003900000000020504330000063002000041000008550000413d000009710000613d000009600000c13d000009640000613d000009730000013d0000094d0000c13d0000000f0400002900000000024200a9000005df4010012a000009190000013d000009110000c13d000e00000007001d00000000031200a900000000431300a90000000002270049000000000703041a000008b20000813d000008b20000213d000008b20000013d000000000019041b000000000058041b000000000608041a000000000409041a000008a90000a13d000008a90000413d000c00000008001d00000003087000390000000f0700002900000618020000410000062702000041000007450000413d0000145b0000813d000005fa0030009c000000000034041b0000000e04000029000000000339019f000007e70000813d000007e70000213d000007e70000013d00000000002a041b000000000293019f00000000050a041a0000000e0a000029000007de0000a13d000000000639004b000007de0000413d000000000905401900000060011002100000000001210049170c14850000040f0000008002000039000008540000c13d0000072b0000c13d0000072f0000613d0000062b01000041000000c40010043f0000062601000041000000a40010043f0000000a01000039000000840010043f0000060001000041000005e001000041000001800010043f0000009001200270000001600010043f0000002001200270000001400010043f000005c401200197000001200030043f000001000010043f000005de00400198000000e00010043f000000a001400270000000c00010043f000005dd01400197000005dd01500197000000000505041a0000000105100039000000020410003900000a5a0000c13d00000a130000a13d00000a130000413d00000000060500190000000b050000290000000202300039000800000003001d000008510000c13d000000000013004b000f00000003001d000006170230019700000000010060190000061601000041000006150030019800000610010000410000060f01000041000009f70000c13d000000a401c003700000008401c00370000000c40030008c0000062e02000041000009ca0000813d000000070230006c000007220000a13d000009c30000813d00000b060000613d001000700010027a0000062a0200004100000a230000c13d000000010130008a000005e101000041170c14940000040f0000000104000039000000010310008a000005ca0020009c000006ed0000613d000005c90020009c0000042b0000413d0000145b0000213d000004c90000813d000004c90000213d000004c90000013d000000000029041b000000000509041a000004c10000a13d000000000632004b000004c10000413d00000000020540190000000002040019000000040500002900000eb80000813d000005f403100197000400000002001d000000010300c0390000006402c00370000003cf0000413d000000000052004b000000000303043b00000000032c034f000003d60000613d00000000052500190000002402200039000000800060043f000000400070043f0000008007700039000005e40070009c000005e3077001970000003f075000390000000505600210000005e20060009c000000000605043b00000000055c034f000000040520003900000023052000390000004402c00370000005d50020009c0000068e0000613d000005d40020009c00000b5f0000013d0000000305000029000009ed0000813d0000000301000029000005cf0020009c0000065d0000613d000005ce0020009c000007420000c13d0000033a0000413d0000002001100039000000200330003900000000041c034f000000800300003900000000021200190000002401100039000000800040043f000000400050043f0000008005500039000005e40050009c000005e3055001970000003f052000390000000502400210000000000402043b0000002302100039000005da0020009c0000061d0000613d000005d90020009c000005510000013d0000002402200370000000100200035f00100000000c0353000005cc0020009c000005f60000613d000005cb0020009c000005300000213d000005c80020009c0000012f0000413d000002ca0000613d000002b90000c13d000002bd0000613d000002cc0000013d000002a60000c13d00000000016200d90000026e0000613d000000100310006b000000100010006b000002640000613d00000010022000f9000002560000c13d0000024b0000c13d0000025e0000613d000010e10000613d0000022e0000613d0000021d0000c13d000002210000613d0000000c0a000029000c0000000a001d000b00000006001d0000026e0000013d000002320000013d000002050000c13d000002030000613d000005ef011000d1000005df3060012a000001f20000013d000005df0120012a000001ea0000c13d00000000026100a900000000326200a9000005df062001970000018c0000813d0000018c0000213d0000018c0000013d000000000408041a0000000c08000029000001830000a13d000001830000413d000e00030070003d0000001007000029000007320000613d000001270000c13d0000012b0000613d000005d70020009c000005b90000613d000005d60020009c000003a30000213d000005d30020009c0000060e010000410000007001100270000000800020043f000005dd0020009c0000002402c00370000005d10020009c000005550000613d000005d00020009c000003470000213d000005cd0020009c000002fb0000213d000005c70020009c000005c50100004100000120000004430000010000100443000000370000413d0000000000f2004b000009a20000613d0000000000670435000000000696019f00000000066801cf000000000808043b000000000969022f00000000096901cf0000000009070433000000000881034f0000001f06600190000000b00000c13d00000000007a004b000000000aba0436000000009b09043c000000000a040019000000000901034f000000b40000613d00000000078400190000000008d6017000000000046504360000000100700190000000010700403900000000070000390000000004450019000000400500043d0000003f044000390000001f04600039000006170000813d0000062f0060009c0000006005000039000005c406400197000105c40040019d00000060044002700000000004010019000000010220018f000000020c00036700000000030000310000000e0e0000290000000d0f000029170c17070000040f000000c003500210000005c405008041000005c40050009c00000040034002100000006001b00210000005c40b008041000000960000013d0000000106000031000000800000c13d000000000500041400000000000504350000000005b400190000000307800210000000000676034f000000770000613d0000001f08b00190000000660000c13d000000000806034f0000006a0000613d0000000005740019000000400400043d0000000007db017000000000064c034f000000000605c0190000061e0080009c0000061e060040410000000006000019000000000067004b000000000867013f0000061e074001970000061e065001970000000005b30049000005e200b0009c000000000b02043b00000000024c034f0000001004200029000000000504c0190000061e0070009c0000061e04004041000000000056004b000000000756013f0000061e062001970000061e05400197000000430440008a0000000004e30049000d0000000f001d000e0000000e001d00000000000f004b0000000502f002100010002400e0003d000005e200f0009c000000000f02043b0000000402e000390000002302e00039000005e200e0009c000000000e02043b000005dc0020009c0000054d0000613d000005db0020009c000003160000213d000005d80020009c000000f70000213d000005d20020009c000000d20000213d000005c60020009c000000e00220027000000000020c043b00000000013c034f000005c403100197000000c80000c13d000005c40010019d000000600110027000000000010c001900020000000c0355000000000c01034f001000000000000200030000000000020627062606250624062306220621028e028d00020620061f028c0024061e061d061c061b061a0619061806170616061506140613001500b5002401cf00170015017f06120611000e06100065012d060f01ce060e060d000e060c060b028b0065000e060a01cd028a002606090608060701cc012c028b01ce00a70606060506040603060201cb028900d3017e0601060005ff00a6000805fe05fd05fc05fb000e05fa028805f905f805f705f605f505f401ca01cb028905f305f2012b001505f105f005ef05ee05ed05ec028702860285028405eb05ea05e905e805e700d2012a0129012801270126012500d100d005e605e505e40283003d05e305e2001b05e1028205e005df01c901c805de003c05dd05dc05db003c05da05d905d8028a05d705d605d505d405d305d205d1012b028e05d0028105cf05ce05cd01c705cc01c705cb05ca01ca05c905c8017d006405c70124028d05c605c505c405c305c205c105c005bf05be05bd05bc028105bb028005ba05b905b805b7027f027e05b605b505b4001705b3001a006305b205b101c60046001300150123005a027d05b005af05ae008e05ad05ac05ab05aa05a905a805a70015027c00240046001300150062000400a5000e05a600a701c505a5000e000c004b000900cf0016000f000900cf000d01c405a405a3027b05a2008e05a105a0059f059e059d001500b5002401cf00170015017f00a701c3000e027a0030012d0279027801c20277017d000e027600b4012c02750030000e02740273008d01c1027202710270026f0064026e026d017c026c026b0017059c026a0269026802670266059b002f0265059a0026017b012c00b30264004501c000040263005900ce0065017a000c002500090006000100030005000a000b000700020008007a008c0044000d00cd01c5008b00a4000d00b20043004200060001000300050041004000070002004a026200cc01bf008a0021012200300121012000cb0599059805970089059605950594011f0023003b011e011d008800870086008501790178011c0177003b00840083011b0029001402610079059300b100790260059200d3059100b0003f0176025f000400450012000c004b00090006000100030005000a000b0007000200080004001600630019001e000f00090006000100030005000a000b0007000200080004000d00580012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b0007000200080004000d001300a300160590002800190078011a01190118058f011700770076011601150077007601140030011301120111058e0110003a010f010e058d058c058b010d000e058a0049025e004900780589005800ca0039010c05880175010b01740006001e003d05870038001c0037003605860026058505840173010a017200c900010003000500c800a2058300070582002200350021001c003700360171017005810082016f00810080016e0580016d057f016c016b00d2012a0129012801270126012500d100d000340002057e026201090108016a00610107010600c700640002012400c6001c002401690105000e0104003e001300160059057d001b00220075010300740033010201010073057c0017002300590075007200740033010000ff0073057b057a00c50017057900fe00fd00570578006005770026057600a100af00a000580057012b0023057500280019016800600012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040028002c00ca0039001100ae0167007f00c4009f00c3009e007f00c2001e003d057400ad000c0038001b057300010003001d005f005e00c1003c009d0020002200350021001c00fc00fb00fa057200710070006f006e006d057100f90570006c00560055005400530004005200510050004f004e0034006b002b003a0033006a007e00f8002f005d006900110002009c00f700290002009c0016002a00010003001d004d002e002d004c0014007d0032004800c00166006800200002000800bf00f60061016500f5016401be009f0063025d056f025c056e056d056c056b056a0015027c00240046001300150062000400a5000e000c00180009056900cf0568056700a7000f000900cf0566056505640563001500b500240046001300150062000400c7000e05620065012d00ac01ce0561017d00640560055f055e055d0064055c055b055a055905580065000e025b01cd0557055601c20555007f05540061055300bf01bd0013055200f4008e05510550054f001501bc00240046001300150062000401bb00a5000e00be0004025a0163000e00f3007a0017006700f2016200f1001500ab002b008d0025005a054e016101ba0012000c004b00090006000100030005000a000b000700020008000401b9000f00090006000100030005000a000b000700020008000401b8000d016001b702590066003e0258001400b400310257054d00110161002a00010003001d004d002e002d004c0014007d003200480256054c054b054a0549054800150255002400460013001500620004005800a5000e00be00040163000e054700a701c3000e05460254012d0545054405430542006405410540053f053e0064053d053c053b053a05390254000e012b05380537053602880253025205350534053300a70017005d05320065001502510250024f01b600f001c4007c024e01ba0012000c004b00090006000100030005000a000b00070002000800040016001e0531000f00090006000100030005000a000b000700020008000401b8000d016001b702590066003e0530009b017c00aa024d052f00110161002a00010003001d004d002e002d004c0014007d003200480256052e0068002000020008001b00f000bf01bd001301cd017e00bf024c01b50165024b024a016402490025005a0248024700190061017a0012000c001800090006000100030005000a024600070002000800040016000f00090006000100030005000a000b0007000200080004000d001301b4007c000c002500090006000100030005000a000b000700020008000400450012000c004b00090006000100030005000a000b0007000200080004001a0063017b0019001e000f00090006000100030005000a000b0007000200080004000d01b30245001a008c000d00a4008b00cd000d00440043004200060001000300050041004000070002004a02440243007b024201b2024100bd052d052c0240009a01b1052b052a0529023f0528023e0023015f023d023c023b023a02390238023702360235015f00ef00ee0234023300290527052602320525023105240230009b01bf00aa000d00450012000c001800090006000100030005000a000b00070002000800040016000f00090006000100030005000a000b0007000200080004001a002c0012000c004b00090006000100030005000a000b000700020008000400f60019001e000f00090006000100030005000a000b0007000200080004001601b0022f015e022e00bc052301af01ae00ed015d015c009b002c022d00bb01ad0066003e00a90099001401760006000100030005015b0032004801ac00ba0068002000020008001b00f0022c01ab022b052201c605210520051f001500b500240046001300150062000402510250008d01b600f0051e051d00ec00eb022a000c022900cf051c0123005a00f4008e0046001300150123000d015a051b008e00b50024004600130015006200a800ab002b008d0025005a051a001b00190061022a01aa0012000c001800090006000100030005000a000b00070002000800040016000f00090006000100030005000a000b0007000200080004000d001301b4007c000c002500090006000100030005000a000b000700020008000400450012000c004b00090006000100030005000a000b0007000200080004001a006300ea0019001e000f00090006000100030005000a000b0007000200080004000d01b3051900110518005c01bc002400460013001500620004005800a5000e00be0004004500f3007a0017006700f200ea00f1001500ab002b008d0025005a0012000c004b00090006000100030005000a000b00070002000800040016000f00090006000100030005000a000b00070002000800040044000d0517051601a90515001b022800b5002401cf00170015017f00a701c3000e027a0030012d0279027801c20277017d000e027600b4012c02750030000e02740273008d01c1027202710270026f05140098000c022700970096001f01bc00240046001300150062000401bb00a5000e00be0004025a0163000e00f3007a0017006700f2016200f1001500ab002b008d0025005a0012000c004b00090006000100030005000a000b000700020008000401b9000f00090006000100030005000a000b000700020008000401b8000d016001b70513051200110511005c0510002400460013001500620004005800a5000e00be0004004500a5000e00f3000400cd0163000e0226000400440001000e050f000400a40001000e050e007a0017006700f2022500f1001500ab002b008d0025005a0224050d050c015a050b001f0255002400460013001500be00a8050a050905080507003f017f00a701c505060505001500f3000400cd0001000e0226000400440001000e00ab002b008d0025005a0016000f00090006000100030005000a000b00070002000800a80223022201a800f1050402210503050200b30019017b00a4000d00b20043004200060001000300050041004000070002004a050101a700e9008a015900a800eb01580157050001a604ff008904fe009500ce015604fd0098000c01a500970096001f00b5002400460013001500620004000c0025000900cf00ac0019022000ce04fc00ec04fb04fa000d0222015a04f9027b04f804f704f6021f04f504f4006700f204f304f204f104f004ef01a404ee04ed04ec04eb008e04ea015a027d04e904e804e704e604e504e4001f026e026d017c026c026b001704e3026a026902680267026604e2002f026504e10123005a0011005804e004df001604de0001000304dd002e002d01a3003f008e001b01b5017e00bf024c016500ab002b024f024b024a016402490025005a0248024700190061017a0012000c001800090006000100030005000a024600070002000800040016000f00090006000100030005000a000b0007000200080004000d001301b4007c000c002500090006000100030005000a000b000700020008000400450012000c004b00090006000100030005000a000b0007000200080004001a0063017b0019001e000f00090006000100030005000a000b000700020008001a0004000d01b30245008c000d00a4008b00cd000d00440043004200060001000300050041004000070002004a02440243007b024201b2024100bd028704dc0240009a01b104db04da04d904d804d7023e0023015f023d023c023b023a02390238023702360235015f00ef00ee0234023304d604d5000b04d40232000b04d3023104d2023004d104d004cf000d00450012000c001800090006000100030005000a00070002000800040016000f00090006000100030005000a000b0007000200080004001a002c0012000c004b00090006000100030005000a000b000700020008000400f60019001e000f00090006000100030005000a000b0007000200080004001601b0022f015e04ce00bc04cd01af01ae00ed015d015c009b002c022d00bb01ad0066003e00a90099001401760006000100030005015b0032004801ac00ba00680020000201b50008001b00f0022c01ab022b04cc01c6001104cb005c001104ca005c00260225012c00b30264005801c000040263005900ce0065017a000c002500090006000100030005000a000b000700020008007a008c00b9000d00a401cc008b00cd000d00440043004200060001000300050041004000070002004a004700cc0095008a0021012200300121012000cb04c904c804c704c6008904c5023f04c4011f0023003b011e011d008800870086008504c3011c04c2003b00840083011b0029001404c101be04c000b101be00bc04bf00d304be00b0003f0176025f000400580012000c004b00090006000100030005000a000b0007000200080004001a00630019001e000f00090006000100030005000a000b0007000200080004000d00450012000c001800090006000100030005000a000b00070002000800040016000f00090006000100030005000a000b00070002000800040039001700a3009a01a4009504bd04bc01550154015304bb0152009400930151015000940093014f00bd014e014d014c04ba014b007e014a014904b904b8021e04b70148000e04b6009204b50092003b021d01cc001300230012000c001800090006000100030005000a000b00070002000800040016000f00090006000100030005000a000b00070002000800040028002c021c0039001100ae04b4007f00c4009f00c3009e007f00c2001e003d04b300ad000c0038001b04b200010003001d005f005e00c1003c009d0020002200350021001c00fc00fb00fa04b100710070006f006e006d04b000f904af006c00560055005400530004005200510050004f004e0034006b002b006700e8006a003a00e7002f005d0069000200b800e6003c007200b80011001a002a00010003001d004d002e002d004c0014007d0032004800c000ba006800200002000800bf01a20061016500f501640079009f0063025d04ae025c001104ad002a00ac00e5002704ac00ae01a104ab001704aa01cb04a904a804a704a604a504a404a304a201c704a104a0049f002e002d049e00010003001d0014001f01a001b6021b019f049d021a0228024d049c0258001400b400310257049b001100b7021900270218002a00ac049a0027004d0499049801aa028c0497001b00ad000c00380496001100e40495002700b704940217021601a9019e01a00215019e019f0493001804920043004200060001000300050041004000070002004a00040214021304910490048f0212001b048e048d003100b9048c048b0011048a005c00b104890065048800b0003f048700110486005c0098000c048500970096001f001a008c000d00b2008b00a4000d00440043004200060001000300050041004000070002004a048401a7019d008a015900a800eb0158015701a6048300890482009500ce015600230091014701460088008700860085021101450144014301420091008400830141002900140481009101470146008800870086008504800145014401430142009100840083014100290014007b003100e3047f047e0043004200060001000300050041004000070002004a00040214047d047c00950223047b003f0210047a047900f5000d04780043004200060001000300050041004000070002004a00040213047704760475020f04740473003f021004720471007b001901b20030021200790470046f046e046d0079020e020d015c046c00a0003e020c00ef00ee0029009500aa0140046b00e2020b046a00e2046901a1020a009e00e202090208003d0468001b019c000c0038046700110466005c019b0465021b013f0464046304620461009a04600013045f007b045e045d00570012000c001800090006000100030005000a000b00070207045c045b045a045901aa0002000800040016000f00090006000100030005000a000b0007000200080004000d0013045800110457005c00110456002a00010003001d00a2001f021601a9019a01a00215019a019f04550018045400010003001d002e002d004c0014009d00160020002200350021001c0037003600e100e0045300710070006f006e006d045200a60451006c00560055005400530004005200510050004f004e0034006b002b006700e8006a003a00e7002f005d0069000200b800e6003c007200b800110161002a00010003001d004d002e002d004c0014007d00320048045000ba006800200002044f00f4001f00790206044e0079044d044c0098000c020500970096001f007c000c002500090006000100030005000a000b000700020008007a008c000d00b900b3008b00b2000d00a40043004200060001000300050041004000070002004a026001a700e9008a015900a800eb0158015701a6044b0089044a019d00ce015600230091014701460088008700860085044901450144014301420091008400830141002900140448019b0204019e013f01990198013e00df004900de002600b3019700b400190196019501940045000c002500090006000100030005000a000b000700020008007a008c00b2000d00b900ea008b0058000d00440043004200060001000300050041004000070002004a004700cc00e9008a0021012200300121012000cb00bc0193044700890446016700ec011f0023003b011e011d008800870086008501790178011c0177003b00840083011b00290014044500b1044400d3044300b0003f001600310012000c00180009020304420006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b0007000200080004000d001300a3002800190078011a01190118019201170077007601160115007700760114003001130112011101910110003a010f010e0441013d04400190000d00440006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040039001700a300e3000d018f015501540153018e0152009400930151015000940093014f00bd014e014d014c018d014b007e014a0149043f020200a1002f043e043d010d000e0049020100490078013c00900039010c043c00b60175010b01740006001e003d043b0038001c00370036043a002604390173010a017200c900010003000500c800a2018c0007018b002200350021001c003700360171017004380082016f00810080016e0437016d0436016c016b00d2012a0129012801270126012500d100d000340002043501090108016a00610107010600c700640002012400c6001c002401690105000e01040047003e0013013b00590434001b0022007501030074003301020101007304330017002300590075007200740033010000ff00730432013a00c50017043100fe00fd00570139006001380026043000a100af00a001370057018a00230189002800190168006000b60012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040028002c00900039001100ae0047013600c4009f00c3009e007f00c2001e003d042f00ad000c0038001b042e00010003001d005f005e00c1003c009d0020002200350021001c00fc00fb00fa042d00710070006f006e006d042c00f9042b006c00560055005400530004005200510050004f004e0034006b0047002b003a0033006a007e00f8002f005d006900110002009c00f700290002009c013500010003001d004d002e002d004c0014007d0032004800c00166006800200002042a01880148000e009202000092003b01ff00a1002f042900af00a00057018701fe002301fd018600600012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040028002c007c000d00bb01fc0066003e00a900990014001600310134006301fb04280427009a002801ba001101bd04260064020f042500c6042400e3024e008f042300ca0422008f042104200162008f041f0090041e008f041d00df041c008f01fa009a01f9008f041b007c01f8008f00120133041a00de0419021c000c002500090006000100030005000a000b000700020008013400dd001e0004015e04180029002c01f700dd001e041701f6041600ed00aa01f500dd001e041501f6041400ed041301f40412041101f3041001f4025b040f040e01f300aa018500dd022000aa040d00dd0099021901f200ef00ee009b017c01f20021009b01f1002c0011040c019d0027040b00950027040a01870027040901bf002700f6002a00010003001d004d002e002d004c0014040800320407040600ba021104050020000200080123005a001100f6002a00010003001d0404008e040301f004020065040101ef01ee003f007b0031009a01b1000d00450012000c001800090006000100030005000a000b00070002000800040016000f00090006000100030005000a000b0007000200080004001a002c0012000c004b00090006000100030005000a000b000700020008000400280019001e000f00090006000100030005000a000b0007000200080004001601b00400001103ff005c03fe03fd018403fc03fb018403fa03f9001803f8019b0204019a013f01990198013e00df004900de002600b3019700b400190196019501940045000c002500090006000100030005000a000b000700020008007a008c00b2000d00b900ea008b0058000d00440043004200060001000300050041004000070002004a004700cc00e9008a0021012200300121012000cb00bc019303f7008903f6016700ec011f0023003b011e011d008800870086008501790178011c0177003b00840083011b0029001403f500b103f400d303f300b0003f00160031020303f20012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b0007000200080004000d001300a3002800190078011a01190118019201170077007601160115007700760114003001130112011101910110003a010f010e03f1013d03f0010d000e0049020100490078013c00900039010c03ef00b60175010b01740006001e003d03ee0038001c0037003603ed0190000d03ec03eb00440012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040039001700a300e3000d018f015501540153018e0152009400930151015000940093014f00bd014e014d014c018d014b007e014a014903ea021e01ed001703e903e8002603e70173010a017200c900010003000500c800a2018c0007018b002200350021001c003700360171017003e60082016f00810080016e03e5016d03e4016c016b00d2012a0129012801270126012500d100d00034000203e301090108016a00610107010600c700640002012400c6001c002401690105000e01040047003e0013013b005903e2001b0022007501030074003301020101007303e10017002300590075007200740033010000ff007303e0013a00c5001703df00fe00fd0057013900600138002603de00a100af00a001370057018a00230189002800190168006000b60012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040028002c00900039001100ae0047013600c4009f00c3009e007f00c2001e003d03dd00ad000c0038001b03dc00010003001d005f005e00c1003c009d0020002200350021001c00fc00fb00fa03db00710070006f006e006d03da00f903d9006c00560055005400530004005200510050004f004e0034006b0047002b003a0033006a007e00f8002f005d006900110002009c00f700290002009c013500010003001d004d002e002d004c0014007d0032004800c0016600680020000203d801880148000e009202000092003b021d01ed001703d703d60066005703d5018600600012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040028002c007c000d00bb03d40066003e00a900990014001600310134006301fb03d303d200dc00db00da00d90132008200d80081008000d703d100a603d001ec00560055005400530004005200510050004f004e01eb002e002d01a30014001f005f005e013101c901c801ea003c00d60020002200350021001c0037003600e100e003cf00710070006f006e006d03ce00a603cd006c00560055005400530004005200510050004f004e0034006b002b006700e8006a003a00e7002f005d0069000203cc00e6003c007203cb001100e401e9002700b701e80217007903ca020e020d03c901ca03c803c700ef00ee020c0029009500aa0140020b00e2021801a1020a009e00e202090208003d03c6001b019c000c003803c5005f005e013101c901c801ea003c009d0020002200350021001c0037003600e100e003c400710070006f006e006d03c300a603c2006c00560055005400530004005200510050004f004e0034006b002b006700e8006a003a00e7002f005d0069000200b800e6003c007200b800f5000d007b001903c1014003c003bf03be021f01fa008f009a0133005f005e0131004d002e002d004c001403bd003201c103bc00ba03bb001100e401e7002700b701e600270183002a00ac00e5002700010003001d00d6001f020701f003ba006503b9007b01ee003f01a20031022403b800ca000d016000f5001603b70012000c001800090006000100030005000a000b00070002000800040016000f00090006000100030005000a000b000700020008000403b600ca000d01c40090000d03b5003b0066003e00a90099001401a2003100ca000d03b4007903b303b203b103b0020603af007903ae03ad03ac03ab03aa03a903a803a703a603a503a403a3009b01a4015d001401ef00310006000100030005015b0032004803a201e500dc00db00da00d90132008200d80081008000d703a1018203a0039f0184013f01990198039e00df0049013e002600b3019700b400190196019501940045000c002500090006000100030005000a000b000700020008007a008c00b2000d00b900ea008b0058000d00440043004200060001000300050041004000070002004a004700cc00e9008a0021012200300121012000cb00bc0193039d0089039c016700ec011f0023003b011e011d008800870086008501790178011c0177003b00840083011b00290014039b00b1039a00d3039900b0003f00160031039801c0000401a8000f021a0229001303970006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b0007000200080004000d001300a3002800190078011a01190118019201170077007601160115007700760114003001130112011101910110003a010f010e0396013d03950190000d00440006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040039001700a300e3000d018f015501540153018e0152009400930151015000940093014f00bd014e014d014c018d014b007e014a0149039402020393010d000e0049039200490078013c00900039010c039100b60175010b01740006001e003d03900038001c00370036038f0026038e0173010a017200c900010003000500c800a2018c0007018b002200350021001c0037003601710170038d0082016f00810080016e038c016d038b016c016b00d2012a0129012801270126012500d100d000340002038a01090108016a00610107010600c700640002012400c6001c002401690105000e01040047003e0013013b00590389001b0022007501030074003301020101007303880017002300590075007200740033010000ff00730387013a00c50017038600fe00fd00570139006001380026038500a100af00a001370057018a00230189002800190168006000b60012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040028002c00900039001100ae0047013600c4009f00c3009e007f00c2001e003d038400ad000c0038001b038300010003001d005f005e00c1003c009d0020002200350021001c00fc00fb00fa038200710070006f006e006d038100f90380006c00560055005400530004005200510050004f004e0034006b0047002b003a0033006a007e00f8002f005d006900110002009c00f700290002009c013500010003001d004d002e002d004c0014007d0032004800c00166006800200002037f01880148000e0092037e0092003b01ff00a1002f037d00af00a00057018701fe002301fd018600600012000c001800090006000100030005000a000b0007000200080004001a000f00090006000100030005000a000b00070002000800040028002c007c000d00bb01fc0066003e00a9009900140016003101340063037c037b037a0130001101e4005c00dc00db00da00d90132008200d80081008000d703790182015e022e037800110377005c01af01ae00ed015d015c009b002c00df000d00bb01ad0066003e00a900990014007b00310006000100030005015b0032004801ac01e500dc00db00da00d90132008200d80081008000d70376018200e50375037402530373002f0372017e02520371037001ab0030036f005b036e036d001901f9036c01f100de000d01bb0043004200060001000300050041004000070002036b036a00cc0369008a015900a800eb0158015700cb03680089036701e3036601560365009101470146008800870086008503640145014401430142009100840083014100290014036300b101e303620065036100b0003f0261005b01300098000c01a500970096001f0360035f0162013e0012000c001800090006000100030005000a000b0007000200d500040185000f00090006000100030005000a000b0007000200d50004000d0013035e01e2035d01e10078011a01190118035c035b035a01170077007601160115007700760114003001130112011103590110003a010f010e0358013d0357010d01e003560049025e00490078013c01e203550039010c00de035401df0353010b03520006001e003d03510038001c0037003603500026034f034e034d0282010a034c00c900010003000500c800a2034b0007034a002200350021001c003700360349034803470346034503440286028502840343012b03420341028000d20340027e033f027f033e033d00d100d000340002033c033b033a01090108033900610107010600c703380002033700c6001c03360335010501e0010401810334001303330075001b00220103007400330102010100730332001701de00750059007200740033010000ff00730331013a00c500170330032f0059013b00c50017032e00fe00fd01dd013901dc01380026032d00a100af00a0013701dd032c01de032b01e1032a01dc01df0012000c001800090006000100030005000a000b0007000200d500040185000f00090006000100030005000a000b0007000200d5000401b9002c03290039001100ae0181013600c4009f00c3009e007f00c2001e003d0328001b00ad000c0038032700010003001d005f005e00c1003c009d0020002200350021001c0037003600e100e0032600710070006f006e006d032500a60324006c00560055005400530004005200510050004f004e0034006b0181002b003a0033006a007e00f8002f005d00690011000201db00f70029000201db013500010003001d004d002e002d004c0014007d0032004800c0032300680020000200d5005b00f4001f0098000c020500970096001f0098000c01a500970096001f001101e4002a00010003001d00a2001f00e401e7002700b701e600270183002a00ac00e5002700010003001d00d6001f0098000c022700970096001f00dc00db00da00d90322008200d80081008000d7032100a6032001ec00560055005400530004005200510050004f004e01eb002e002d01a3003f001f031f01f8031e031d031c031b0006000100030005031a03190007000203180140000400130317031601f7002a03150283002a03140133022101a8002a000601f5001e003d0313001b019c000c00380312005f005e00c900010003000500c800d60020002200350021001c0037003600e100e0031100710070006f006e006d031000a6030f006c00560055005400530004005200510050004f004e0034006b002b006700e8006a003a00e7002f005d0069000201da00e6003c007201da005b0130030e0133005f005e013100a2001f001100e401e9002700b701e800270183002a00ac00e5002700010003001d00d6001f01300006000100030005000a000b00070002030d0004005b00f4001f030c001b005b0026005b030b001b005b0026005b030a001b005b0026005b0309008e001f0000000000000000012f0308000003070000000000000000030600000000000003050000000000000304000000000000030300000000000003020000000000000301000000000000030000000000000002ff00000000000002fe00000000000002fd00000000000002fc00000000000002fb00000000000002fa00000000000002f900000000000002f800000000000002f700000000000002f600000000000002f500000000000002f400000000000002f300000000000002f200000000000002f100000000000002f00000012f0010001002ef0000000000000000000001d900100000000002ee00000000000002ed0000000000000000001001d80010001002ec00000000000002eb00d4000002ea000002e902e802e702e601d7000001d60000000001d500000000000001800010012e001001d4000000000000018000100010001000100010012e00000000001000100000000001d902e502e4001002e3001002e20000000000000000000002e1000000d4000001d3000002e002df02de02dd0010001002dc00000000000002db0000000002da00000000000002d900000000000002d80000000001d500000000000002d700000000000000000000000002d602d50000000000000000000001d6000000000000000002d401d202d30000000002d20000000000000000000002d1000002d002cf02ce02cd00000000000002cc00000000000002cb01d80010001000100010012e0000000002ca0000000000000000012e0000000001d100000000000000d4000002c9000002c802c702c602c50000000001d3000002c40000000000000000000002c3000002c20000000000000000000002c1000002c000100010001000000180001002bf00d400000000000002be02bd02bc02bb0000000002ba00000010001002b900000000000002b8001002b70000000000000010012f0010001002b6000000000000001001d40000012f02b500000000000001d202b402b3000002b200000000000000d4000002b1000002b002af02ae02ad02ac02ab02aa02a902a800000000000002a700000000000002a60000000000000000000001d0000002a502a40000000002a300000000000002a200000000000002a100000000000002a000000000000000000000029f0000029e000000000000029d029c029b029a02990000000000000000000001d1000002980000000000000010001000100010029702960295029401d7000001d0000002930000000000000000000000000000029202910290028f000000000000", + "logIndex": 2, + "blockHash": "0x18d31069b599b0668562a0efe58e446a48359c84e7eac4120563fe79ff501afe" + }, + { + "transactionIndex": 0, + "blockNumber": 692849, + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x01000637412649d1ccb37c217728febe144de58a430c09db4bb5817da47c3f60", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x18d31069b599b0668562a0efe58e446a48359c84e7eac4120563fe79ff501afe" + }, + { + "transactionIndex": 0, + "blockNumber": 692849, + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x01000637412649d1ccb37c217728febe144de58a430c09db4bb5817da47c3f60", + "0x000000000000000000000000d5d369e15891074711ba80d80295e2a6d3ae32ee" + ], + "data": "0x", + "logIndex": 4, + "blockHash": "0x18d31069b599b0668562a0efe58e446a48359c84e7eac4120563fe79ff501afe" + }, + { + "transactionIndex": 0, + "blockNumber": 692849, + "transactionHash": "0x8866c11fdafdee45c48f7e128df8a9c0aa0c9b4a1dfbc2f3d57d28469bd0038f", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3" + ], + "data": "0x0000000000000000000000000000000000000000000000000e0d43e8d87aa1f0", + "logIndex": 5, + "blockHash": "0x18d31069b599b0668562a0efe58e446a48359c84e7eac4120563fe79ff501afe" + } + ], + "blockNumber": 692849, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 3, + "solcInputHash": "add2d99d454de06c8434504df96c7cdf", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "name": "AlreadySubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyUnsubscribed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "innerErorr", + "type": "bytes" + } + ], + "name": "BatchError", + "type": "error" + }, + { + "inputs": [], + "name": "FullyPacked", + "type": "error" + }, + { + "inputs": [], + "name": "IncentiveOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientStakedAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIndex", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimeFrame", + "type": "error" + }, + { + "inputs": [], + "name": "NoToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonZero", + "type": "error" + }, + { + "inputs": [], + "name": "NotStaked", + "type": "error" + }, + { + "inputs": [], + "name": "NotSubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyCreator", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isRewardRounded", + "type": "bool" + } + ], + "name": "IncentiveCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "changeAmount", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newStartTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEndTime", + "type": "uint256" + } + ], + "name": "IncentiveUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Subscribe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Unsubscribe", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "accrueRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "datas", + "type": "bytes[]" + } + ], + "name": "batch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimAllRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint112", + "name": "rewardAmount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "startTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "isRewardRounded", + "type": "bool" + } + ], + "name": "createIncentive", + "outputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "incentiveCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "incentives", + "outputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "isRewardRounded", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "rewardPerLiquidity", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "lastRewardTime", + "type": "uint32" + }, + { + "internalType": "uint112", + "name": "rewardRemaining", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "liquidityStaked", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardPerLiquidityLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeAndSubscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "subscribeToIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "subscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "unstakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "incentiveIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "ignoreRewards", + "type": "bool" + } + ], + "name": "unsubscribeFromIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + }, + { + "internalType": "int112", + "name": "changeAmount", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "newStartTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "newEndTime", + "type": "uint32" + } + ], + "name": "updateIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userStakes", + "outputs": [ + { + "internalType": "uint112", + "name": "liquidity", + "type": "uint112" + }, + { + "internalType": "uint144", + "name": "subscribedIncentiveIds", + "type": "uint144" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "claimAllRewards(uint256[])": { + "details": "Claims rewards for all incentives in the list, skipping reward rounding." + }, + "unsubscribeFromIncentive(address,uint256,bool)": { + "params": { + "incentiveIndex": "∈ [0,5]" + } + } + }, + "stateVariables": { + "rewardPerLiquidityLast": { + "details": "rewardPerLiquidityLast[user][incentiveId]Semantic overload: if value is zero user isn't subscribed to the incentive." + }, + "userStakes": { + "details": "userStakes[user][stakedToken]" + } + }, + "title": "Fork of https://github.com/sushiswap/StakingContract", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Permissionless staking contract that allows any number of incentives to be running for any token (erc20). Incentives can be created by anyone, the total reward amount must be sent at creation. Incentives can be updated (change reward rate / duration). Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.", + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Rewards/StakingContractMainnet.sol": "StakingContractMainnet" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Rewards/StakingContractMainnet.sol": { + "keccak256": "0x7f92093eadc38374fbce53bf2f73e91d394c5f1ce254d6c7effc79938d4ae019", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://2d097a426c15514e759b098f36e61c91f27f85476d33273ae3eb615a5dbed134", + "dweb:/ipfs/QmUd7omWQuqhj8eFDtqu2P8j7naicPxSvFbV19Pcui528E" + ] + }, + "contracts/Rewards/libraries/FullMath.sol": { + "keccak256": "0x15d868b6971977f8af921bbf4479568f8a7e6ca62f340254d44d4e7a157692d2", + "license": "MIT", + "urls": [ + "bzz-raw://db33904a7a18e1ba96e8b17f98a26c0166d2ab3ffa208d11efe3efbbd9604361", + "dweb:/ipfs/QmUB7Ez1xDkovwR89Ghb9V34UFzcVcVScizKBbqf8fwQcz" + ] + }, + "contracts/Rewards/libraries/PackedUint144.sol": { + "keccak256": "0x1b000be9727c835ff2b34542079a4ff86579cb76b84038ad671bd0426cd6120a", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://eb212591acf7e6d5e941b80034acadf4edd5d08287a881e0bb476f6c197a03ed", + "dweb:/ipfs/QmSAZMiBNwLhubvyEAQTGXXYN6UJnfvNRqgugFcV12kS86" + ] + }, + "lib/solmate/src/tokens/ERC20.sol": { + "keccak256": "0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35", + "dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97" + ] + }, + "lib/solmate/src/utils/ReentrancyGuard.sol": { + "keccak256": "0xb282dd78aa7375d6b200b9a5d8dd214b2e5df1004f8217a4b4c2b07f0c5bfd01", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://5fca62eb8d3dbd2b3b7e4bb051f6da16f4d0ff9cee61c39cebb80f031f6a8800", + "dweb:/ipfs/QmbrsXPK91iBFwHKwJs2HLRud2KzMoBDRiWYMUtyV5H57j" + ] + }, + "lib/solmate/src/utils/SafeTransferLib.sol": { + "keccak256": "0xbadf3d708cf532b12f75f78a1d423135954b63774a6d4ba15914a551d348db8a", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://88ac8256bd520d1b8e6f9c4ac9e8777bffdc4a6c8afb1a848f596665779a55b4", + "dweb:/ipfs/QmXx7X1dxe6f5VM91vgQ5BA4r2eF97GWDcQDrgHytcvfjU" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x00030000000000020010000000000002000000000c01034f00020000000c035500000000010c00190000006001100270000005c40010019d0000008004000039000000400040043f0000000100200190000000c80000c13d000005c403100197000000040030008c00000b630000413d00000000013c034f00000000020c043b000000e002200270000005c60020009c000000d20000213d000005d20020009c000000f70000213d000005d80020009c000003160000213d000005db0020009c0000054d0000613d000005dc0020009c00000b630000c13d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000e02043b000005e200e0009c00000b630000213d0000002302e00039000000000032004b00000b630000813d0000000402e0003900000000022c034f000000000f02043b000005e200f0009c00000b630000213d0010002400e0003d0000000502f002100000001002200029000000000032004b00000b630000213d00000000000f004b000003450000613d000000200d00008a0000000002000019000e0000000e001d000d0000000f001d0000000004e30049000f00000002001d0000000502200210000000100220002900000000022c034f000000000202043b000000430440008a0000061e054001970000061e06200197000000000756013f000000000056004b00000000050000190000061e05002041000000000042004b00000000040000190000061e040040410000061e0070009c000000000504c019000000000005004b00000b630000613d000000100420002900000000024c034f000000000b02043b000005e200b0009c00000b630000213d0000000005b3004900000020044000390000061e065001970000061e07400197000000000867013f000000000067004b00000000060000190000061e06004041000000000054004b00000000050000190000061e050020410000061e0080009c000000000605c019000000000006004b00000b630000c13d00000000064c034f0000000007db0170000000400400043d00000000057400190000006a0000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b000000660000c13d0000001f08b00190000000770000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000000800000c13d00000001060000310000000102000039000000960000013d000005c400b0009c000005c40b0080410000006001b00210000005c40040009c000005c4040080410000004003400210000000000113019f000005c40050009c000005c405008041000000c003500210000000000113019f170c17070000040f0000000d0f0000290000000e0e000029000000200d00008a0000000003000031000000020c000367000000010220018f00000000040100190000006004400270000105c40040019d000005c406400197000000000006004b00000080040000390000006005000039000000c10000613d0000062f0060009c000006170000813d0000001f046000390000000004d4016f0000003f044000390000000004d4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000005e20040009c000006170000213d0000000100700190000006170000c13d000000400040043f00000000046504360000000008d601700000000007840019000000b40000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000000b00000c13d0000001f06600190000000c10000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b000009a20000613d0000000f0200002900000001022000390000000000f2004b000000370000413d000003450000013d0000000001000416000000000001004b00000b630000c13d0000000101000039000000000010041b000000200100003900000100001004430000012000000443000005c5010000410000170d0001042e000005c70020009c000002fb0000213d000005cd0020009c000003470000213d000005d00020009c000005550000613d000005d10020009c00000b630000c13d000000440030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005dd0010009c00000b630000213d0000002402c00370000000000202043b001000000002001d000005dd0020009c00000b630000213d000000000010043f0000000401000039000000200010043f170c16f00000040f0000001002000029000000000020043f000000200010043f170c16f00000040f000000000101041a000005df02100197000000800020043f0000007001100270000000a00010043f0000060e010000410000170d0001042e000005d30020009c000003a30000213d000005d60020009c000005b90000613d000005d70020009c00000b630000c13d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000202043b000005e20020009c00000b630000213d0000002304200039000000000034004b00000b630000813d000000040420003900000000044c034f000000000404043b000800000004001d000005e20040009c00000b630000213d000700240020003d000000080200002900000005022002100000000704200029000000000034004b00000b630000213d000000000300041a000000010030008c000007180000c13d0000000203000039000000000030041b0000003f03200039000005e303300197000005e40030009c000006170000213d0000008003300039000000400030043f0000000803000029000000800030043f0000001f0320018f000000000002004b0000012b0000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b000001270000c13d000000000003004b000000080000006b000007320000613d0000000002000019000a00000002001d0000000502200210000900000002001d0000000701200029000f00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b00000a1a0000813d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000d00000001001d000000000101041a000e00000001001d001000000002001d0000000401200039000c00000001001d000000000101041a000b00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000b06000029000005c4026001970000000e03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000001007000029000e00030070003d000001830000413d000000000521004b000001830000a13d0000000c08000029000000000408041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f000000000018041b0000000f030000290000018c0000013d000005eb0060009c0000000f030000290000000c050000290000018c0000213d000000000042004b0000018c0000813d000005ec02600197000000000121019f000000000015041b0000000201300367000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b00000010020000290000000102200039000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a001000000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000001002000029000005df062001970000000e02000029000000000202041a0000000001120049000006310010009c0000000002010019000000000200601900000000326200a900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed03500197000000000332001900000000026100a9000000000323004b00000000040000390000000104004039000000000343004b000001ea0000c13d000005df0120012a000001f20000013d000005ee0030009c00000b630000213d000005df3060012a000005df1010012a00000000013100a9000005df1010012a0000000001120049000005ef011000d1001000000001001d0000000d01000029000000000201041a000005de00200198000002030000613d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c000002050000c13d0000000103000031000000200030008c00000020040000390000000004034019000002320000013d00000000020000190000026e0000013d000b00000006001d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000c0000000a001d170c17020000040f0000000c0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000002210000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b0000021d0000c13d0000001f074001900000022e0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000010e10000613d0000000b060000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c00000b6b0000213d000000000001004b000000100200002900000001030000390000025e0000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a9000000010330027200000000040500190000024b0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a900000001011002720000000004050019000002560000c13d00000010022000f900000000012300a9000000000002004b000002640000613d00000000022100d9000000000023004b00000b6b0000c13d000000100010006b00000b6b0000413d000000100310006b00000000020000190000026e0000613d000005df023000d100000000033200d9000005df0030009c001000000001001d00000b6b0000c13d000000000006004b000006e70000613d00000000016200d90000000e02000029000000000202041a000e00000012005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000d01000029000000000201041a000000400100043d000000240310003900000010040000290000000000430435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000002a60000c13d0000000001010433000000000010043f00000001030000310000000102000039000002cc0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000002bd0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000002b90000c13d0000001f05500190000002ca0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d00000010020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f000000010020019000000b630000613d000000800100043d0000000a02000029000000000021004b00000a1d0000a13d0000000901000029000000a001100039000000100300002900000000003104350000000102200039000000080020006c0000012f0000413d000007320000013d000005c80020009c000005300000213d000005cb0020009c000005f60000613d000005cc0020009c00000b630000c13d000000440030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005dd0010009c00000b630000213d000000000010043f0000000301000039000000200010043f00100000000c0353170c16f00000040f000000100200035f0000002402200370000000000202043b000000000020043f000000200010043f170c16f00000040f000005510000013d000005d90020009c0000061d0000613d000005da0020009c00000b630000c13d000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005e20010009c00000b630000213d0000002302100039000000000032004b00000b630000813d000000040210003900000000022c034f000000000402043b000005e20040009c000006170000213d00000005024002100000003f05200039000005e305500197000005e40050009c000006170000213d0000008005500039000000400050043f000000800040043f00000024011000390000000002120019000000000032004b00000b630000213d000000000004004b000003450000613d000000800300003900000000041c034f000000000404043b000000200330003900000000004304350000002001100039000000000021004b0000033a0000413d000000800100043d000900000001001d000000000001004b000007420000c13d00000000010000190000170d0001042e000005ce0020009c0000065d0000613d000005cf0020009c00000b630000c13d000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000300000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000700000001001d000005df0010009c00000b630000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000600000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b00000003010000290000000702000029170c16770000040f0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d0000000702300029000005df0020009c00000b6b0000213d000005f401100197000000000112019f0000000802000029000000000012041b000005f50010009c000009ed0000813d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d0200003900000003030000390000060204000041000000030500002900000b5f0000013d000005d40020009c0000068e0000613d000005d50020009c00000b630000c13d000000840030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000005df0010009c00000b630000213d0000004402c00370000000000202043b000005e20020009c00000b630000213d0000002305200039000000000035004b00000b630000813d000000040520003900000000055c034f000000000605043b000005e20060009c000006170000213d00000005056002100000003f07500039000005e307700197000005e40070009c000006170000213d0000008007700039000000400070043f000000800060043f00000024022000390000000005250019000000000035004b00000b630000213d000000000006004b000003d60000613d00000000032c034f000000000303043b000000200440003900000000003404350000002002200039000000000052004b000003cf0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b00000b630000c13d000000000200041a000000010020008c000009e60000c13d0000000202000039000000000020041b000005df021001970000001001000029000700000002001d170c16770000040f0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005dd02200197000400000002001d000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d0000000702300029000005df0020009c00000b6b0000213d000005f403100197000000000232019f0000000803000029000000000023041b000005f50020009c00000eb80000813d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000006020400004100000004050000290000000006000411170c16fd0000040f000000010020019000000b630000613d0000000102000039000000000020041b000000800100043d000900000001001d000000000001004b000003450000613d0000000004000019000000800100043d000000000041004b000080100300003900000a1d0000a13d000b00000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b001000000004001d000000010140008a000000000202041a000000000021004b00000a1a0000813d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000000002030019170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000a00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000005df00100198000005b60000613d0000000f020000290000000201200039000000000101041a000c00000001001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d07000029000005c4037001970000000c02000029000000a002200270000005c404200197000000000501043b000000000045004b00000000020400190000000002054019000005e80070009c0000000f010000290000000301100039000004c10000413d000000000632004b000004c10000a13d0000000e09000029000000000509041a0000009007500272000006e70000613d00000000033400490000002004500270000005df0840019700000000066800a900000000033600d9000005df063000d100000000067600d9000000000701041a0000000006670019000000000061041b00000000033400490000002003300210000005e903300197000005ea04500197000000000334019f000000000223019f000000000029041b000004c90000013d000005eb0070009c000004c90000213d000000000053004b000004c90000813d000005ec03700197000000000232019f0000000e03000029000000000023041b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000a02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb0220019800000eb50000613d000000000301041a000006110030009c0000000e050000290000145b0000213d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f000000000015041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000010050000290000000006000411170c16fd0000040f000000010020019000000b630000613d0000000102000039000000000020041b0000000b040000290000000104400039000000090040006c0000042b0000413d000003450000013d000005c90020009c000006ed0000613d000005ca0020009c00000b630000c13d000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000000000200041a000000010020008c000007180000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b0000068a0000813d000000000010043f000000200020043f170c16f00000040f170c14940000040f0000000101000039000000000010041b00000000010000190000170d0001042e0000000001000416000000000001004b00000b630000c13d0000000101000039000000000101041a000000800010043f000005e1010000410000170d0001042e000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000301043b000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b0000068a0000813d001000000003001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000e00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000005df0010019800000a230000c13d000000400100043d0000062a0200004100000b080000013d000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000f00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000e00000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000d00000001001d000000000101041a001000700010027a00000b060000613d000005f60010009c000009c30000813d000000010200003900000ad50000013d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000202043b000005e20020009c00000b630000213d0000002304200039000000000034004b00000b630000813d000000040420003900000000044c034f000000000404043b000800000004001d000005e20040009c00000b630000213d000700240020003d000000080200002900000005022002100000000704200029000000000034004b00000b630000213d000000000300041a000000010030008c000007180000c13d0000000203000039000000000030041b0000003f03200039000005e303300197000005e40030009c000007220000a13d0000062401000041000000000010043f0000004101000039000000040010043f00000625010000410000170e00010430000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000300000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000700000001001d000005df0010009c00000b630000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000600000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d000000070230006c000009ca0000813d000000400100043d0000062e0200004100000b080000013d000000c40030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000f00000001001d000005dd0010009c00000b630000213d0000004401c00370000000000101043b000e00000001001d000005df0010009c00000b630000213d0000006401c00370000000000101043b000d00000001001d000005c40010009c00000b630000213d0000008401c00370000000000101043b000c00000001001d000005c40010009c00000b630000213d000000a401c00370000000000201043b000000000002004b0000000001000039000000010100c039000b00000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000e0000006b000009f70000c13d0000060f01000041000000800010043f00000610010000410000170e00010430000000840030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000002401c00370000000000301043b0000061500300198000006160100004100000000010060190000061702300197000000000121019f0000000402c00370000000000202043b001000000002001d000f00000003001d000000000013004b00000b630000c13d0000004401c00370000000000101043b000e00000001001d000005c40010009c00000b630000213d0000006401c00370000000000101043b000d00000001001d000005c40010009c00000b630000213d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000301043b000000000103041a000005dd011001970000000002000411000000000012004b000008510000c13d0000000401300039000800000003001d0000000202300039000900000002001d000000000202041a000a00000002001d000c00000001001d000000000101041a000b00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000b05000029000005c4025001970000000a03000029000000a003300270000005c404300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000005e80050009c00000a130000413d000000000521004b00000a130000a13d0000000c03000029000000000303041a000000900630027200000a5a0000c13d0000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e00010430000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f170c16f00000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000005dd01100197000000800010043f000005dd01500197000000a00010043f000005dd01400197000000c00010043f000000a001400270000005c401100197000000e00010043f000005de004001980000000001000039000000010100c039000001000010043f000001200030043f000005c401200197000001400010043f0000002001200270000005df01100197000001600010043f0000009001200270000001800010043f000005e0010000410000170d0001042e0000060001000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000062601000041000000c40010043f0000062b010000410000170e000104300000008003300039000000400030043f0000000803000029000000800030043f0000001f0320018f000000000002004b0000072f0000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000072b0000c13d000000000003004b000000080000006b000008540000c13d0000000101000039000000000010041b000000400100043d001000000001001d0000008002000039170c14850000040f00000010020000290000000001210049000005c40010009c000005c4010080410000006001100210000005c40020009c000005c4020080410000004002200210000000000121019f0000170d0001042e000000010200003900008010030000390000000004000019000000800100043d000000000041004b00000a1d0000a13d000000000100041a000000010010008c000009e60000c13d000b00000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b001000000004001d000000010140008a000000000202041a000000000021004b00000a1a0000813d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000000002030019170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000a00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d0000000f02000029000000000101043b000000000101041a000005df00100198000005b60000613d0000000201200039000000000101041a000c00000001001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d07000029000005c4037001970000000c02000029000000a002200270000005c404200197000000000501043b000000000045004b00000000090400190000000009054019000005e80070009c0000000f010000290000000301100039000007de0000413d000000000639004b000007de0000a13d0000000e0a00002900000000050a041a0000009007500272000006e70000613d00000000033400490000002004500270000005df0840019700000000066800a900000000033600d9000005df063000d100000000067600d9000000000701041a0000000006670019000000000061041b00000000033400490000002003300210000005e903300197000005ea04500197000000000334019f000000000293019f00000000002a041b0000801002000039000007e70000013d000005eb0070009c0000801002000039000007e70000213d000000000053004b000007e70000813d000005ec03700197000000000339019f0000000e04000029000000000034041b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c7170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000a02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb0220019800000eb50000613d000000000301041a000005fa0030009c0000000e050000290000145b0000813d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f000000000015041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000010050000290000000006000411170c16fd0000040f0000000100200190000080100300003900000b630000613d0000000102000039000000000020041b0000000b040000290000000104400039000000090040006c000007450000413d000003450000013d000000400100043d000006270200004100000b080000013d000000400100043d000006180200004100000b080000013d0000000002000019000b00000002001d0000000502200210000900000002001d0000000701200029001000000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b00000a1a0000813d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000a00000001001d000000000101041a000c00000001001d000f00000002001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000c03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000f070000290000000308700039000c00000008001d000008a90000413d000000000521004b000008a90000a13d0000000e09000029000000000409041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d9000000000608041a0000000005560019000000000058041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f000000000019041b0000001003000029000008b20000013d000005eb0060009c00000010030000290000000e05000029000008b20000213d000000000042004b000008b20000813d000005ec02600197000000000121019f000000000015041b0000000201300367000000000101043b001000000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000f01000029000005df011001970000000c03000029000000000703041a0000000002270049000006310020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed04600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000e00000007001d000009110000c13d000005df0230012a000009190000013d000005ee0040009c00000b630000213d000005df4010012a000005df2020012a00000000024200a9000005df2020012a0000000002230049000005ef022000d1000f00000002001d000000000001004b000006e70000613d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000a01000029000000000201041a000000400100043d00000024031000390000000f040000290000000000430435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c0000094d0000c13d0000000001010433000000000010043f00000001030000310000000102000039000009730000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000009640000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000009600000c13d0000001f05500190000009710000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d000000400100043d0000000f020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f30400004100000010050000290000000006000411170c16fd0000040f000000010020019000000b630000613d000000800100043d0000000b02000029000000000021004b00000a1d0000a13d0000000901000029000000a0011000390000000f0300002900000000003104350000000102200039000000080020006c000008550000413d000007320000013d000000400100043d000006300200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000009b60000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000009af0000413d0000001f042000390000000004d4016f000000000223001900000000000204350000004402400039000005c40020009c000005c4020080410000006002200210000005c40010009c000005c4010080410000004001100210000000000112019f0000170e00010430000005f70010009c000000020200003900000ad50000413d000005f80010009c00000acf0000813d000000030200003900000ad50000013d000005f50020009c00000b6b0000813d000005f401100197000000000112019f0000000802000029000000000012041b000005f50010009c00000b0e0000813d000000400100043d000000240210003900000007030000290000000000320435000005f002000041000000000021043500000004021000390000000003000411000000000032043500000000020004140000000303000029000005dd03300197001000000003001d000000040030008c00000b180000c13d00000001020000390000000001010433000000000010043f000000010300003100000b400000013d000000400100043d00000044021000390000062603000041000000000032043500000024021000390000000a03000039000011b30000013d000500010000003d000005f60010009c00000bbd0000413d000005f70010009c000500020000003d00000bbd0000413d000005f80010009c00000bb60000813d000000030100003900000bbc0000013d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b000005c4021001970000000d0010006b0000000d02008029000d00000002001d0000000c0020006c00000acc0000813d0000000102000039000000000102041a0000000101100039000000000012041b000a00000001001d000006030010009c00000dd20000413d000000400100043d0000060d0200004100000b080000013d000005eb0060009c00000a6e0000213d000000000032004b00000a6e0000813d000005ec02600197000000000121019f00000a6c0000013d000000400100043d0000060f0200004100000b080000013d0000062401000041000000000010043f0000003201000039000000040010043f00000625010000410000170e000104300000000f020000290000000201200039000000000101041a000b00000001001d0000000401200039000c00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d05000029000005c4025001970000000b03000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80050009c00000e6a0000413d000000000521004b00000e6a0000a13d0000000c03000029000000000303041a0000009006300272000006e70000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d90000000f060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f00000e720000013d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000008060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f0000000c02000029000000000012041b0000000e01000029000e05c40010019c00000a850000613d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b000005c4021001970000000e0010006b0000000e020080290000000c03000029000000000103041a000005ec01100197000000000121019f000000000013041b0000000d0000006b00000a8a0000c13d0000000901000029000000000101041a00000a9f0000013d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b0000000d0010006b0000000d01008029000000a00110021000000608011001970000000903000029000000000203041a0000061902200197000000000121019f000000000013041b000000a002100270000005c4032001970000000c02000029000000000202041a000005c404200197000000000034004b00000acc0000813d0000000f03000029000006050030009c00000b650000213d0000000f0000006b00000b650000613d0000000f03000029000005df043001970000002003200270000005df033001970000000003430019000005df0030009c00000b6b0000213d0000061b022001970000002003300210000005e903300197000000000223019f0000000c03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000061c0200004100000000002304350000000402300039000000000400041100000000004204350000000004000414000005dd02100197000000040020008c000010ff0000c13d00000001020000390000000001030433000000000010043f0000000103000031000011260000013d000000400100043d0000061a0200004100000b080000013d000005f90010009c000000040200003900000ad50000413d000005fa0010009c000000060200003900000005020040390000000f0020006b00000b060000813d0000000f01000029000c0018001000cd000000000001004b00000adf0000613d0000000c020000290000000f012000fa000000180010008c00000b6b0000c13d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f0000000c04000029000000100340024f000005fb03300197000000ff0040008c0000000003002019001000000003001d000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b00000b710000c13d000000400100043d000006220200004100000b080000013d000000400100043d00000623020000410000000000210435000005c40010009c000005c4010080410000004001100210000005fd011001c70000170e00010430000500010000003d000005f60010009c00000ec90000413d000005f70010009c000500020000003d00000ec90000413d000005f80010009c00000ec20000813d000000030100003900000ec80000013d000005c40010009c000005c4010080410000004001100210000005c40020009c000005c402008041000000c002200210000000000112019f000005f1011001c70000001002000029170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000b310000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000b2d0000c13d000000000005004b00000b3e0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d0200003900000003030000390000062d0400004100000010050000290000000006000411170c16fd0000040f0000000100200190000005490000c13d00000000010000190000170e000104300000000f030000290000061e0030009c000011910000413d0000000f03000029000006160030009c0000113c0000c13d0000062401000041000000000010043f0000001101000039000000040010043f00000625010000410000170e000104300000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000000000101041a000a00000001001d000900000002001d0000000401200039000b00000001001d000000000101041a000c00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000c05000029000005c4025001970000000a03000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80050009c000011be0000413d000000000521004b000011be0000a13d0000000b03000029000000000303041a0000009006300272000006e70000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000009060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f000011c60000013d000005f90010009c000500040000003d00000bbd0000413d000005fa0010009c00000006010000390000000501004039000500000001001d0000000c01000029000005df1010012a000400000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d00000c0f0000413d000000000521004b00000c0f0000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f00000c150000013d000005eb0060009c00000c170000213d000000000042004b00000c170000813d000005ec02600197000000000121019f0000001002000029000000000012041b0000000001000411000000000010043f0000000301000039000000200010043f000000060000006b00000c520000613d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b00000c8d0000c13d000005df0620012a00000c940000013d0000000801000029000000000101041a000d00000001001d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b00000d920000c13d000005df0330012a000005df023000d1000000000003004b00000d9c0000c13d00000d9f0000013d000005ee0030009c00000b630000213d000005df1010012a00000004011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de0020019800000ca50000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c00000ca70000c13d0000000103000031000000200030008c0000002004000039000000000403401900000cd20000013d000000000200001900000d0f0000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000cc20000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000cbe0000c13d0000001f0740019000000ccf0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000012200000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b0000000002060019000000010300003900000cff0000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a90000000103300272000000000405001900000cec0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a90000000101100272000000000405001900000cf70000c13d00000000022600d900000000012300a9000000000002004b00000d050000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b000000000200001900000d0f0000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c00000d480000c13d0000000001010433000000000010043f0000000103000031000000010200003900000d6f0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c00000020050000390000000005034019000000200450019000000d5f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d5b0000c13d0000001f0550019000000d6c0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f000000010020019000000dc20000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000004022000b9000005df2020012a0000000002230049000005ef032000d1000005df023000d1000000000003004b00000d9f0000613d00000000033200d9000005df0030009c00000b6b0000c13d0000000d03000029000005df03300198000006e70000613d00000000023200d9000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a00000090021002700000000702200029000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000050020006c00000bc10000413d000003920000013d0000000f010000290000000e02000029170c16770000040f000000400100043d000900000001001d000006040010009c000006170000213d00000009030000290000012001300039000000400010043f000000e0023000390000000e01000029000700000002001d0000000000120435000000c0023000390000000d01000029000800000002001d0000000000120435000000a0023000390000060501000041000600000002001d000000000012043500000080023000390000000b01000029000500000002001d000000000012043500000060023000390000000c01000029000300000002001d000000000012043500000040023000390000000f01000029000200000002001d000000000012043500000020023000390000001001000029000100000002001d0000000000120435000000000100041100000000001304350000010001300039000400000001001d00000000000104350000000a01000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d00000009020000290000000002020433000005dd02200197000000000101043b000000000301041a0000060603300197000000000223019f000000000021041b00000001020000290000000002020433000005dd022001970000000103100039000000000403041a0000060604400197000000000224019f000000000023041b00000002020000290000000002020433000005dd022001970000000203100039000000000403041a0000060704400197000000000224019f00000003040000290000000004040433000000a0044002100000060804400197000000000242019f00000005040000290000000004040433000000000004004b00000609040000410000000004006019000000000242019f000000000023041b000000060200002900000000020204330000000303100039000000000023041b000000040200002900000000020204330000009002200210000000070300002900000000030304330000002003300210000005e903300197000000000232019f00000008030000290000000003030433000005c403300197000000000232019f0000000401100039000000000021041b000000400100043d00000080021000390000000b03000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000000d03000029000000000032043500000020021000390000000e0300002900000000003204350000000a020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f0000060a011001c70000800d0200003900000004030000390000060b0400004100000010050000290000000f060000290000000007000411170c16fd0000040f000000010020019000000b630000613d0000000101000039000000000010041b000000400100043d0000000a020000290000000000210435000005c40010009c000005c40100804100000040011002100000060c011001c70000170d0001042e0000000d04000029000005eb0040009c00000e740000213d000000000032004b00000e740000813d0000000d02000029000005ec02200197000000000121019f0000000c02000029000000000012041b0000000f010000290000000301100039000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb02200198000014580000c13d000000400100043d000006290200004100000b080000013d000600010000003d000005f60020009c000012330000413d000005f70020009c000600020000003d000012330000413d000005f80020009c0000122c0000813d0000000301000039000012320000013d000005f90010009c000500040000003d00000ec90000413d000005fa0010009c00000006010000390000000501004039000500000001001d0000000c01000029000005df1010012a000400000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d00000f1b0000413d000000000521004b00000f1b0000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f00000f210000013d000005eb0060009c00000f230000213d000000000042004b00000f230000813d000005ec02600197000000000121019f0000001002000029000000000012041b000000060000006b00000f760000613d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b00000f5e0000c13d000005df0620012a00000f650000013d000005ee0030009c00000b630000213d000005df1010012a00000004011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de0020019800000fb70000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c00000fb90000c13d0000000103000031000000200030008c0000002004000039000000000403401900000fe40000013d0000000801000029000000000101041a000005df0110019800000f250000613d000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b000010a40000c13d000005df0230012a000005df032000d1000000000002004b000010ae0000c13d000010b10000013d0000000002000019000010210000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000fd40000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000fd00000c13d0000001f0740019000000fe10000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00000001002001900000144c0000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b00000000020600190000000103000039000010110000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a90000000103300272000000000405001900000ffe0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a900000001011002720000000004050019000010090000c13d00000000022600d900000000012300a9000000000002004b000010170000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b0000000002000019000010210000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c0000105a0000c13d0000000001010433000000000010043f00000001030000310000000102000039000010810000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000010710000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000106d0000c13d0000001f055001900000107e0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f0000000100200190000010d10000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000004022000b9000005df2020012a0000000002230049000005ef022000d1000005df032000d1000000000002004b000010b10000613d00000000022300d9000005df0020009c00000b6b0000c13d0000000d023000fa000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a0000009002100270000000070220006a000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000050020006c00000ecd0000413d000009d20000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e80000c13d000000000005004b000010f90000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005c40020009c000005c4020080410000004002200210000000000112019f0000170e00010430000005c40030009c000005c4030080410000004001300210000005c40040009c000005c404008041000000c003400210000000000113019f00000601011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011170000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000011130000c13d000000000005004b000011240000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011350000613d000000000141016f000000000113019f0000000100100190000011910000c13d000000400100043d00000044021000390000061d03000041000000000032043500000024021000390000001403000039000011b30000013d0000000f030000290000000003300089000005df043001970000002003200270000005df05300197000000000054004b000000000405801900000000034300490000002003300210000005e9033001970000061b02200197000000000223019f0000000c03000029000000000023041b000000400300043d00000024023000390000000000420435000005f00200004100000000002304350000000402300039000000000400041100000000004204350000000004000414000005dd02100197000000040020008c0000115b0000c13d00000001020000390000000001030433000000000010043f0000000103000031000011820000013d000005c40030009c000005c4030080410000004001300210000005c40040009c000005c404008041000000c003400210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011730000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000116f0000c13d000000000005004b000011800000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d0000000901000029000000000101041a0000000c02000029000000000202041a000005c402200197000000400300043d00000020043000390000000000240435000000a001100270000005c401100197000000400230003900000000001204350000000f010000290000000000130435000005c40030009c000005c40300804100000040013002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f0000061f011001c70000800d0200003900000002030000390000062004000041000000100500002900000b600000013d000000400100043d0000004402100039000005ff03000041000000000032043500000024021000390000000f03000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e000104300000000c04000029000005eb0040009c000011c80000213d000000000032004b000011c80000813d0000000c02000029000005ec02200197000000000121019f0000000b02000029000000000012041b0000000e0000006b000011d00000c13d0000000d01000029000000000101041a000005df0310019700000009010000290000001002000029170c14dc0000040f0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000001041b0000000d01000029000000000101041a000005df021001970000000b01000029000000000101041a00000090031002700000000002230049000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000000b02000029000000000012041b0000000d01000029000000000101041a00000070021002700000000f03000029000000050030008c000012120000213d0000061e03000041000000010400008a0000061e0030009c000000000400c0190000000f03000029000000060330008900000018033000ca000001000530008900000000045401cf000005ea0530027f000000000445019f000005ea04006041000005eb0330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f000005df011001970000007002200210000000000112019f0000000d02000029000000000012041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006210400004100000b5e0000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000012270000c13d000010ec0000013d000005f90020009c000600040000003d000012330000413d000005fa0010009c00000006010000390000000501004039000600000001001d0000000c01000029000005df1010012a000500000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d000012850000413d000000000521004b000012850000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f0000128b0000013d000005eb0060009c0000128d0000213d000000000042004b0000128d0000813d000005ec02600197000000000121019f0000001002000029000000000012041b00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b000012cb0000613d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b000013030000c13d000005df0620012a0000130a0000013d0000000801000029000000000101041a000d00000001001d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b000014080000c13d000005df0330012a0000140f0000013d000005ee0030009c00000b630000213d000005df1010012a00000005011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de002001980000131b0000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c0000131d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013480000013d0000000002000019000013850000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000013380000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000013340000c13d0000001f07400190000013450000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000014790000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b00000000020600190000000103000039000013750000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a900000001033002720000000004050019000013620000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a9000000010110027200000000040500190000136d0000c13d00000000022600d900000000012300a9000000000002004b0000137b0000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b0000000002000019000013850000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000013be0000c13d0000000001010433000000000010043f00000001030000310000000102000039000013e50000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000013d50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000013d10000c13d0000001f05500190000013e20000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f0000000100200190000014380000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000005022000b9000005df2020012a0000000002230049000005ef032000d1000005df023000d1000000000003004b000014150000613d00000000033200d9000005df0030009c00000b6b0000c13d0000000d03000029000005df03300198000006e70000613d00000000023200d9000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a00000090021002700000000702200029000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000060020006c000012370000413d000004100000013d000000000001042f000000400100043d0000062c0200004100000b080000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000014530000c13d000010ec0000013d000000000301041a000006110030009c0000145e0000a13d000000400100043d000006280200004100000b080000013d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b0000000c01000029000000000101041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000000c02000029000000000012041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000b5e0000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000014800000c13d000010ec0000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b000014930000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b0000148d0000413d000000000001042d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014d50000613d0000000306000029000005c4026001970000000203000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80060009c000014cc0000413d000000000521004b000014cc0000a13d0000000408000029000000000308041a0000009006300272000014d60000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f000014d30000013d000005eb0060009c0000000408000029000014d40000213d000000000032004b000014d40000813d000005ec02600197000000000121019f000000000018041b000000000001042d000000000001042f0000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e000104300006000000000002000400000003001d000600000002001d000500000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000602000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b000000000101041a000000000001004b0000163b0000613d00000005090000290000000307900039000000000207041a0000000001120049000006310010009c000000000201001900000000020060190000000403000029000005df0830019700000000328200a900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed03500197000000000332001900000000028100a9000000000323004b00000000040000390000000104004039000000000343004b0000151c0000c13d000005df0620012a000015250000013d000005ee0030009c0000162d0000213d000005df3080012a000005df1010012a00000000013100a9000005df1010012a0000000001120049000005ef061000d100000005090000290000000201900039000000000201041a000005de00200198000400000001001d000015370000613d000500000006001d000000400b00043d000005fc0100004100000000001b04350000000001000414000005dd02200197000000040020008c000015390000c13d0000000103000031000000200030008c00000020040000390000000004034019000015690000013d0000000002000019000015aa0000013d000100000008001d000200000007001d000005c400b0009c000005c40300004100000000030b40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c700030000000b001d170c17020000040f000000030b00002900000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000015570000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000015530000c13d000000000006004b000015640000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0000000100200190000016590000613d000000020700002900000001080000290000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000005e20010009c000016530000213d0000000100200190000016530000c13d000000400010043f000000200030008c0000162d0000413d00000000010b0433000000ff0010008c0000162d0000213d0000004d0010008c00000005060000290000162f0000213d000000000001004b000015980000613d0000000a0400003900000001020000390000000003010019000000010030019000000000054400a9000000010400603900000000022400a900000001033002720000000004050019000015810000c13d000000000002004b000016350000613d0000000a040000390000000103000039000000010010019000000000054400a9000000010400603900000000033400a9000000010110027200000000040500190000158c0000c13d00000000022600d900000000012300a9000000000002004b0000159d0000c13d000015a00000013d0000000103000039000000000206001900000000012300a9000000000002004b000015a00000613d00000000022100d9000000000023004b0000162f0000c13d000000000016004b0000162f0000413d000000000316004b0000000002000019000015aa0000613d000005df023000d100000000033200d9000005df0030009c00000000060100190000162f0000c13d000000000008004b000016350000613d00000000018200d9000000000207041a00030000001200530000162f0000413d000500000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000602000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000302000029000000000021041b0000000401000029000000000201041a000000400100043d000000240310003900000005060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000015e20000c13d00000001020000390000000001010433000000000010043f00000001030000310000160a0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000015fa0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000015f60000c13d000000000005004b000016070000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000506000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000016430000613d000000000254016f000000000223019f0000000100200190000016430000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f30400004100000006050000290000000006000411170c16fd0000040f00000001002001900000162d0000613d000000000001042d00000000010000190000170e000104300000062401000041000000000010043f0000001101000039000000040010043f00000625010000410000170e000104300000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e00010430000000400100043d0000062c020000410000000000210435000005c40010009c000005c4010080410000004001100210000005fd011001c70000170e000104300000004402100039000005ff03000041000000000032043500000024021000390000000f03000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e000104300000062401000041000000000010043f0000004101000039000000040010043f00000625010000410000170e000104300000001f0530018f000005fe06300198000000400200043d0000000004620019000016640000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016600000c13d000000000005004b000016710000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005c40020009c000005c4020080410000004002200210000000000121019f0000170e000104300002000000000002000100000002001d00000632020000410000000000200443000200000001001d00000004001004430000000001000414000005c40010009c000005c401008041000000c00110021000000633011001c70000800202000039170c17020000040f0000000100200190000016d60000613d000000400300043d000000000101043b000000000001004b000016d70000613d0000004401300039000000010200002900000000002104350000002401300039000000000200041000000000002104350000061c01000041000000000013043500000004013000390000000002000411000000000021043500000000010004140000000202000029000005dd02200197000000040020008c0000169f0000c13d00000001020000390000000001030433000000000010043f0000000103000031000016c60000013d000005c40030009c000005c4030080410000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f00000601011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000016b70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000016b30000c13d000000000005004b000016c40000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000016de0000613d000000000141016f000000000113019f0000000100100190000016de0000613d000000000001042d000000000001042f00000634010000410000000000130435000005c40030009c000005c4030080410000004001300210000005fd011001c70000170e00010430000000400100043d00000044021000390000061d03000041000000000032043500000024021000390000001403000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e00010430000000000001042f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f0000000100200190000016fb0000613d000000000101043b000000000001042d00000000010000190000170e0001043000001700002104210000000102000039000000000001042d0000000002000019000000000001042d00001705002104230000000102000039000000000001042d0000000002000019000000000001042d0000170a002104250000000102000039000000000001042d0000000002000019000000000001042d0000170c000004320000170d0001042e0000170e00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000073455b9e00000000000000000000000000000000000000000000000000000000a2beb50f00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b900000000000000000000000000000000000000000000000000000000a2beb51000000000000000000000000000000000000000000000000000000000cc4010580000000000000000000000000000000000000000000000000000000088e70f280000000000000000000000000000000000000000000000000000000088e70f290000000000000000000000000000000000000000000000000000000093d1692f0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000058ff9fe40000000000000000000000000000000000000000000000000000000064721190000000000000000000000000000000000000000000000000000000006472119100000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000058ff9fe5000000000000000000000000000000000000000000000000000000005eac62390000000000000000000000000000000000000000000000000000000022e0772b0000000000000000000000000000000000000000000000000000000022e0772c0000000000000000000000000000000000000000000000000000000052526c8000000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000001200000008000000000000000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f0200000000000000000000000000000000000040000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f303ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff313ce56700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe05452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000099039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffedf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffff000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000002000000000000000000000000000000000000a00000000000000000000000009d78e53230a3050788c30dcf4ee1946bc54701786d738ba468f6458b18591f3b0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000b4fa3fb3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c10000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc800000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff0857121700000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712a0caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df8171000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000005245454e5452414e4359000000000000000000000000000000000000000000005fd8a13200000000000000000000000000000000000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8f5989a7380745c89336ffe0a26acf06222b96f487962c3747400d51e2c6f0f", + "deployedBytecode": "0x00030000000000020010000000000002000000000c01034f00020000000c035500000000010c00190000006001100270000005c40010019d0000008004000039000000400040043f0000000100200190000000c80000c13d000005c403100197000000040030008c00000b630000413d00000000013c034f00000000020c043b000000e002200270000005c60020009c000000d20000213d000005d20020009c000000f70000213d000005d80020009c000003160000213d000005db0020009c0000054d0000613d000005dc0020009c00000b630000c13d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000e02043b000005e200e0009c00000b630000213d0000002302e00039000000000032004b00000b630000813d0000000402e0003900000000022c034f000000000f02043b000005e200f0009c00000b630000213d0010002400e0003d0000000502f002100000001002200029000000000032004b00000b630000213d00000000000f004b000003450000613d000000200d00008a0000000002000019000e0000000e001d000d0000000f001d0000000004e30049000f00000002001d0000000502200210000000100220002900000000022c034f000000000202043b000000430440008a0000061e054001970000061e06200197000000000756013f000000000056004b00000000050000190000061e05002041000000000042004b00000000040000190000061e040040410000061e0070009c000000000504c019000000000005004b00000b630000613d000000100420002900000000024c034f000000000b02043b000005e200b0009c00000b630000213d0000000005b3004900000020044000390000061e065001970000061e07400197000000000867013f000000000067004b00000000060000190000061e06004041000000000054004b00000000050000190000061e050020410000061e0080009c000000000605c019000000000006004b00000b630000c13d00000000064c034f0000000007db0170000000400400043d00000000057400190000006a0000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b000000660000c13d0000001f08b00190000000770000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000000800000c13d00000001060000310000000102000039000000960000013d000005c400b0009c000005c40b0080410000006001b00210000005c40040009c000005c4040080410000004003400210000000000113019f000005c40050009c000005c405008041000000c003500210000000000113019f170c17070000040f0000000d0f0000290000000e0e000029000000200d00008a0000000003000031000000020c000367000000010220018f00000000040100190000006004400270000105c40040019d000005c406400197000000000006004b00000080040000390000006005000039000000c10000613d0000062f0060009c000006170000813d0000001f046000390000000004d4016f0000003f044000390000000004d4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000005e20040009c000006170000213d0000000100700190000006170000c13d000000400040043f00000000046504360000000008d601700000000007840019000000b40000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000000b00000c13d0000001f06600190000000c10000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b000009a20000613d0000000f0200002900000001022000390000000000f2004b000000370000413d000003450000013d0000000001000416000000000001004b00000b630000c13d0000000101000039000000000010041b000000200100003900000100001004430000012000000443000005c5010000410000170d0001042e000005c70020009c000002fb0000213d000005cd0020009c000003470000213d000005d00020009c000005550000613d000005d10020009c00000b630000c13d000000440030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005dd0010009c00000b630000213d0000002402c00370000000000202043b001000000002001d000005dd0020009c00000b630000213d000000000010043f0000000401000039000000200010043f170c16f00000040f0000001002000029000000000020043f000000200010043f170c16f00000040f000000000101041a000005df02100197000000800020043f0000007001100270000000a00010043f0000060e010000410000170d0001042e000005d30020009c000003a30000213d000005d60020009c000005b90000613d000005d70020009c00000b630000c13d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000202043b000005e20020009c00000b630000213d0000002304200039000000000034004b00000b630000813d000000040420003900000000044c034f000000000404043b000800000004001d000005e20040009c00000b630000213d000700240020003d000000080200002900000005022002100000000704200029000000000034004b00000b630000213d000000000300041a000000010030008c000007180000c13d0000000203000039000000000030041b0000003f03200039000005e303300197000005e40030009c000006170000213d0000008003300039000000400030043f0000000803000029000000800030043f0000001f0320018f000000000002004b0000012b0000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b000001270000c13d000000000003004b000000080000006b000007320000613d0000000002000019000a00000002001d0000000502200210000900000002001d0000000701200029000f00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b00000a1a0000813d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000d00000001001d000000000101041a000e00000001001d001000000002001d0000000401200039000c00000001001d000000000101041a000b00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000b06000029000005c4026001970000000e03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000001007000029000e00030070003d000001830000413d000000000521004b000001830000a13d0000000c08000029000000000408041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f000000000018041b0000000f030000290000018c0000013d000005eb0060009c0000000f030000290000000c050000290000018c0000213d000000000042004b0000018c0000813d000005ec02600197000000000121019f000000000015041b0000000201300367000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b00000010020000290000000102200039000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a001000000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000001002000029000005df062001970000000e02000029000000000202041a0000000001120049000006310010009c0000000002010019000000000200601900000000326200a900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed03500197000000000332001900000000026100a9000000000323004b00000000040000390000000104004039000000000343004b000001ea0000c13d000005df0120012a000001f20000013d000005ee0030009c00000b630000213d000005df3060012a000005df1010012a00000000013100a9000005df1010012a0000000001120049000005ef011000d1001000000001001d0000000d01000029000000000201041a000005de00200198000002030000613d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c000002050000c13d0000000103000031000000200030008c00000020040000390000000004034019000002320000013d00000000020000190000026e0000013d000b00000006001d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000c0000000a001d170c17020000040f0000000c0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000002210000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b0000021d0000c13d0000001f074001900000022e0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000010e10000613d0000000b060000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c00000b6b0000213d000000000001004b000000100200002900000001030000390000025e0000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a9000000010330027200000000040500190000024b0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a900000001011002720000000004050019000002560000c13d00000010022000f900000000012300a9000000000002004b000002640000613d00000000022100d9000000000023004b00000b6b0000c13d000000100010006b00000b6b0000413d000000100310006b00000000020000190000026e0000613d000005df023000d100000000033200d9000005df0030009c001000000001001d00000b6b0000c13d000000000006004b000006e70000613d00000000016200d90000000e02000029000000000202041a000e00000012005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000d01000029000000000201041a000000400100043d000000240310003900000010040000290000000000430435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000002a60000c13d0000000001010433000000000010043f00000001030000310000000102000039000002cc0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000002bd0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000002b90000c13d0000001f05500190000002ca0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d00000010020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f000000010020019000000b630000613d000000800100043d0000000a02000029000000000021004b00000a1d0000a13d0000000901000029000000a001100039000000100300002900000000003104350000000102200039000000080020006c0000012f0000413d000007320000013d000005c80020009c000005300000213d000005cb0020009c000005f60000613d000005cc0020009c00000b630000c13d000000440030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005dd0010009c00000b630000213d000000000010043f0000000301000039000000200010043f00100000000c0353170c16f00000040f000000100200035f0000002402200370000000000202043b000000000020043f000000200010043f170c16f00000040f000005510000013d000005d90020009c0000061d0000613d000005da0020009c00000b630000c13d000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005e20010009c00000b630000213d0000002302100039000000000032004b00000b630000813d000000040210003900000000022c034f000000000402043b000005e20040009c000006170000213d00000005024002100000003f05200039000005e305500197000005e40050009c000006170000213d0000008005500039000000400050043f000000800040043f00000024011000390000000002120019000000000032004b00000b630000213d000000000004004b000003450000613d000000800300003900000000041c034f000000000404043b000000200330003900000000004304350000002001100039000000000021004b0000033a0000413d000000800100043d000900000001001d000000000001004b000007420000c13d00000000010000190000170d0001042e000005ce0020009c0000065d0000613d000005cf0020009c00000b630000c13d000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000300000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000700000001001d000005df0010009c00000b630000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000600000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b00000003010000290000000702000029170c16770000040f0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d0000000702300029000005df0020009c00000b6b0000213d000005f401100197000000000112019f0000000802000029000000000012041b000005f50010009c000009ed0000813d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d0200003900000003030000390000060204000041000000030500002900000b5f0000013d000005d40020009c0000068e0000613d000005d50020009c00000b630000c13d000000840030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000005df0010009c00000b630000213d0000004402c00370000000000202043b000005e20020009c00000b630000213d0000002305200039000000000035004b00000b630000813d000000040520003900000000055c034f000000000605043b000005e20060009c000006170000213d00000005056002100000003f07500039000005e307700197000005e40070009c000006170000213d0000008007700039000000400070043f000000800060043f00000024022000390000000005250019000000000035004b00000b630000213d000000000006004b000003d60000613d00000000032c034f000000000303043b000000200440003900000000003404350000002002200039000000000052004b000003cf0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b00000b630000c13d000000000200041a000000010020008c000009e60000c13d0000000202000039000000000020041b000005df021001970000001001000029000700000002001d170c16770000040f0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005dd02200197000400000002001d000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d0000000702300029000005df0020009c00000b6b0000213d000005f403100197000000000232019f0000000803000029000000000023041b000005f50020009c00000eb80000813d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000006020400004100000004050000290000000006000411170c16fd0000040f000000010020019000000b630000613d0000000102000039000000000020041b000000800100043d000900000001001d000000000001004b000003450000613d0000000004000019000000800100043d000000000041004b000080100300003900000a1d0000a13d000b00000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b001000000004001d000000010140008a000000000202041a000000000021004b00000a1a0000813d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000000002030019170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000a00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000005df00100198000005b60000613d0000000f020000290000000201200039000000000101041a000c00000001001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d07000029000005c4037001970000000c02000029000000a002200270000005c404200197000000000501043b000000000045004b00000000020400190000000002054019000005e80070009c0000000f010000290000000301100039000004c10000413d000000000632004b000004c10000a13d0000000e09000029000000000509041a0000009007500272000006e70000613d00000000033400490000002004500270000005df0840019700000000066800a900000000033600d9000005df063000d100000000067600d9000000000701041a0000000006670019000000000061041b00000000033400490000002003300210000005e903300197000005ea04500197000000000334019f000000000223019f000000000029041b000004c90000013d000005eb0070009c000004c90000213d000000000053004b000004c90000813d000005ec03700197000000000232019f0000000e03000029000000000023041b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000a02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb0220019800000eb50000613d000000000301041a000006110030009c0000000e050000290000145b0000213d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f000000000015041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000010050000290000000006000411170c16fd0000040f000000010020019000000b630000613d0000000102000039000000000020041b0000000b040000290000000104400039000000090040006c0000042b0000413d000003450000013d000005c90020009c000006ed0000613d000005ca0020009c00000b630000c13d000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000000000200041a000000010020008c000007180000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b0000068a0000813d000000000010043f000000200020043f170c16f00000040f170c14940000040f0000000101000039000000000010041b00000000010000190000170d0001042e0000000001000416000000000001004b00000b630000c13d0000000101000039000000000101041a000000800010043f000005e1010000410000170d0001042e000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000301043b000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b0000068a0000813d001000000003001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000e00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000005df0010019800000a230000c13d000000400100043d0000062a0200004100000b080000013d000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000f00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000e00000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000d00000001001d000000000101041a001000700010027a00000b060000613d000005f60010009c000009c30000813d000000010200003900000ad50000013d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000202043b000005e20020009c00000b630000213d0000002304200039000000000034004b00000b630000813d000000040420003900000000044c034f000000000404043b000800000004001d000005e20040009c00000b630000213d000700240020003d000000080200002900000005022002100000000704200029000000000034004b00000b630000213d000000000300041a000000010030008c000007180000c13d0000000203000039000000000030041b0000003f03200039000005e303300197000005e40030009c000007220000a13d0000062401000041000000000010043f0000004101000039000000040010043f00000625010000410000170e00010430000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000300000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000700000001001d000005df0010009c00000b630000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000600000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d000000070230006c000009ca0000813d000000400100043d0000062e0200004100000b080000013d000000c40030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000f00000001001d000005dd0010009c00000b630000213d0000004401c00370000000000101043b000e00000001001d000005df0010009c00000b630000213d0000006401c00370000000000101043b000d00000001001d000005c40010009c00000b630000213d0000008401c00370000000000101043b000c00000001001d000005c40010009c00000b630000213d000000a401c00370000000000201043b000000000002004b0000000001000039000000010100c039000b00000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000e0000006b000009f70000c13d0000060f01000041000000800010043f00000610010000410000170e00010430000000840030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000002401c00370000000000301043b0000061500300198000006160100004100000000010060190000061702300197000000000121019f0000000402c00370000000000202043b001000000002001d000f00000003001d000000000013004b00000b630000c13d0000004401c00370000000000101043b000e00000001001d000005c40010009c00000b630000213d0000006401c00370000000000101043b000d00000001001d000005c40010009c00000b630000213d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000301043b000000000103041a000005dd011001970000000002000411000000000012004b000008510000c13d0000000401300039000800000003001d0000000202300039000900000002001d000000000202041a000a00000002001d000c00000001001d000000000101041a000b00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000b05000029000005c4025001970000000a03000029000000a003300270000005c404300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000005e80050009c00000a130000413d000000000521004b00000a130000a13d0000000c03000029000000000303041a000000900630027200000a5a0000c13d0000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e00010430000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f170c16f00000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000005dd01100197000000800010043f000005dd01500197000000a00010043f000005dd01400197000000c00010043f000000a001400270000005c401100197000000e00010043f000005de004001980000000001000039000000010100c039000001000010043f000001200030043f000005c401200197000001400010043f0000002001200270000005df01100197000001600010043f0000009001200270000001800010043f000005e0010000410000170d0001042e0000060001000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000062601000041000000c40010043f0000062b010000410000170e000104300000008003300039000000400030043f0000000803000029000000800030043f0000001f0320018f000000000002004b0000072f0000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000072b0000c13d000000000003004b000000080000006b000008540000c13d0000000101000039000000000010041b000000400100043d001000000001001d0000008002000039170c14850000040f00000010020000290000000001210049000005c40010009c000005c4010080410000006001100210000005c40020009c000005c4020080410000004002200210000000000121019f0000170d0001042e000000010200003900008010030000390000000004000019000000800100043d000000000041004b00000a1d0000a13d000000000100041a000000010010008c000009e60000c13d000b00000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b001000000004001d000000010140008a000000000202041a000000000021004b00000a1a0000813d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000000002030019170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000a00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d0000000f02000029000000000101043b000000000101041a000005df00100198000005b60000613d0000000201200039000000000101041a000c00000001001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d07000029000005c4037001970000000c02000029000000a002200270000005c404200197000000000501043b000000000045004b00000000090400190000000009054019000005e80070009c0000000f010000290000000301100039000007de0000413d000000000639004b000007de0000a13d0000000e0a00002900000000050a041a0000009007500272000006e70000613d00000000033400490000002004500270000005df0840019700000000066800a900000000033600d9000005df063000d100000000067600d9000000000701041a0000000006670019000000000061041b00000000033400490000002003300210000005e903300197000005ea04500197000000000334019f000000000293019f00000000002a041b0000801002000039000007e70000013d000005eb0070009c0000801002000039000007e70000213d000000000053004b000007e70000813d000005ec03700197000000000339019f0000000e04000029000000000034041b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c7170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000a02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb0220019800000eb50000613d000000000301041a000005fa0030009c0000000e050000290000145b0000813d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f000000000015041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000010050000290000000006000411170c16fd0000040f0000000100200190000080100300003900000b630000613d0000000102000039000000000020041b0000000b040000290000000104400039000000090040006c000007450000413d000003450000013d000000400100043d000006270200004100000b080000013d000000400100043d000006180200004100000b080000013d0000000002000019000b00000002001d0000000502200210000900000002001d0000000701200029001000000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b00000a1a0000813d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000a00000001001d000000000101041a000c00000001001d000f00000002001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000c03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000f070000290000000308700039000c00000008001d000008a90000413d000000000521004b000008a90000a13d0000000e09000029000000000409041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d9000000000608041a0000000005560019000000000058041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f000000000019041b0000001003000029000008b20000013d000005eb0060009c00000010030000290000000e05000029000008b20000213d000000000042004b000008b20000813d000005ec02600197000000000121019f000000000015041b0000000201300367000000000101043b001000000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000f01000029000005df011001970000000c03000029000000000703041a0000000002270049000006310020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed04600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000e00000007001d000009110000c13d000005df0230012a000009190000013d000005ee0040009c00000b630000213d000005df4010012a000005df2020012a00000000024200a9000005df2020012a0000000002230049000005ef022000d1000f00000002001d000000000001004b000006e70000613d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000a01000029000000000201041a000000400100043d00000024031000390000000f040000290000000000430435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c0000094d0000c13d0000000001010433000000000010043f00000001030000310000000102000039000009730000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000009640000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000009600000c13d0000001f05500190000009710000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d000000400100043d0000000f020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f30400004100000010050000290000000006000411170c16fd0000040f000000010020019000000b630000613d000000800100043d0000000b02000029000000000021004b00000a1d0000a13d0000000901000029000000a0011000390000000f0300002900000000003104350000000102200039000000080020006c000008550000413d000007320000013d000000400100043d000006300200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000009b60000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000009af0000413d0000001f042000390000000004d4016f000000000223001900000000000204350000004402400039000005c40020009c000005c4020080410000006002200210000005c40010009c000005c4010080410000004001100210000000000112019f0000170e00010430000005f70010009c000000020200003900000ad50000413d000005f80010009c00000acf0000813d000000030200003900000ad50000013d000005f50020009c00000b6b0000813d000005f401100197000000000112019f0000000802000029000000000012041b000005f50010009c00000b0e0000813d000000400100043d000000240210003900000007030000290000000000320435000005f002000041000000000021043500000004021000390000000003000411000000000032043500000000020004140000000303000029000005dd03300197001000000003001d000000040030008c00000b180000c13d00000001020000390000000001010433000000000010043f000000010300003100000b400000013d000000400100043d00000044021000390000062603000041000000000032043500000024021000390000000a03000039000011b30000013d000500010000003d000005f60010009c00000bbd0000413d000005f70010009c000500020000003d00000bbd0000413d000005f80010009c00000bb60000813d000000030100003900000bbc0000013d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b000005c4021001970000000d0010006b0000000d02008029000d00000002001d0000000c0020006c00000acc0000813d0000000102000039000000000102041a0000000101100039000000000012041b000a00000001001d000006030010009c00000dd20000413d000000400100043d0000060d0200004100000b080000013d000005eb0060009c00000a6e0000213d000000000032004b00000a6e0000813d000005ec02600197000000000121019f00000a6c0000013d000000400100043d0000060f0200004100000b080000013d0000062401000041000000000010043f0000003201000039000000040010043f00000625010000410000170e000104300000000f020000290000000201200039000000000101041a000b00000001001d0000000401200039000c00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d05000029000005c4025001970000000b03000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80050009c00000e6a0000413d000000000521004b00000e6a0000a13d0000000c03000029000000000303041a0000009006300272000006e70000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d90000000f060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f00000e720000013d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000008060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f0000000c02000029000000000012041b0000000e01000029000e05c40010019c00000a850000613d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b000005c4021001970000000e0010006b0000000e020080290000000c03000029000000000103041a000005ec01100197000000000121019f000000000013041b0000000d0000006b00000a8a0000c13d0000000901000029000000000101041a00000a9f0000013d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b0000000d0010006b0000000d01008029000000a00110021000000608011001970000000903000029000000000203041a0000061902200197000000000121019f000000000013041b000000a002100270000005c4032001970000000c02000029000000000202041a000005c404200197000000000034004b00000acc0000813d0000000f03000029000006050030009c00000b650000213d0000000f0000006b00000b650000613d0000000f03000029000005df043001970000002003200270000005df033001970000000003430019000005df0030009c00000b6b0000213d0000061b022001970000002003300210000005e903300197000000000223019f0000000c03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000061c0200004100000000002304350000000402300039000000000400041100000000004204350000000004000414000005dd02100197000000040020008c000010ff0000c13d00000001020000390000000001030433000000000010043f0000000103000031000011260000013d000000400100043d0000061a0200004100000b080000013d000005f90010009c000000040200003900000ad50000413d000005fa0010009c000000060200003900000005020040390000000f0020006b00000b060000813d0000000f01000029000c0018001000cd000000000001004b00000adf0000613d0000000c020000290000000f012000fa000000180010008c00000b6b0000c13d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f0000000c04000029000000100340024f000005fb03300197000000ff0040008c0000000003002019001000000003001d000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b00000b710000c13d000000400100043d000006220200004100000b080000013d000000400100043d00000623020000410000000000210435000005c40010009c000005c4010080410000004001100210000005fd011001c70000170e00010430000500010000003d000005f60010009c00000ec90000413d000005f70010009c000500020000003d00000ec90000413d000005f80010009c00000ec20000813d000000030100003900000ec80000013d000005c40010009c000005c4010080410000004001100210000005c40020009c000005c402008041000000c002200210000000000112019f000005f1011001c70000001002000029170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000b310000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000b2d0000c13d000000000005004b00000b3e0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d0200003900000003030000390000062d0400004100000010050000290000000006000411170c16fd0000040f0000000100200190000005490000c13d00000000010000190000170e000104300000000f030000290000061e0030009c000011910000413d0000000f03000029000006160030009c0000113c0000c13d0000062401000041000000000010043f0000001101000039000000040010043f00000625010000410000170e000104300000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000000000101041a000a00000001001d000900000002001d0000000401200039000b00000001001d000000000101041a000c00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000c05000029000005c4025001970000000a03000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80050009c000011be0000413d000000000521004b000011be0000a13d0000000b03000029000000000303041a0000009006300272000006e70000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000009060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f000011c60000013d000005f90010009c000500040000003d00000bbd0000413d000005fa0010009c00000006010000390000000501004039000500000001001d0000000c01000029000005df1010012a000400000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d00000c0f0000413d000000000521004b00000c0f0000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f00000c150000013d000005eb0060009c00000c170000213d000000000042004b00000c170000813d000005ec02600197000000000121019f0000001002000029000000000012041b0000000001000411000000000010043f0000000301000039000000200010043f000000060000006b00000c520000613d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b00000c8d0000c13d000005df0620012a00000c940000013d0000000801000029000000000101041a000d00000001001d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b00000d920000c13d000005df0330012a000005df023000d1000000000003004b00000d9c0000c13d00000d9f0000013d000005ee0030009c00000b630000213d000005df1010012a00000004011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de0020019800000ca50000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c00000ca70000c13d0000000103000031000000200030008c0000002004000039000000000403401900000cd20000013d000000000200001900000d0f0000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000cc20000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000cbe0000c13d0000001f0740019000000ccf0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000012200000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b0000000002060019000000010300003900000cff0000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a90000000103300272000000000405001900000cec0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a90000000101100272000000000405001900000cf70000c13d00000000022600d900000000012300a9000000000002004b00000d050000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b000000000200001900000d0f0000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c00000d480000c13d0000000001010433000000000010043f0000000103000031000000010200003900000d6f0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c00000020050000390000000005034019000000200450019000000d5f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d5b0000c13d0000001f0550019000000d6c0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f000000010020019000000dc20000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000004022000b9000005df2020012a0000000002230049000005ef032000d1000005df023000d1000000000003004b00000d9f0000613d00000000033200d9000005df0030009c00000b6b0000c13d0000000d03000029000005df03300198000006e70000613d00000000023200d9000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a00000090021002700000000702200029000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000050020006c00000bc10000413d000003920000013d0000000f010000290000000e02000029170c16770000040f000000400100043d000900000001001d000006040010009c000006170000213d00000009030000290000012001300039000000400010043f000000e0023000390000000e01000029000700000002001d0000000000120435000000c0023000390000000d01000029000800000002001d0000000000120435000000a0023000390000060501000041000600000002001d000000000012043500000080023000390000000b01000029000500000002001d000000000012043500000060023000390000000c01000029000300000002001d000000000012043500000040023000390000000f01000029000200000002001d000000000012043500000020023000390000001001000029000100000002001d0000000000120435000000000100041100000000001304350000010001300039000400000001001d00000000000104350000000a01000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d00000009020000290000000002020433000005dd02200197000000000101043b000000000301041a0000060603300197000000000223019f000000000021041b00000001020000290000000002020433000005dd022001970000000103100039000000000403041a0000060604400197000000000224019f000000000023041b00000002020000290000000002020433000005dd022001970000000203100039000000000403041a0000060704400197000000000224019f00000003040000290000000004040433000000a0044002100000060804400197000000000242019f00000005040000290000000004040433000000000004004b00000609040000410000000004006019000000000242019f000000000023041b000000060200002900000000020204330000000303100039000000000023041b000000040200002900000000020204330000009002200210000000070300002900000000030304330000002003300210000005e903300197000000000232019f00000008030000290000000003030433000005c403300197000000000232019f0000000401100039000000000021041b000000400100043d00000080021000390000000b03000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000000d03000029000000000032043500000020021000390000000e0300002900000000003204350000000a020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f0000060a011001c70000800d0200003900000004030000390000060b0400004100000010050000290000000f060000290000000007000411170c16fd0000040f000000010020019000000b630000613d0000000101000039000000000010041b000000400100043d0000000a020000290000000000210435000005c40010009c000005c40100804100000040011002100000060c011001c70000170d0001042e0000000d04000029000005eb0040009c00000e740000213d000000000032004b00000e740000813d0000000d02000029000005ec02200197000000000121019f0000000c02000029000000000012041b0000000f010000290000000301100039000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb02200198000014580000c13d000000400100043d000006290200004100000b080000013d000600010000003d000005f60020009c000012330000413d000005f70020009c000600020000003d000012330000413d000005f80020009c0000122c0000813d0000000301000039000012320000013d000005f90010009c000500040000003d00000ec90000413d000005fa0010009c00000006010000390000000501004039000500000001001d0000000c01000029000005df1010012a000400000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d00000f1b0000413d000000000521004b00000f1b0000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f00000f210000013d000005eb0060009c00000f230000213d000000000042004b00000f230000813d000005ec02600197000000000121019f0000001002000029000000000012041b000000060000006b00000f760000613d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b00000f5e0000c13d000005df0620012a00000f650000013d000005ee0030009c00000b630000213d000005df1010012a00000004011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de0020019800000fb70000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c00000fb90000c13d0000000103000031000000200030008c0000002004000039000000000403401900000fe40000013d0000000801000029000000000101041a000005df0110019800000f250000613d000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b000010a40000c13d000005df0230012a000005df032000d1000000000002004b000010ae0000c13d000010b10000013d0000000002000019000010210000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000fd40000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000fd00000c13d0000001f0740019000000fe10000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00000001002001900000144c0000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b00000000020600190000000103000039000010110000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a90000000103300272000000000405001900000ffe0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a900000001011002720000000004050019000010090000c13d00000000022600d900000000012300a9000000000002004b000010170000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b0000000002000019000010210000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c0000105a0000c13d0000000001010433000000000010043f00000001030000310000000102000039000010810000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000010710000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000106d0000c13d0000001f055001900000107e0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f0000000100200190000010d10000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000004022000b9000005df2020012a0000000002230049000005ef022000d1000005df032000d1000000000002004b000010b10000613d00000000022300d9000005df0020009c00000b6b0000c13d0000000d023000fa000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a0000009002100270000000070220006a000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000050020006c00000ecd0000413d000009d20000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e80000c13d000000000005004b000010f90000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005c40020009c000005c4020080410000004002200210000000000112019f0000170e00010430000005c40030009c000005c4030080410000004001300210000005c40040009c000005c404008041000000c003400210000000000113019f00000601011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011170000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000011130000c13d000000000005004b000011240000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011350000613d000000000141016f000000000113019f0000000100100190000011910000c13d000000400100043d00000044021000390000061d03000041000000000032043500000024021000390000001403000039000011b30000013d0000000f030000290000000003300089000005df043001970000002003200270000005df05300197000000000054004b000000000405801900000000034300490000002003300210000005e9033001970000061b02200197000000000223019f0000000c03000029000000000023041b000000400300043d00000024023000390000000000420435000005f00200004100000000002304350000000402300039000000000400041100000000004204350000000004000414000005dd02100197000000040020008c0000115b0000c13d00000001020000390000000001030433000000000010043f0000000103000031000011820000013d000005c40030009c000005c4030080410000004001300210000005c40040009c000005c404008041000000c003400210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011730000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000116f0000c13d000000000005004b000011800000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d0000000901000029000000000101041a0000000c02000029000000000202041a000005c402200197000000400300043d00000020043000390000000000240435000000a001100270000005c401100197000000400230003900000000001204350000000f010000290000000000130435000005c40030009c000005c40300804100000040013002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f0000061f011001c70000800d0200003900000002030000390000062004000041000000100500002900000b600000013d000000400100043d0000004402100039000005ff03000041000000000032043500000024021000390000000f03000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e000104300000000c04000029000005eb0040009c000011c80000213d000000000032004b000011c80000813d0000000c02000029000005ec02200197000000000121019f0000000b02000029000000000012041b0000000e0000006b000011d00000c13d0000000d01000029000000000101041a000005df0310019700000009010000290000001002000029170c14dc0000040f0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000001041b0000000d01000029000000000101041a000005df021001970000000b01000029000000000101041a00000090031002700000000002230049000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000000b02000029000000000012041b0000000d01000029000000000101041a00000070021002700000000f03000029000000050030008c000012120000213d0000061e03000041000000010400008a0000061e0030009c000000000400c0190000000f03000029000000060330008900000018033000ca000001000530008900000000045401cf000005ea0530027f000000000445019f000005ea04006041000005eb0330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f000005df011001970000007002200210000000000112019f0000000d02000029000000000012041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006210400004100000b5e0000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000012270000c13d000010ec0000013d000005f90020009c000600040000003d000012330000413d000005fa0010009c00000006010000390000000501004039000600000001001d0000000c01000029000005df1010012a000500000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d000012850000413d000000000521004b000012850000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f0000128b0000013d000005eb0060009c0000128d0000213d000000000042004b0000128d0000813d000005ec02600197000000000121019f0000001002000029000000000012041b00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b000012cb0000613d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b000013030000c13d000005df0620012a0000130a0000013d0000000801000029000000000101041a000d00000001001d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b000014080000c13d000005df0330012a0000140f0000013d000005ee0030009c00000b630000213d000005df1010012a00000005011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de002001980000131b0000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c0000131d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013480000013d0000000002000019000013850000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000013380000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000013340000c13d0000001f07400190000013450000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000014790000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b00000000020600190000000103000039000013750000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a900000001033002720000000004050019000013620000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a9000000010110027200000000040500190000136d0000c13d00000000022600d900000000012300a9000000000002004b0000137b0000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b0000000002000019000013850000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000013be0000c13d0000000001010433000000000010043f00000001030000310000000102000039000013e50000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000013d50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000013d10000c13d0000001f05500190000013e20000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f0000000100200190000014380000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000005022000b9000005df2020012a0000000002230049000005ef032000d1000005df023000d1000000000003004b000014150000613d00000000033200d9000005df0030009c00000b6b0000c13d0000000d03000029000005df03300198000006e70000613d00000000023200d9000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a00000090021002700000000702200029000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000060020006c000012370000413d000004100000013d000000000001042f000000400100043d0000062c0200004100000b080000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000014530000c13d000010ec0000013d000000000301041a000006110030009c0000145e0000a13d000000400100043d000006280200004100000b080000013d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b0000000c01000029000000000101041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000000c02000029000000000012041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000b5e0000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000014800000c13d000010ec0000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b000014930000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b0000148d0000413d000000000001042d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014d50000613d0000000306000029000005c4026001970000000203000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80060009c000014cc0000413d000000000521004b000014cc0000a13d0000000408000029000000000308041a0000009006300272000014d60000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f000014d30000013d000005eb0060009c0000000408000029000014d40000213d000000000032004b000014d40000813d000005ec02600197000000000121019f000000000018041b000000000001042d000000000001042f0000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e000104300006000000000002000400000003001d000600000002001d000500000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000602000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b000000000101041a000000000001004b0000163b0000613d00000005090000290000000307900039000000000207041a0000000001120049000006310010009c000000000201001900000000020060190000000403000029000005df0830019700000000328200a900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed03500197000000000332001900000000028100a9000000000323004b00000000040000390000000104004039000000000343004b0000151c0000c13d000005df0620012a000015250000013d000005ee0030009c0000162d0000213d000005df3080012a000005df1010012a00000000013100a9000005df1010012a0000000001120049000005ef061000d100000005090000290000000201900039000000000201041a000005de00200198000400000001001d000015370000613d000500000006001d000000400b00043d000005fc0100004100000000001b04350000000001000414000005dd02200197000000040020008c000015390000c13d0000000103000031000000200030008c00000020040000390000000004034019000015690000013d0000000002000019000015aa0000013d000100000008001d000200000007001d000005c400b0009c000005c40300004100000000030b40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c700030000000b001d170c17020000040f000000030b00002900000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000015570000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000015530000c13d000000000006004b000015640000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0000000100200190000016590000613d000000020700002900000001080000290000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000005e20010009c000016530000213d0000000100200190000016530000c13d000000400010043f000000200030008c0000162d0000413d00000000010b0433000000ff0010008c0000162d0000213d0000004d0010008c00000005060000290000162f0000213d000000000001004b000015980000613d0000000a0400003900000001020000390000000003010019000000010030019000000000054400a9000000010400603900000000022400a900000001033002720000000004050019000015810000c13d000000000002004b000016350000613d0000000a040000390000000103000039000000010010019000000000054400a9000000010400603900000000033400a9000000010110027200000000040500190000158c0000c13d00000000022600d900000000012300a9000000000002004b0000159d0000c13d000015a00000013d0000000103000039000000000206001900000000012300a9000000000002004b000015a00000613d00000000022100d9000000000023004b0000162f0000c13d000000000016004b0000162f0000413d000000000316004b0000000002000019000015aa0000613d000005df023000d100000000033200d9000005df0030009c00000000060100190000162f0000c13d000000000008004b000016350000613d00000000018200d9000000000207041a00030000001200530000162f0000413d000500000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000602000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000302000029000000000021041b0000000401000029000000000201041a000000400100043d000000240310003900000005060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000015e20000c13d00000001020000390000000001010433000000000010043f00000001030000310000160a0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000015fa0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000015f60000c13d000000000005004b000016070000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000506000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000016430000613d000000000254016f000000000223019f0000000100200190000016430000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f30400004100000006050000290000000006000411170c16fd0000040f00000001002001900000162d0000613d000000000001042d00000000010000190000170e000104300000062401000041000000000010043f0000001101000039000000040010043f00000625010000410000170e000104300000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e00010430000000400100043d0000062c020000410000000000210435000005c40010009c000005c4010080410000004001100210000005fd011001c70000170e000104300000004402100039000005ff03000041000000000032043500000024021000390000000f03000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e000104300000062401000041000000000010043f0000004101000039000000040010043f00000625010000410000170e000104300000001f0530018f000005fe06300198000000400200043d0000000004620019000016640000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016600000c13d000000000005004b000016710000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005c40020009c000005c4020080410000004002200210000000000121019f0000170e000104300002000000000002000100000002001d00000632020000410000000000200443000200000001001d00000004001004430000000001000414000005c40010009c000005c401008041000000c00110021000000633011001c70000800202000039170c17020000040f0000000100200190000016d60000613d000000400300043d000000000101043b000000000001004b000016d70000613d0000004401300039000000010200002900000000002104350000002401300039000000000200041000000000002104350000061c01000041000000000013043500000004013000390000000002000411000000000021043500000000010004140000000202000029000005dd02200197000000040020008c0000169f0000c13d00000001020000390000000001030433000000000010043f0000000103000031000016c60000013d000005c40030009c000005c4030080410000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f00000601011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000016b70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000016b30000c13d000000000005004b000016c40000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000016de0000613d000000000141016f000000000113019f0000000100100190000016de0000613d000000000001042d000000000001042f00000634010000410000000000130435000005c40030009c000005c4030080410000004001300210000005fd011001c70000170e00010430000000400100043d00000044021000390000061d03000041000000000032043500000024021000390000001403000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e00010430000000000001042f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f0000000100200190000016fb0000613d000000000101043b000000000001042d00000000010000190000170e0001043000001700002104210000000102000039000000000001042d0000000002000019000000000001042d00001705002104230000000102000039000000000001042d0000000002000019000000000001042d0000170a002104250000000102000039000000000001042d0000000002000019000000000001042d0000170c000004320000170d0001042e0000170e00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000073455b9e00000000000000000000000000000000000000000000000000000000a2beb50f00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b900000000000000000000000000000000000000000000000000000000a2beb51000000000000000000000000000000000000000000000000000000000cc4010580000000000000000000000000000000000000000000000000000000088e70f280000000000000000000000000000000000000000000000000000000088e70f290000000000000000000000000000000000000000000000000000000093d1692f0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000058ff9fe40000000000000000000000000000000000000000000000000000000064721190000000000000000000000000000000000000000000000000000000006472119100000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000058ff9fe5000000000000000000000000000000000000000000000000000000005eac62390000000000000000000000000000000000000000000000000000000022e0772b0000000000000000000000000000000000000000000000000000000022e0772c0000000000000000000000000000000000000000000000000000000052526c8000000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000001200000008000000000000000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f0200000000000000000000000000000000000040000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f303ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff313ce56700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe05452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000099039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffedf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffff000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000002000000000000000000000000000000000000a00000000000000000000000009d78e53230a3050788c30dcf4ee1946bc54701786d738ba468f6458b18591f3b0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000b4fa3fb3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c10000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc800000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff0857121700000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712a0caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df8171000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000005245454e5452414e4359000000000000000000000000000000000000000000005fd8a13200000000000000000000000000000000000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8f5989a7380745c89336ffe0a26acf06222b96f487962c3747400d51e2c6f0f", + "devdoc": { + "kind": "dev", + "methods": { + "claimAllRewards(uint256[])": { + "details": "Claims rewards for all incentives in the list, skipping reward rounding." + }, + "unsubscribeFromIncentive(address,uint256,bool)": { + "params": { + "incentiveIndex": "∈ [0,5]" + } + } + }, + "stateVariables": { + "rewardPerLiquidityLast": { + "details": "rewardPerLiquidityLast[user][incentiveId]Semantic overload: if value is zero user isn't subscribed to the incentive." + }, + "userStakes": { + "details": "userStakes[user][stakedToken]" + } + }, + "title": "Fork of https://github.com/sushiswap/StakingContract", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Permissionless staking contract that allows any number of incentives to be running for any token (erc20). Incentives can be created by anyone, the total reward amount must be sent at creation. Incentives can be updated (change reward rate / duration). Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 91507, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "locked", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 36, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "incentiveCount", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 41, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "incentives", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_struct(Incentive)34_storage)" + }, + { + "astId": 48, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardPerLiquidityLast", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))" + }, + { + "astId": 56, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "userStakes", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_mapping(t_address,t_struct(UserStake)61_storage))" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_address,t_struct(UserStake)61_storage))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => struct StakingContractMainnet.UserStake))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_struct(UserStake)61_storage)" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_uint256,t_uint256)" + }, + "t_mapping(t_address,t_struct(UserStake)61_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct StakingContractMainnet.UserStake)", + "numberOfBytes": "32", + "value": "t_struct(UserStake)61_storage" + }, + "t_mapping(t_uint256,t_struct(Incentive)34_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct StakingContractMainnet.Incentive)", + "numberOfBytes": "32", + "value": "t_struct(Incentive)34_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(Incentive)34_storage": { + "encoding": "inplace", + "label": "struct StakingContractMainnet.Incentive", + "members": [ + { + "astId": 17, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "creator", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 19, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "token", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 21, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardToken", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 23, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "endTime", + "offset": 20, + "slot": "2", + "type": "t_uint32" + }, + { + "astId": 25, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "isRewardRounded", + "offset": 24, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 27, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardPerLiquidity", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 29, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "lastRewardTime", + "offset": 0, + "slot": "4", + "type": "t_uint32" + }, + { + "astId": 31, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardRemaining", + "offset": 4, + "slot": "4", + "type": "t_uint112" + }, + { + "astId": 33, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "liquidityStaked", + "offset": 18, + "slot": "4", + "type": "t_uint112" + } + ], + "numberOfBytes": "160" + }, + "t_struct(UserStake)61_storage": { + "encoding": "inplace", + "label": "struct StakingContractMainnet.UserStake", + "members": [ + { + "astId": 58, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "liquidity", + "offset": 0, + "slot": "0", + "type": "t_uint112" + }, + { + "astId": 60, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "subscribedIncentiveIds", + "offset": 14, + "slot": "0", + "type": "t_uint144" + } + ], + "numberOfBytes": "32" + }, + "t_uint112": { + "encoding": "inplace", + "label": "uint112", + "numberOfBytes": "14" + }, + "t_uint144": { + "encoding": "inplace", + "label": "uint144", + "numberOfBytes": "18" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + } + } + }, + "factoryDeps": [ + "0x00030000000000020010000000000002000000000c01034f00020000000c035500000000010c00190000006001100270000005c40010019d0000008004000039000000400040043f0000000100200190000000c80000c13d000005c403100197000000040030008c00000b630000413d00000000013c034f00000000020c043b000000e002200270000005c60020009c000000d20000213d000005d20020009c000000f70000213d000005d80020009c000003160000213d000005db0020009c0000054d0000613d000005dc0020009c00000b630000c13d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000e02043b000005e200e0009c00000b630000213d0000002302e00039000000000032004b00000b630000813d0000000402e0003900000000022c034f000000000f02043b000005e200f0009c00000b630000213d0010002400e0003d0000000502f002100000001002200029000000000032004b00000b630000213d00000000000f004b000003450000613d000000200d00008a0000000002000019000e0000000e001d000d0000000f001d0000000004e30049000f00000002001d0000000502200210000000100220002900000000022c034f000000000202043b000000430440008a0000061e054001970000061e06200197000000000756013f000000000056004b00000000050000190000061e05002041000000000042004b00000000040000190000061e040040410000061e0070009c000000000504c019000000000005004b00000b630000613d000000100420002900000000024c034f000000000b02043b000005e200b0009c00000b630000213d0000000005b3004900000020044000390000061e065001970000061e07400197000000000867013f000000000067004b00000000060000190000061e06004041000000000054004b00000000050000190000061e050020410000061e0080009c000000000605c019000000000006004b00000b630000c13d00000000064c034f0000000007db0170000000400400043d00000000057400190000006a0000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b000000660000c13d0000001f08b00190000000770000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000000800000c13d00000001060000310000000102000039000000960000013d000005c400b0009c000005c40b0080410000006001b00210000005c40040009c000005c4040080410000004003400210000000000113019f000005c40050009c000005c405008041000000c003500210000000000113019f170c17070000040f0000000d0f0000290000000e0e000029000000200d00008a0000000003000031000000020c000367000000010220018f00000000040100190000006004400270000105c40040019d000005c406400197000000000006004b00000080040000390000006005000039000000c10000613d0000062f0060009c000006170000813d0000001f046000390000000004d4016f0000003f044000390000000004d4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000005e20040009c000006170000213d0000000100700190000006170000c13d000000400040043f00000000046504360000000008d601700000000007840019000000b40000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000000b00000c13d0000001f06600190000000c10000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b000009a20000613d0000000f0200002900000001022000390000000000f2004b000000370000413d000003450000013d0000000001000416000000000001004b00000b630000c13d0000000101000039000000000010041b000000200100003900000100001004430000012000000443000005c5010000410000170d0001042e000005c70020009c000002fb0000213d000005cd0020009c000003470000213d000005d00020009c000005550000613d000005d10020009c00000b630000c13d000000440030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005dd0010009c00000b630000213d0000002402c00370000000000202043b001000000002001d000005dd0020009c00000b630000213d000000000010043f0000000401000039000000200010043f170c16f00000040f0000001002000029000000000020043f000000200010043f170c16f00000040f000000000101041a000005df02100197000000800020043f0000007001100270000000a00010043f0000060e010000410000170d0001042e000005d30020009c000003a30000213d000005d60020009c000005b90000613d000005d70020009c00000b630000c13d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000202043b000005e20020009c00000b630000213d0000002304200039000000000034004b00000b630000813d000000040420003900000000044c034f000000000404043b000800000004001d000005e20040009c00000b630000213d000700240020003d000000080200002900000005022002100000000704200029000000000034004b00000b630000213d000000000300041a000000010030008c000007180000c13d0000000203000039000000000030041b0000003f03200039000005e303300197000005e40030009c000006170000213d0000008003300039000000400030043f0000000803000029000000800030043f0000001f0320018f000000000002004b0000012b0000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b000001270000c13d000000000003004b000000080000006b000007320000613d0000000002000019000a00000002001d0000000502200210000900000002001d0000000701200029000f00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b00000a1a0000813d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000d00000001001d000000000101041a000e00000001001d001000000002001d0000000401200039000c00000001001d000000000101041a000b00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000b06000029000005c4026001970000000e03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000001007000029000e00030070003d000001830000413d000000000521004b000001830000a13d0000000c08000029000000000408041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f000000000018041b0000000f030000290000018c0000013d000005eb0060009c0000000f030000290000000c050000290000018c0000213d000000000042004b0000018c0000813d000005ec02600197000000000121019f000000000015041b0000000201300367000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b00000010020000290000000102200039000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a001000000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000001002000029000005df062001970000000e02000029000000000202041a0000000001120049000006310010009c0000000002010019000000000200601900000000326200a900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed03500197000000000332001900000000026100a9000000000323004b00000000040000390000000104004039000000000343004b000001ea0000c13d000005df0120012a000001f20000013d000005ee0030009c00000b630000213d000005df3060012a000005df1010012a00000000013100a9000005df1010012a0000000001120049000005ef011000d1001000000001001d0000000d01000029000000000201041a000005de00200198000002030000613d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c000002050000c13d0000000103000031000000200030008c00000020040000390000000004034019000002320000013d00000000020000190000026e0000013d000b00000006001d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000c0000000a001d170c17020000040f0000000c0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000002210000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b0000021d0000c13d0000001f074001900000022e0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000010e10000613d0000000b060000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c00000b6b0000213d000000000001004b000000100200002900000001030000390000025e0000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a9000000010330027200000000040500190000024b0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a900000001011002720000000004050019000002560000c13d00000010022000f900000000012300a9000000000002004b000002640000613d00000000022100d9000000000023004b00000b6b0000c13d000000100010006b00000b6b0000413d000000100310006b00000000020000190000026e0000613d000005df023000d100000000033200d9000005df0030009c001000000001001d00000b6b0000c13d000000000006004b000006e70000613d00000000016200d90000000e02000029000000000202041a000e00000012005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000d01000029000000000201041a000000400100043d000000240310003900000010040000290000000000430435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000002a60000c13d0000000001010433000000000010043f00000001030000310000000102000039000002cc0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000002bd0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000002b90000c13d0000001f05500190000002ca0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d00000010020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f000000010020019000000b630000613d000000800100043d0000000a02000029000000000021004b00000a1d0000a13d0000000901000029000000a001100039000000100300002900000000003104350000000102200039000000080020006c0000012f0000413d000007320000013d000005c80020009c000005300000213d000005cb0020009c000005f60000613d000005cc0020009c00000b630000c13d000000440030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005dd0010009c00000b630000213d000000000010043f0000000301000039000000200010043f00100000000c0353170c16f00000040f000000100200035f0000002402200370000000000202043b000000000020043f000000200010043f170c16f00000040f000005510000013d000005d90020009c0000061d0000613d000005da0020009c00000b630000c13d000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000005e20010009c00000b630000213d0000002302100039000000000032004b00000b630000813d000000040210003900000000022c034f000000000402043b000005e20040009c000006170000213d00000005024002100000003f05200039000005e305500197000005e40050009c000006170000213d0000008005500039000000400050043f000000800040043f00000024011000390000000002120019000000000032004b00000b630000213d000000000004004b000003450000613d000000800300003900000000041c034f000000000404043b000000200330003900000000004304350000002001100039000000000021004b0000033a0000413d000000800100043d000900000001001d000000000001004b000007420000c13d00000000010000190000170d0001042e000005ce0020009c0000065d0000613d000005cf0020009c00000b630000c13d000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000300000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000700000001001d000005df0010009c00000b630000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000600000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b00000003010000290000000702000029170c16770000040f0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d0000000702300029000005df0020009c00000b6b0000213d000005f401100197000000000112019f0000000802000029000000000012041b000005f50010009c000009ed0000813d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d0200003900000003030000390000060204000041000000030500002900000b5f0000013d000005d40020009c0000068e0000613d000005d50020009c00000b630000c13d000000840030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000005df0010009c00000b630000213d0000004402c00370000000000202043b000005e20020009c00000b630000213d0000002305200039000000000035004b00000b630000813d000000040520003900000000055c034f000000000605043b000005e20060009c000006170000213d00000005056002100000003f07500039000005e307700197000005e40070009c000006170000213d0000008007700039000000400070043f000000800060043f00000024022000390000000005250019000000000035004b00000b630000213d000000000006004b000003d60000613d00000000032c034f000000000303043b000000200440003900000000003404350000002002200039000000000052004b000003cf0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b00000b630000c13d000000000200041a000000010020008c000009e60000c13d0000000202000039000000000020041b000005df021001970000001001000029000700000002001d170c16770000040f0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005dd02200197000400000002001d000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d0000000702300029000005df0020009c00000b6b0000213d000005f403100197000000000232019f0000000803000029000000000023041b000005f50020009c00000eb80000813d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000006020400004100000004050000290000000006000411170c16fd0000040f000000010020019000000b630000613d0000000102000039000000000020041b000000800100043d000900000001001d000000000001004b000003450000613d0000000004000019000000800100043d000000000041004b000080100300003900000a1d0000a13d000b00000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b001000000004001d000000010140008a000000000202041a000000000021004b00000a1a0000813d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000000002030019170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000a00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000005df00100198000005b60000613d0000000f020000290000000201200039000000000101041a000c00000001001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d07000029000005c4037001970000000c02000029000000a002200270000005c404200197000000000501043b000000000045004b00000000020400190000000002054019000005e80070009c0000000f010000290000000301100039000004c10000413d000000000632004b000004c10000a13d0000000e09000029000000000509041a0000009007500272000006e70000613d00000000033400490000002004500270000005df0840019700000000066800a900000000033600d9000005df063000d100000000067600d9000000000701041a0000000006670019000000000061041b00000000033400490000002003300210000005e903300197000005ea04500197000000000334019f000000000223019f000000000029041b000004c90000013d000005eb0070009c000004c90000213d000000000053004b000004c90000813d000005ec03700197000000000232019f0000000e03000029000000000023041b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000a02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb0220019800000eb50000613d000000000301041a000006110030009c0000000e050000290000145b0000213d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f000000000015041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000010050000290000000006000411170c16fd0000040f000000010020019000000b630000613d0000000102000039000000000020041b0000000b040000290000000104400039000000090040006c0000042b0000413d000003450000013d000005c90020009c000006ed0000613d000005ca0020009c00000b630000c13d000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000000000200041a000000010020008c000007180000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b0000068a0000813d000000000010043f000000200020043f170c16f00000040f170c14940000040f0000000101000039000000000010041b00000000010000190000170d0001042e0000000001000416000000000001004b00000b630000c13d0000000101000039000000000101041a000000800010043f000005e1010000410000170d0001042e000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000301043b000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b0000068a0000813d001000000003001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000e00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000005df0010019800000a230000c13d000000400100043d0000062a0200004100000b080000013d000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000f00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000e00000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000d00000001001d000000000101041a001000700010027a00000b060000613d000005f60010009c000009c30000813d000000010200003900000ad50000013d000000240030008c00000b630000413d0000000002000416000000000002004b00000b630000c13d0000000402c00370000000000202043b000005e20020009c00000b630000213d0000002304200039000000000034004b00000b630000813d000000040420003900000000044c034f000000000404043b000800000004001d000005e20040009c00000b630000213d000700240020003d000000080200002900000005022002100000000704200029000000000034004b00000b630000213d000000000300041a000000010030008c000007180000c13d0000000203000039000000000030041b0000003f03200039000005e303300197000005e40030009c000007220000a13d0000062401000041000000000010043f0000004101000039000000040010043f00000625010000410000170e00010430000000640030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000300000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000700000001001d000005df0010009c00000b630000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000600000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000800000001001d000000000101041a000005df03100197000c00000003001d000000070230006c000009ca0000813d000000400100043d0000062e0200004100000b080000013d000000c40030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b001000000001001d000005dd0010009c00000b630000213d0000002401c00370000000000101043b000f00000001001d000005dd0010009c00000b630000213d0000004401c00370000000000101043b000e00000001001d000005df0010009c00000b630000213d0000006401c00370000000000101043b000d00000001001d000005c40010009c00000b630000213d0000008401c00370000000000101043b000c00000001001d000005c40010009c00000b630000213d000000a401c00370000000000201043b000000000002004b0000000001000039000000010100c039000b00000002001d000000000012004b00000b630000c13d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000000e0000006b000009f70000c13d0000060f01000041000000800010043f00000610010000410000170e00010430000000840030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000002401c00370000000000301043b0000061500300198000006160100004100000000010060190000061702300197000000000121019f0000000402c00370000000000202043b001000000002001d000f00000003001d000000000013004b00000b630000c13d0000004401c00370000000000101043b000e00000001001d000005c40010009c00000b630000213d0000006401c00370000000000101043b000d00000001001d000005c40010009c00000b630000213d000000000100041a000000010010008c000007180000c13d0000000201000039000000000010041b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000301043b000000000103041a000005dd011001970000000002000411000000000012004b000008510000c13d0000000401300039000800000003001d0000000202300039000900000002001d000000000202041a000a00000002001d000c00000001001d000000000101041a000b00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000b05000029000005c4025001970000000a03000029000000a003300270000005c404300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000005e80050009c00000a130000413d000000000521004b00000a130000a13d0000000c03000029000000000303041a000000900630027200000a5a0000c13d0000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e00010430000000240030008c00000b630000413d0000000001000416000000000001004b00000b630000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f170c16f00000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000005dd01100197000000800010043f000005dd01500197000000a00010043f000005dd01400197000000c00010043f000000a001400270000005c401100197000000e00010043f000005de004001980000000001000039000000010100c039000001000010043f000001200030043f000005c401200197000001400010043f0000002001200270000005df01100197000001600010043f0000009001200270000001800010043f000005e0010000410000170d0001042e0000060001000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000062601000041000000c40010043f0000062b010000410000170e000104300000008003300039000000400030043f0000000803000029000000800030043f0000001f0320018f000000000002004b0000072f0000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000072b0000c13d000000000003004b000000080000006b000008540000c13d0000000101000039000000000010041b000000400100043d001000000001001d0000008002000039170c14850000040f00000010020000290000000001210049000005c40010009c000005c4010080410000006001100210000005c40020009c000005c4020080410000004002200210000000000121019f0000170d0001042e000000010200003900008010030000390000000004000019000000800100043d000000000041004b00000a1d0000a13d000000000100041a000000010010008c000009e60000c13d000b00000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b001000000004001d000000010140008a000000000202041a000000000021004b00000a1a0000813d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000000002030019170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b0000084e0000c13d0000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000f00000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000a00000002001d000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d0000000f02000029000000000101043b000000000101041a000005df00100198000005b60000613d0000000201200039000000000101041a000c00000001001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d07000029000005c4037001970000000c02000029000000a002200270000005c404200197000000000501043b000000000045004b00000000090400190000000009054019000005e80070009c0000000f010000290000000301100039000007de0000413d000000000639004b000007de0000a13d0000000e0a00002900000000050a041a0000009007500272000006e70000613d00000000033400490000002004500270000005df0840019700000000066800a900000000033600d9000005df063000d100000000067600d9000000000701041a0000000006670019000000000061041b00000000033400490000002003300210000005e903300197000005ea04500197000000000334019f000000000293019f00000000002a041b0000801002000039000007e70000013d000005eb0070009c0000801002000039000007e70000213d000000000053004b000007e70000813d000005ec03700197000000000339019f0000000e04000029000000000034041b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c7170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000a02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb0220019800000eb50000613d000000000301041a000005fa0030009c0000000e050000290000145b0000813d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f000000000015041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000010050000290000000006000411170c16fd0000040f0000000100200190000080100300003900000b630000613d0000000102000039000000000020041b0000000b040000290000000104400039000000090040006c000007450000413d000003450000013d000000400100043d000006270200004100000b080000013d000000400100043d000006180200004100000b080000013d0000000002000019000b00000002001d0000000502200210000900000002001d0000000701200029001000000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b00000a1a0000813d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000a00000001001d000000000101041a000c00000001001d000f00000002001d0000000401200039000e00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000c03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000f070000290000000308700039000c00000008001d000008a90000413d000000000521004b000008a90000a13d0000000e09000029000000000409041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d9000000000608041a0000000005560019000000000058041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f000000000019041b0000001003000029000008b20000013d000005eb0060009c00000010030000290000000e05000029000008b20000213d000000000042004b000008b20000813d000005ec02600197000000000121019f000000000015041b0000000201300367000000000101043b001000000001001d0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f020000290000000102200039000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000f01000029000005df011001970000000c03000029000000000703041a0000000002270049000006310020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed04600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000e00000007001d000009110000c13d000005df0230012a000009190000013d000005ee0040009c00000b630000213d000005df4010012a000005df2020012a00000000024200a9000005df2020012a0000000002230049000005ef022000d1000f00000002001d000000000001004b000006e70000613d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000a01000029000000000201041a000000400100043d00000024031000390000000f040000290000000000430435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c0000094d0000c13d0000000001010433000000000010043f00000001030000310000000102000039000009730000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000009640000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000009600000c13d0000001f05500190000009710000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d000000400100043d0000000f020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f30400004100000010050000290000000006000411170c16fd0000040f000000010020019000000b630000613d000000800100043d0000000b02000029000000000021004b00000a1d0000a13d0000000901000029000000a0011000390000000f0300002900000000003104350000000102200039000000080020006c000008550000413d000007320000013d000000400100043d000006300200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000009b60000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000009af0000413d0000001f042000390000000004d4016f000000000223001900000000000204350000004402400039000005c40020009c000005c4020080410000006002200210000005c40010009c000005c4010080410000004001100210000000000112019f0000170e00010430000005f70010009c000000020200003900000ad50000413d000005f80010009c00000acf0000813d000000030200003900000ad50000013d000005f50020009c00000b6b0000813d000005f401100197000000000112019f0000000802000029000000000012041b000005f50010009c00000b0e0000813d000000400100043d000000240210003900000007030000290000000000320435000005f002000041000000000021043500000004021000390000000003000411000000000032043500000000020004140000000303000029000005dd03300197001000000003001d000000040030008c00000b180000c13d00000001020000390000000001010433000000000010043f000000010300003100000b400000013d000000400100043d00000044021000390000062603000041000000000032043500000024021000390000000a03000039000011b30000013d000500010000003d000005f60010009c00000bbd0000413d000005f70010009c000500020000003d00000bbd0000413d000005f80010009c00000bb60000813d000000030100003900000bbc0000013d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b000005c4021001970000000d0010006b0000000d02008029000d00000002001d0000000c0020006c00000acc0000813d0000000102000039000000000102041a0000000101100039000000000012041b000a00000001001d000006030010009c00000dd20000413d000000400100043d0000060d0200004100000b080000013d000005eb0060009c00000a6e0000213d000000000032004b00000a6e0000813d000005ec02600197000000000121019f00000a6c0000013d000000400100043d0000060f0200004100000b080000013d0000062401000041000000000010043f0000003201000039000000040010043f00000625010000410000170e000104300000000f020000290000000201200039000000000101041a000b00000001001d0000000401200039000c00000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d05000029000005c4025001970000000b03000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80050009c00000e6a0000413d000000000521004b00000e6a0000a13d0000000c03000029000000000303041a0000009006300272000006e70000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d90000000f060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f00000e720000013d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000008060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f0000000c02000029000000000012041b0000000e01000029000e05c40010019c00000a850000613d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b000005c4021001970000000e0010006b0000000e020080290000000c03000029000000000103041a000005ec01100197000000000121019f000000000013041b0000000d0000006b00000a8a0000c13d0000000901000029000000000101041a00000a9f0000013d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d000000000101043b0000000d0010006b0000000d01008029000000a00110021000000608011001970000000903000029000000000203041a0000061902200197000000000121019f000000000013041b000000a002100270000005c4032001970000000c02000029000000000202041a000005c404200197000000000034004b00000acc0000813d0000000f03000029000006050030009c00000b650000213d0000000f0000006b00000b650000613d0000000f03000029000005df043001970000002003200270000005df033001970000000003430019000005df0030009c00000b6b0000213d0000061b022001970000002003300210000005e903300197000000000223019f0000000c03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000061c0200004100000000002304350000000402300039000000000400041100000000004204350000000004000414000005dd02100197000000040020008c000010ff0000c13d00000001020000390000000001030433000000000010043f0000000103000031000011260000013d000000400100043d0000061a0200004100000b080000013d000005f90010009c000000040200003900000ad50000413d000005fa0010009c000000060200003900000005020040390000000f0020006b00000b060000813d0000000f01000029000c0018001000cd000000000001004b00000adf0000613d0000000c020000290000000f012000fa000000180010008c00000b6b0000c13d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f0000000c04000029000000100340024f000005fb03300197000000ff0040008c0000000003002019001000000003001d000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b00000b710000c13d000000400100043d000006220200004100000b080000013d000000400100043d00000623020000410000000000210435000005c40010009c000005c4010080410000004001100210000005fd011001c70000170e00010430000500010000003d000005f60010009c00000ec90000413d000005f70010009c000500020000003d00000ec90000413d000005f80010009c00000ec20000813d000000030100003900000ec80000013d000005c40010009c000005c4010080410000004001100210000005c40020009c000005c402008041000000c002200210000000000112019f000005f1011001c70000001002000029170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000b310000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000b2d0000c13d000000000005004b00000b3e0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d000000400100043d00000007020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d0200003900000003030000390000062d0400004100000010050000290000000006000411170c16fd0000040f0000000100200190000005490000c13d00000000010000190000170e000104300000000f030000290000061e0030009c000011910000413d0000000f03000029000006160030009c0000113c0000c13d0000062401000041000000000010043f0000001101000039000000040010043f00000625010000410000170e000104300000001001000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000000000101041a000a00000001001d000900000002001d0000000401200039000b00000001001d000000000101041a000c00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000c05000029000005c4025001970000000a03000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80050009c000011be0000413d000000000521004b000011be0000a13d0000000b03000029000000000303041a0000009006300272000006e70000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000009060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f000011c60000013d000005f90010009c000500040000003d00000bbd0000413d000005fa0010009c00000006010000390000000501004039000500000001001d0000000c01000029000005df1010012a000400000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d00000c0f0000413d000000000521004b00000c0f0000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f00000c150000013d000005eb0060009c00000c170000213d000000000042004b00000c170000813d000005ec02600197000000000121019f0000001002000029000000000012041b0000000001000411000000000010043f0000000301000039000000200010043f000000060000006b00000c520000613d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b00000c8d0000c13d000005df0620012a00000c940000013d0000000801000029000000000101041a000d00000001001d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b00000d920000c13d000005df0330012a000005df023000d1000000000003004b00000d9c0000c13d00000d9f0000013d000005ee0030009c00000b630000213d000005df1010012a00000004011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de0020019800000ca50000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c00000ca70000c13d0000000103000031000000200030008c0000002004000039000000000403401900000cd20000013d000000000200001900000d0f0000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000cc20000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000cbe0000c13d0000001f0740019000000ccf0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000012200000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b0000000002060019000000010300003900000cff0000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a90000000103300272000000000405001900000cec0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a90000000101100272000000000405001900000cf70000c13d00000000022600d900000000012300a9000000000002004b00000d050000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b000000000200001900000d0f0000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c00000d480000c13d0000000001010433000000000010043f0000000103000031000000010200003900000d6f0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c00000020050000390000000005034019000000200450019000000d5f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d5b0000c13d0000001f0550019000000d6c0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f000000010020019000000dc20000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000004022000b9000005df2020012a0000000002230049000005ef032000d1000005df023000d1000000000003004b00000d9f0000613d00000000033200d9000005df0030009c00000b6b0000c13d0000000d03000029000005df03300198000006e70000613d00000000023200d9000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a00000090021002700000000702200029000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000050020006c00000bc10000413d000003920000013d0000000f010000290000000e02000029170c16770000040f000000400100043d000900000001001d000006040010009c000006170000213d00000009030000290000012001300039000000400010043f000000e0023000390000000e01000029000700000002001d0000000000120435000000c0023000390000000d01000029000800000002001d0000000000120435000000a0023000390000060501000041000600000002001d000000000012043500000080023000390000000b01000029000500000002001d000000000012043500000060023000390000000c01000029000300000002001d000000000012043500000040023000390000000f01000029000200000002001d000000000012043500000020023000390000001001000029000100000002001d0000000000120435000000000100041100000000001304350000010001300039000400000001001d00000000000104350000000a01000029000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d00000009020000290000000002020433000005dd02200197000000000101043b000000000301041a0000060603300197000000000223019f000000000021041b00000001020000290000000002020433000005dd022001970000000103100039000000000403041a0000060604400197000000000224019f000000000023041b00000002020000290000000002020433000005dd022001970000000203100039000000000403041a0000060704400197000000000224019f00000003040000290000000004040433000000a0044002100000060804400197000000000242019f00000005040000290000000004040433000000000004004b00000609040000410000000004006019000000000242019f000000000023041b000000060200002900000000020204330000000303100039000000000023041b000000040200002900000000020204330000009002200210000000070300002900000000030304330000002003300210000005e903300197000000000232019f00000008030000290000000003030433000005c403300197000000000232019f0000000401100039000000000021041b000000400100043d00000080021000390000000b03000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000000d03000029000000000032043500000020021000390000000e0300002900000000003204350000000a020000290000000000210435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f0000060a011001c70000800d0200003900000004030000390000060b0400004100000010050000290000000f060000290000000007000411170c16fd0000040f000000010020019000000b630000613d0000000101000039000000000010041b000000400100043d0000000a020000290000000000210435000005c40010009c000005c40100804100000040011002100000060c011001c70000170d0001042e0000000d04000029000005eb0040009c00000e740000213d000000000032004b00000e740000813d0000000d02000029000005ec02200197000000000121019f0000000c02000029000000000012041b0000000f010000290000000301100039000000000101041a000f00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000202041a000005dd02200197000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000005fb02200198000014580000c13d000000400100043d000006290200004100000b080000013d000600010000003d000005f60020009c000012330000413d000005f70020009c000600020000003d000012330000413d000005f80020009c0000122c0000813d0000000301000039000012320000013d000005f90010009c000500040000003d00000ec90000413d000005fa0010009c00000006010000390000000501004039000500000001001d0000000c01000029000005df1010012a000400000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d00000f1b0000413d000000000521004b00000f1b0000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f00000f210000013d000005eb0060009c00000f230000213d000000000042004b00000f230000813d000005ec02600197000000000121019f0000001002000029000000000012041b000000060000006b00000f760000613d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b00000f5e0000c13d000005df0620012a00000f650000013d000005ee0030009c00000b630000213d000005df1010012a00000004011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de0020019800000fb70000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c00000fb90000c13d0000000103000031000000200030008c0000002004000039000000000403401900000fe40000013d0000000801000029000000000101041a000005df0110019800000f250000613d000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b000010a40000c13d000005df0230012a000005df032000d1000000000002004b000010ae0000c13d000010b10000013d0000000002000019000010210000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000fd40000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000fd00000c13d0000001f0740019000000fe10000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00000001002001900000144c0000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b00000000020600190000000103000039000010110000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a90000000103300272000000000405001900000ffe0000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a900000001011002720000000004050019000010090000c13d00000000022600d900000000012300a9000000000002004b000010170000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b0000000002000019000010210000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c0000105a0000c13d0000000001010433000000000010043f00000001030000310000000102000039000010810000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000010710000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000106d0000c13d0000001f055001900000107e0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f0000000100200190000010d10000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000004022000b9000005df2020012a0000000002230049000005ef022000d1000005df032000d1000000000002004b000010b10000613d00000000022300d9000005df0020009c00000b6b0000c13d0000000d023000fa000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a0000009002100270000000070220006a000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000050020006c00000ecd0000413d000009d20000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e80000c13d000000000005004b000010f90000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005c40020009c000005c4020080410000004002200210000000000112019f0000170e00010430000005c40030009c000005c4030080410000004001300210000005c40040009c000005c404008041000000c003400210000000000113019f00000601011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011170000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000011130000c13d000000000005004b000011240000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011350000613d000000000141016f000000000113019f0000000100100190000011910000c13d000000400100043d00000044021000390000061d03000041000000000032043500000024021000390000001403000039000011b30000013d0000000f030000290000000003300089000005df043001970000002003200270000005df05300197000000000054004b000000000405801900000000034300490000002003300210000005e9033001970000061b02200197000000000223019f0000000c03000029000000000023041b000000400300043d00000024023000390000000000420435000005f00200004100000000002304350000000402300039000000000400041100000000004204350000000004000414000005dd02100197000000040020008c0000115b0000c13d00000001020000390000000001030433000000000010043f0000000103000031000011820000013d000005c40030009c000005c4030080410000004001300210000005c40040009c000005c404008041000000c003400210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011730000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000116f0000c13d000000000005004b000011800000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011ad0000613d000000000141016f000000000113019f0000000100100190000011ad0000613d0000000901000029000000000101041a0000000c02000029000000000202041a000005c402200197000000400300043d00000020043000390000000000240435000000a001100270000005c401100197000000400230003900000000001204350000000f010000290000000000130435000005c40030009c000005c40300804100000040013002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f0000061f011001c70000800d0200003900000002030000390000062004000041000000100500002900000b600000013d000000400100043d0000004402100039000005ff03000041000000000032043500000024021000390000000f03000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e000104300000000c04000029000005eb0040009c000011c80000213d000000000032004b000011c80000813d0000000c02000029000005ec02200197000000000121019f0000000b02000029000000000012041b0000000e0000006b000011d00000c13d0000000d01000029000000000101041a000005df0310019700000009010000290000001002000029170c14dc0000040f0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000001002000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000001041b0000000d01000029000000000101041a000005df021001970000000b01000029000000000101041a00000090031002700000000002230049000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000000b02000029000000000012041b0000000d01000029000000000101041a00000070021002700000000f03000029000000050030008c000012120000213d0000061e03000041000000010400008a0000061e0030009c000000000400c0190000000f03000029000000060330008900000018033000ca000001000530008900000000045401cf000005ea0530027f000000000445019f000005ea04006041000005eb0330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f000005df011001970000007002200210000000000112019f0000000d02000029000000000012041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006210400004100000b5e0000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000012270000c13d000010ec0000013d000005f90020009c000600040000003d000012330000413d000005fa0010009c00000006010000390000000501004039000600000001001d0000000c01000029000005df1010012a000500000001001d0000000002000019000900000002001d00000018012000c90000000802000029000000000202041a0000007002200270000000000112022f000005fb01100197000f00000001001d000000000010043f0000000201000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000201043b0000000201200039000b00000001001d000000000101041a000a00000001001d000e00000002001d0000000401200039001000000001001d000000000101041a000d00000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014480000613d0000000d06000029000005c4026001970000000a03000029000000a003300270000005c403300197000000000401043b000000000034004b00000000010300190000000001044019000005e80060009c0000000e05000029000e00030050003d000012850000413d000000000521004b000012850000a13d0000001004000029000000000404041a0000009006400272000006e70000613d00000000022300490000002003400270000005df0730019700000000055700a900000000022500d9000005df052000d100000000056500d90000000e07000029000000000607041a0000000005560019000000000057041b00000000022300490000002002200210000005e902200197000005ea03400197000000000223019f000000000112019f0000128b0000013d000005eb0060009c0000128d0000213d000000000042004b0000128d0000813d000005ec02600197000000000121019f0000001002000029000000000012041b00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b000012cb0000613d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000101041a000000000001004b000014490000613d0000000e02000029000000000202041a0000000001120049000006310010009c000000000201001900000000020060190000000c322000b900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed0350019700000000033200190000000c021000b9000000000323004b00000000040000390000000104004039000000000343004b000013030000c13d000005df0620012a0000130a0000013d0000000801000029000000000101041a000d00000001001d0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b000000000201041a000000000002004b000014490000613d0000000e01000029000000000101041a0000000002210049000006310020009c000000000302001900000000030060190000000c433000b900000080053002700000008004400210000000000454019f000005ed05300197000005ed4640012a0000008004400210000000000454019f000005ed056000d1000000000045004b000000010660208a000005ed0460019700000000044300190000000c032000b9000000000434004b00000000050000390000000105004039000000000454004b000014080000c13d000005df0330012a0000140f0000013d000005ee0030009c00000b630000213d000005df1010012a00000005011000b9000005df1010012a0000000001120049000005ef061000d10000000b01000029000000000201041a000005de002001980000131b0000613d000d00000006001d000000400a00043d000005fc0100004100000000001a04350000000001000414000005dd02200197000000040020008c0000131d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013480000013d0000000002000019000013850000013d000005c400a0009c000005c40300004100000000030a40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c7000a0000000a001d170c17020000040f0000000a0a00002900000000030100190000006003300270000005c403300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000013380000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000013340000c13d0000001f07400190000013450000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0000000100200190000014790000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000005e20010009c000006170000213d0000000100200190000006170000c13d000000400010043f000000200030008c00000b630000413d00000000010a0433000000ff0010008c00000b630000213d0000004d0010008c0000000d0600002900000b6b0000213d000000000001004b00000000020600190000000103000039000013750000613d000000010200003900000000030100190000000a04000039000000010030019000000000054400a9000000010400603900000000022400a900000001033002720000000004050019000013620000c13d000000000002004b000006e70000613d00000001030000390000000a04000039000000010010019000000000054400a9000000010400603900000000033400a9000000010110027200000000040500190000136d0000c13d00000000022600d900000000012300a9000000000002004b0000137b0000613d00000000022100d9000000000023004b00000b6b0000c13d000000000016004b00000b6b0000413d000000000316004b0000000002000019000013850000613d000005df023000d100000000033200d9000005df0030009c000000000601001900000b6b0000c13d0000000c0000006b000006e70000613d0000000c012000fa0000000e02000029000000000202041a000e00000012005300000b6b0000413d000d00000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000000b01000029000000000201041a000000400100043d00000024031000390000000d060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000013be0000c13d0000000001010433000000000010043f00000001030000310000000102000039000013e50000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200500003900000000050340190000002004500190000013d50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000013d10000c13d0000001f05500190000013e20000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000d06000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000011ae0000613d000000000254016f000000000223019f0000000100200190000011ae0000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f3040000410000000f050000290000000006000411170c16fd0000040f0000000100200190000014380000c13d00000b630000013d000005ee0040009c00000b630000213d000005df2020012a00000005022000b9000005df2020012a0000000002230049000005ef032000d1000005df023000d1000000000003004b000014150000613d00000000033200d9000005df0030009c00000b6b0000c13d0000000d03000029000005df03300198000006e70000613d00000000023200d9000e00000021005300000b6b0000413d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000f02000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f000000010020019000000b630000613d000000000101043b0000000e02000029000000000021041b0000001001000029000000000101041a00000090021002700000000702200029000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000001002000029000000000012041b00000009020000290000000102200039000000060020006c000012370000413d000004100000013d000000000001042f000000400100043d0000062c0200004100000b080000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000014530000c13d000010ec0000013d000000000301041a000006110030009c0000145e0000a13d000000400100043d000006280200004100000b080000013d00000058043002700000061204400197000000000224019f0000007002200210000005df03300197000000000232019f000000000021041b0000000c01000029000000000101041a00000090021002700000000002320019000005df0020009c00000b6b0000213d000005eb011001970000009002200210000000000112019f0000000c02000029000000000012041b0000000001000414000005c40010009c000005c401008041000000c00110021000000613011001c70000800d020000390000000303000039000006140400004100000b5e0000013d0000001f0530018f000005fe06300198000000400200043d0000000004620019000010ec0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000014800000c13d000010ec0000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b000014930000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b0000148d0000413d000000000001042d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d000005e60100004100000000001004430000000001000414000005c40010009c000005c401008041000000c001100210000005e7011001c70000800b02000039170c17020000040f0000000100200190000014d50000613d0000000306000029000005c4026001970000000203000029000000a003300270000005c404300197000000000301043b000000000043004b00000000010400190000000001034019000005e80060009c000014cc0000413d000000000521004b000014cc0000a13d0000000408000029000000000308041a0000009006300272000014d60000613d00000000022400490000002004300270000005df0740019700000000055700a900000000022500d9000005df052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b00000000022400490000002002200210000005e902200197000005ea03300197000000000223019f000000000112019f000014d30000013d000005eb0060009c0000000408000029000014d40000213d000000000032004b000014d40000813d000005ec02600197000000000121019f000000000018041b000000000001042d000000000001042f0000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e000104300006000000000002000400000003001d000600000002001d000500000001001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000602000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b000000000101041a000000000001004b0000163b0000613d00000005090000290000000307900039000000000207041a0000000001120049000006310010009c000000000201001900000000020060190000000403000029000005df0830019700000000328200a900000080042002700000008003300210000000000343019f000005ed04200197000005ed3530012a0000008003300210000000000343019f000005ed045000d1000000000034004b000000010550208a000005ed03500197000000000332001900000000028100a9000000000323004b00000000040000390000000104004039000000000343004b0000151c0000c13d000005df0620012a000015250000013d000005ee0030009c0000162d0000213d000005df3080012a000005df1010012a00000000013100a9000005df1010012a0000000001120049000005ef061000d100000005090000290000000201900039000000000201041a000005de00200198000400000001001d000015370000613d000500000006001d000000400b00043d000005fc0100004100000000001b04350000000001000414000005dd02200197000000040020008c000015390000c13d0000000103000031000000200030008c00000020040000390000000004034019000015690000013d0000000002000019000015aa0000013d000100000008001d000200000007001d000005c400b0009c000005c40300004100000000030b40190000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f000005fd011001c700030000000b001d170c17020000040f000000030b00002900000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000015570000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000015530000c13d000000000006004b000015640000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0000000100200190000016590000613d000000020700002900000001080000290000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000005e20010009c000016530000213d0000000100200190000016530000c13d000000400010043f000000200030008c0000162d0000413d00000000010b0433000000ff0010008c0000162d0000213d0000004d0010008c00000005060000290000162f0000213d000000000001004b000015980000613d0000000a0400003900000001020000390000000003010019000000010030019000000000054400a9000000010400603900000000022400a900000001033002720000000004050019000015810000c13d000000000002004b000016350000613d0000000a040000390000000103000039000000010010019000000000054400a9000000010400603900000000033400a9000000010110027200000000040500190000158c0000c13d00000000022600d900000000012300a9000000000002004b0000159d0000c13d000015a00000013d0000000103000039000000000206001900000000012300a9000000000002004b000015a00000613d00000000022100d9000000000023004b0000162f0000c13d000000000016004b0000162f0000413d000000000316004b0000000002000019000015aa0000613d000005df023000d100000000033200d9000005df0030009c00000000060100190000162f0000c13d000000000008004b000016350000613d00000000018200d9000000000207041a00030000001200530000162f0000413d000500000006001d0000000001000411000000000010043f0000000301000039000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000602000029000000000020043f000000200010043f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f00000001002001900000162d0000613d000000000101043b0000000302000029000000000021041b0000000401000029000000000201041a000000400100043d000000240310003900000005060000290000000000630435000005f00300004100000000003104350000000403100039000000000400041100000000004304350000000003000414000005dd02200197000000040020008c000015e20000c13d00000001020000390000000001010433000000000010043f00000001030000310000160a0000013d000005c40010009c000005c4010080410000004001100210000005c40030009c000005c403008041000000c003300210000000000113019f000005f1011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000015fa0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000015f60000c13d000000000005004b000016070000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d0000000506000029000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d0000000100200190000016430000613d000000000254016f000000000223019f0000000100200190000016430000613d0000000000610435000005c40010009c000005c40100804100000040011002100000000002000414000005c40020009c000005c402008041000000c002200210000000000112019f000005f2011001c70000800d020000390000000303000039000005f30400004100000006050000290000000006000411170c16fd0000040f00000001002001900000162d0000613d000000000001042d00000000010000190000170e000104300000062401000041000000000010043f0000001101000039000000040010043f00000625010000410000170e000104300000062401000041000000000010043f0000001201000039000000040010043f00000625010000410000170e00010430000000400100043d0000062c020000410000000000210435000005c40010009c000005c4010080410000004001100210000005fd011001c70000170e000104300000004402100039000005ff03000041000000000032043500000024021000390000000f03000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e000104300000062401000041000000000010043f0000004101000039000000040010043f00000625010000410000170e000104300000001f0530018f000005fe06300198000000400200043d0000000004620019000016640000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016600000c13d000000000005004b000016710000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005c40020009c000005c4020080410000004002200210000000000121019f0000170e000104300002000000000002000100000002001d00000632020000410000000000200443000200000001001d00000004001004430000000001000414000005c40010009c000005c401008041000000c00110021000000633011001c70000800202000039170c17020000040f0000000100200190000016d60000613d000000400300043d000000000101043b000000000001004b000016d70000613d0000004401300039000000010200002900000000002104350000002401300039000000000200041000000000002104350000061c01000041000000000013043500000004013000390000000002000411000000000021043500000000010004140000000202000029000005dd02200197000000040020008c0000169f0000c13d00000001020000390000000001030433000000000010043f0000000103000031000016c60000013d000005c40030009c000005c4030080410000004003300210000005c40010009c000005c401008041000000c001100210000000000131019f00000601011001c7170c16fd0000040f00000000030100190000006003300270000005c403300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000016b70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000016b30000c13d000000000005004b000016c40000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000016de0000613d000000000141016f000000000113019f0000000100100190000016de0000613d000000000001042d000000000001042f00000634010000410000000000130435000005c40030009c000005c4030080410000004001300210000005fd011001c70000170e00010430000000400100043d00000044021000390000061d03000041000000000032043500000024021000390000001403000039000000000032043500000600020000410000000000210435000000040210003900000020030000390000000000320435000005c40010009c000005c401008041000000400110021000000601011001c70000170e00010430000000000001042f0000000001000414000005c40010009c000005c401008041000000c001100210000005e5011001c70000801002000039170c17020000040f0000000100200190000016fb0000613d000000000101043b000000000001042d00000000010000190000170e0001043000001700002104210000000102000039000000000001042d0000000002000019000000000001042d00001705002104230000000102000039000000000001042d0000000002000019000000000001042d0000170a002104250000000102000039000000000001042d0000000002000019000000000001042d0000170c000004320000170d0001042e0000170e00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000073455b9e00000000000000000000000000000000000000000000000000000000a2beb50f00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b900000000000000000000000000000000000000000000000000000000a2beb51000000000000000000000000000000000000000000000000000000000cc4010580000000000000000000000000000000000000000000000000000000088e70f280000000000000000000000000000000000000000000000000000000088e70f290000000000000000000000000000000000000000000000000000000093d1692f0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000058ff9fe40000000000000000000000000000000000000000000000000000000064721190000000000000000000000000000000000000000000000000000000006472119100000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000058ff9fe5000000000000000000000000000000000000000000000000000000005eac62390000000000000000000000000000000000000000000000000000000022e0772b0000000000000000000000000000000000000000000000000000000022e0772c0000000000000000000000000000000000000000000000000000000052526c8000000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000001200000008000000000000000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f0200000000000000000000000000000000000040000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f303ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff313ce56700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe05452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000099039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffedf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffff000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000002000000000000000000000000000000000000a00000000000000000000000009d78e53230a3050788c30dcf4ee1946bc54701786d738ba468f6458b18591f3b0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000b4fa3fb3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c10000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc800000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff0857121700000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712a0caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df8171000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000005245454e5452414e4359000000000000000000000000000000000000000000005fd8a13200000000000000000000000000000000000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8f5989a7380745c89336ffe0a26acf06222b96f487962c3747400d51e2c6f0f" + ] +} \ No newline at end of file diff --git a/deployments/treasureMainnet/UniswapV2Factory.json b/deployments/treasureMainnet/UniswapV2Factory.json new file mode 100644 index 0000000..75739cc --- /dev/null +++ b/deployments/treasureMainnet/UniswapV2Factory.json @@ -0,0 +1,2107 @@ +{ + "address": "0x01e0ed991fF21f4366eEDd04A968029Bd6F8C61c", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_defaultProtocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_defaultLpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_protocolFeeBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "fees", + "type": "tuple" + } + ], + "name": "DefaultFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "LpFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "PairCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "ProtocolFeeBeneficiarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "ProtocolFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + } + ], + "name": "RoyaltiesFeesSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "allPairs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairs", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairsLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + } + ], + "name": "createPair", + "outputs": [ + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "defaultFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFees", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFeesAndRecipients", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "protocolBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getPair", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getTotalFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "pairFees", + "outputs": [ + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "protocolFeeOverride", + "type": "bool" + }, + { + "internalType": "bool", + "name": "lpFeeOverride", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeBeneficiary", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "_fees", + "type": "tuple" + } + ], + "name": "setDefaultFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setLpFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_protocolFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setProtocolFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + } + ], + "name": "setProtocolFeeBeneficiary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_royaltiesFee", + "type": "uint256" + } + ], + "name": "setRoyaltiesFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x39C6bF2F2360E993a5eD8E1A30edC01001af64f3", + "contractAddress": "0x01e0ed991fF21f4366eEDd04A968029Bd6F8C61c", + "transactionIndex": 0, + "gasUsed": "4195465", + "logsBloom": "0x00000000000410080800010000000000000000000000400000800010400000000000000000000000000002000001000000000000000002000400000000000002000100000004040000000028400040000501000000000000000000000000080000000000020100002000000004000800000000000000400000000010000000400000801000000000000004000100000000000300000000001000000000000080800000000004100000000000800100000000400010000000102000010000000000000002008000000042000000000100000010000100000000000000000020400000040000000000000000000000000000000040000000400000000080008000", + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972", + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x0000000000000000000000000000000000000000000000004a0f511ebb09fac2", + "logIndex": 0, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002270000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ea1b7a03643121a15ed1ad0b67a37e0fae3d2c52a54b4aefe0a2166e38c95e2a3", + "logIndex": 1, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0xa1b7a03643121a15ed1ad0b67a37e0fae3d2c52a54b4aefe0a2166e38c95e2a3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000005e4206e9000000000000000000000001002001900000044e010080410000044e0010009c0000076d0000c13d1134112f0000040f000000000101043b000000200030008c000000c0011002100000000001000414ffffffffffffffff000000000021043500001136000104300000004a0000213d00000000003204350000044e0020009c0000076d0000413d0000076d0000213d0000044e02008041000000400200043d000000000010043f00000000040340190000004001100210000000000001004b000000400100043d00000020040000390000076d0000613d0000801002000039000000800010043f000000000112019f00000493011001c7000000400010043f00000b3d0000413d000000000006004b000000200010043f000011350001042e000300000001035500000000006504350000044e03300197000000000101041a00000000010004160000000003010019000000000048004b0000000008980436000000007907043c0000000008020019000000000701034f000007d10000613d00000000046200190000048e063001980000001f0530018f0000001f01400039000100000003001f000000000767022f000001000660008900000003066002100000001f0640018f0000006003300270000000000002004b000000c0022002100000000002000414000000400020043f000007d10000013d000000000686019f00000000066701cf000000000707043b000000000868022f00000000086801cf0000000008050433000000000771034f000000200740019000000b3d0000c13d000000600110018f000000000202043b00000000020004164d616769637377610000000000120435000000000001042d0000000009a90436000000008a08043c000000000801034f000000040020008c000000000059004b0000048f011001c700000000010000190000000101000039000000000021041b000000000201041a0000000d020000291134112a0000040f00000044021000390000048f01000041000000040010043f000004b2010000410000044e0030009c0000000e020000290000800d02000039000000000202041a000000840010043f0000044e0300804100000000010104330000002402100039000000000003004b0000000f0200002900000010010000290000048c0020009c0000048c0010009c0000048c022001970000000303000039000000090200002900000000020204331134107c0000040f0000049b010000410000049e0010009c0000000e030000290000049101000041000000240030008c0000002001000039000f00000002001d0000001002000029000000400300043d00000001020000390000048b010000410200000000000000000000000019004b0000000000020435000000000003043500000b3d0000213d000000000004004b000000000020043f000000040210037000000004011003700000000f01000029000000000100041000000458010000410000000d010000290000000002000039000000000021004b0000000e01000029000000000034043500000009010000390000000103000031000000c40010043f000000a40010043f000000000403041a00000020030000390000049b020000410000000b010000290000004a0000c13d000e00000002001d001000000001001d000000000121019f000000200040008c0000000701000039000003860000c13d00000f7d0000613d00000d490000c13d0000000f030000290000002002100039000004ac0030009c0000000301000029000004a3011001c700000040022002100000000d0300002900000000002404350000000a020000290000000000230435000000400030043f000000000200041000000080057001bf0000049c011001c70000048c01100197000000000404043b000d00000002001d000000000032004b000000000034004b00000002010000390000800b0200003900000456011001c700000000001004430000006002300039000000000001041b000000000201043b0000000d011000290000000000310435000004ac0020009c000000040040008c0000000d090000290000000d05700029000004a4040000410000000c01000029000000000404041a0000000102004039000000000005004b000000000013043500000060022002100000000f0b00002900000000090b0019000000000131019f00000000020000190000052e0000613d000000000058004b0000000008a80436000000009a09043c000000000901034f000000800800003911340f8c0000040f000000000300041400000000050004100000048d011001c7000004b4010000410000002401100370000000440030008c0000044e01100197000000000303041a0000049e0040009c000000000001042f00000004021000390000022f0000013d00000001030000390000000b030000290000000e050000290000049201000041000e00000001001d00000008010000390000000b01000039000000000012041b001000000002001d0000004101000039000000c0010000390000000104000031000000010020008c000000400040043f554646494349454e7056323a20494e5300000000ffffffff000010500000213d000010320000613d00000f1f0000613d000300000002001d0000000302000029000000a00030008c000000070200002900000000050004110000001101000039000000000013004b000000000e03001900000b130000013d000000000606041a0000006002700039000004ac0070009c000000400700043d0000002003200039000000400320003900000060032000390000002401300039000000440130003900000000004204350000048b020000410000000006000019000000080200002900000000040000190000002002000039000000100f0000290000049e0030009c00000004012000390000000e0570002900000040013002100000000c0200002900000496011001c7000000000113019f0000076d0000013d0000000001b1001900000000057b0019000000c001300210000900000002001d000e00000004001d000008d20000c13d000a00000003001d00000490022001970000000f04000029000d00000003001d000000000012004b000000000014004b0000044f0000013d0000048b03000041000000800300043d00000080021001bf0000004002000039000e00000003001d000000000301041a000000000100041a0000000c02000039000000000302041a000000000303043b000000000035004b000c00000001001d00000000004304350000000201000367000000000031004b000300000001001d0000076d0000813d000000000200041100000024021003700000001201000039000000800020043f0000000802000039000000000232019f113411080000040f0000000002040433000000000014043500000000030004100000023a0000613d0000004002100039000003530000013d000000a00010043f0000002004008039000000040030008c000400000000000275737465640000007056323a2062616cffff000000000000ffffffffffffffe07fffffffffffffff454400000000000000000020000000007056323a20494e5600000080000000000000004000000000ffffffff000000000000000100000000000010f40000613d000010ee0000213d00000000000d0435000010560000213d000000000904041a00000001006001900000000105000039000000040300002900000f7f0000413d0000000102000029000200000001001d000100000003001d0000000202000029000027100310011a000027100010008c00000000022100d9000400000001001d0000006001100039000000a0040000390000000304000029000000000045004b0000000b020000290000000303000029000000000024004b00000002050000290000000d0400002900000010060000290000000005000019000000320100003900000aa00000213d000000000098004b000000000096004b0000000006000039000000010200c039000004ac00c0009c000000400c00043d000000000deb0019000004ab033081c7000000000092004b000000010400c0390000000004000039000000ff0040019000000040033000390000044e02200197000000000093043500000000010204330000000000040435000000400410003900000060041000390000000000760435000000000707041a000000080100002900000aef0000013d0000000001120019000000000012001a000000000067004b000000040000006b00000000010304330000000000010435000004ac0010009c00000000009c004b000000000064043500000b200000613d000000400270003900000c510000213d00000008040000290000000202000367000c00000002001d0000000e09000029000000000400041000000004024000390000000e04000029000004a203000041000000000010041b000008240000213d0000000a0020006b0000000e0000006b0000000e0060006c0000000c0600002900000070022002700000000001040433000004a9011001c700000064021000390000000903000029000000000054004b000000400500043d000008e00000613d000000000505041a000007ba0000813d0000000000540435000000000575019f000000000656022f000001000550008900000000070404330000000305500210000000000047004b0000000007000019000000000000043f0000000a030000290000000e020000390000004003400210000008ce0000c13d000000000401041a000a00000002001d000000000115001900000000043200d90000000103300039000000000043004b0000000f0030006c00000b3d0000613d000b00000004001d0000000f050000290000000104400039000000000605041a0000000004020019000000800200043d00000080011001bf00000490041001970000007001100270000004900310019700000000020104330000000001140019000000000053043500000084031001bf0000049f011001c700000040012002100000000401000039000000000013041b000000000114019f000000000043041b000004590440019700000458020000410000ffff0010008c11340ee80000040f0000000001000411000000000301043b000000ff00200190000004c101000041000000e40010043f0000002404100370000007870000c13d000000000505043b000000140300003900000044021003700000000d0600002900000010030000290000003f011000390000049e0020009c0000004401100370000004be01000041000000c00010043f000004900120019700000490011001970000000301000039000001fc0000013d000f00000001001d000001ed0000013d0000000601000039000000a00240003900000010040000290000002002300039000004510010009c7e042cfd0f2efa9f94a277a401bf8a4675e00547a1918c050b016bb9e76d006b494c4544000000004e534645525f46417056323a20545241a9059cbb0000000029000000000000002c75696e7432353628616464726573737472616e73666572062b03a9fffbbad189e3cab4c78be50e1c2f21f7726b17ae1c411e9a96e0712400000000ffff000052464c4f570000007056323a204f564500010000000000005b200ac8c7c3b925dd0314c0f7b2291ed14f71427d1e84f38c5be1e5ebec7d5bffffffffffffffa0fffffffffffffc17ffffffffffffff005f414d4f554e5400545f4f5554505554414c49445f544f00545f494e5055545f414d4f554e5400007056323a204b0000616e63653041646a616e63653141646ae3d130840159d822e613ce37657fb8d56551d0da85fc275fd78ad95fa46c994b9d836a6e000000000000000005f5e1008c23283800000000000000840000008049545900000000004b454400000000007056323a204c4f430000006000000080c3a93dbf584e125ad8f7e35e7747279b652e4400164f05a5ac49e518f90a358f00000040000000800000ffff00000000ffff0000ffffffff00000001000100000000000400000080313ce56700000000000000640000008042494444454e00007056323a20464f524e487b71000000004954595f4d494e5426394f4c03821c4f560dff690a1c6fef8f13e2e1088ba56a4c209b5fc8ad50755f6e3230263bcb493c7e97b47efa546f729641147f791557a6eef7e35abe702649000000000000004f4c440000000000ffffffffffffff9f0000008400000000545f4c49515549444954595f4255524e89976e6d81936496a42612892bb3f4f79cb1fd330b93224cdccd412f0b12528128f55a4df523b3ef952ba7f163c4a11669c2b068fc378daaddf252ad1be2c89b666c6f77000000006d756c2d6f76657264732d6d6174682d00000000000000c04d414749432d563249524544000000007056323a20455850000000640000000008c379a0000000004e41545552450000414c49445f534947ffffffffffffff7f1901000000000000ffffffffffffff1f169c64845d6126c95fa2faae0126114a4d1f60370fef10106e71edae12b1b97f08cc6b5d955391325d622183e25ac5afcd93958e4c903827796b89b91644bc9800000020000000800000ffffffffffff000000240000000000000000ffffffe0000000240000008070a082310000000000000000053f14da00000000022c0d9f000000000902f1ac0000000006fdde030000000006fdde02000000000dfe168100000000095ea7b30000000023b872dd0000000018160ddd0000000018160ddc00000000095ea7b2000000002b8e066600000000252c09d700000000313ce5670000000030adf81f0000000030adf81e000000003644e5150000000032148f67000000004f1a470800000000485cc95500000000485cc9540000000032148f6600000000252c09d60000000070a08231000000006a62784200000000883bdbfd000000007ecebe00000000007ecebdff0000000095d89b410000000089afcb4400000000aab5497c00000000a9059cbb00000000a9059cba0000000089afcb4300000000bc25cf7700000000ba9a7a5600000000d21220a700000000c45a015500000000c45a015400000000d6cf0c3700000000d505accf00000000fff6cae900000000e1f1c4a700000000dd62ed3e00000000dd62ed3d00000000d505acce00000000ba9a7a55000000006a627841000000400000010000000002000000000000000000030009ffffffffffffff3f000000040000000002000002000000000d0df415241f670b5976f597df104ee23bc6df8224c17b489a8a0592ac89c5ada9a75d522b39400f239f7b179b0ffaca512ecc4cf759cc798b73c3c69bb8fe3d3100000000000000ffffffffffffffc00000000c000000a07020563200000000000011340000043200001132002104230000112d00210421000011290000613d0000111b0000613d0000001c03000039000004dd03000041000011050000c13d000011050000a13d0000001f0010008c000011050000213d000004dc0010009c000010ed0000613d000000800300003900000060010000390000109e0000c13d0000044e041001970001044e0010019d0000006001100270000000010220018f00000000020400190000006003300210000010dc0000013d00000000056501cf000000000565022f00000000076701cf000000000557034f000010dc0000613d000010b40000c13d000000000049004b0000000009030019000000000807034f000010b80000613d00000003070003670000000004530019000004d3054001980000000003410436000010ee0000c13d00000001060040390000000003310019000004d303100197000004d301100197000010da0000613d000010c60000c13d00000000030504330000008002500039000004980050009c000000000025043500000044020000390000002403500039000004db030000410000002001500039000000440150003900000000005104350000001905000039000004da060000410000002005100039000000400050043f0000004005100039000010ee0000813d00000000040100190000001503000039000004d6030000410000106e0000613d000004d904000041000000200420003900000490014001970000049003300197000004d8033001970000007003400210000000e002200210000000000034041b000000000353019f000004b705900197000000000363019f000004d7033001970000001003500210000000000073041b00000001077001bf000004d007800197000000000803041a0000000e03300039000000000078041b0000000d08300039000000000098041b00000000099a019f000004b70aa00197000000000a08041a0000000c0830003900000003036000c9000000000078043500000020083000390000000000a80435000000010a0000390000004008300039000000400080043f00000060083000390000000007ab0019000010500000413d0000000000ab001a000010500000c13d0000000000c3004b00000000038a00d9000010100000213d000000000073004b000000000b0b0433000000000a8c00a90000044e00c0009c000000000ca900490000044e0aa00197000000000a0a043300000000000c0435000000200dc00039000000400dc000390000004000d0043f000000600dc000390000044e0920019700000000606900d90000ffff0990018f00000001099000390000ffff0650018f000010760000613d00000ff50000013d00000000050c0019000000000c05c01900000000006d004b0000ffff00d0008c000000010d50008a00000ff30000a13d00000000005c004b0000ffff0cc0018f000000200c9002700000102c0000613d0000044e00c00198000000000c2d013f0000000000ce0435000000010c00c039000000000c000039000000ff00c00190000000000c0c041a0000000e0cc00039000000400ea000390000000000eb0435000000000e0e041a0000000d0ec00039000000000bba04360000044e0bd00197000000000d0b041a0000000c0bc00039000000030c6000c90000004000b0043f000000600ba000390000ffff0550018f0000001005900270000010560000813d000004d200a0009c000000400a00043d000010700000613d0000ffff0060008c0000ffff0690018f0000000b04000039000000000084041b0000000a0400003900000000083700d9000010500000013d00000fc70000613d00000000055700d9000000000704001900000fc20000013d00000000074500a900000fc60000613d00000fb50000c13d0000000007080019000000010660027200000000055700a9000000010700603900000000087700a90000000a0700003900000fc00000613d0000004d0060008c000000050500003900000490044001980000000104000029000004900330019800000002030000290000044e003001980000000003320049000000e0033002700000106d0000613d0000105c0000813d000004d50020009c0000105c0000213d000004900010009c000200000003001d000100000004001d000000e003200270000000020600002900000003050000290000000102300029000000040030002a00000002010000290001000400100074000200000002001d000400000003001d0000000306000029000004d40400004100030000000000020000000001210019000004d3022001970000001f02200039000000000321001900000edb0000413d000000200440003900000000060604330000000006430019000000000541001900000ee20000613d00000040011000390000000032020434000000000431043600000ecd0000813d000004d20010009c000004c6040000410000048c06200197000004c5011001c7000000c0033002100000004402200370000000240320037000000004032003700000001d03000039000004c70300004100000ea10000813d000027100330011a000000010300002900000e900000c13d00000e840000c13d00000e9d0000013d000004c80300004100000e950000813d0000000e0020006b000027100220011a00000e890000613d00000e6a0000613d00000e590000c13d00000e5d0000613d00000e700000613d000d00000004001d0000000e0410002900000e7d0000613d00000e220000613d00000e110000c13d00000e150000613d00000e260000013d00000dfa0000c13d00000de50000c13d00000db60000013d000000040200002900000db60000413d000000060020006c00000006012000b9000000050200002900000dd20000413d000000070020006c00000007012000b900000db60000613d000d00000001001d0000000b010060290000000001020019000000000102601900000dea0000213d000000010010008c000000ff0110018f000000010110003900000dbc0000013d000e00000000001d000700000001001d0000004001200039000600000001001d00000080012000390009048c0010019b0008048c0010019b000500000001001d0000000301100029000001e00110018f00000dde0000613d00000d900000613d00000d7f0000c13d000000030900002900000d830000613d0000000305700029000000e00740019000000d940000013d00000d680000c13d0000000002240436000004c40200004100000004013000390000001402000039000004a20200004100000caf0000013d000000000056004b0000000a0040006c00000000044600d90000000a076000fa00000d430000a13d0000000c0080006b00000008080000290000000a064000b900000ca20000013d0000000b0050006c00000000054200d90000000b052000fa00000d360000a13d000000090060006b0000000e060000290000000b024000b900000d2a0000c13d00000c240000013d00000d230000613d00000d160000613d00000d050000c13d00000d090000613d00000ce90000c13d000004ad0300004100000cd60000c13d00000d540000013d000004c90200004100000d5a0000813d000004c3022000d1000000040110003900000010022000b9000000020010006c00000001014000fa000000010010006c00000002014000fa00000cba0000613d00000001045000b900000cbd0000613d0001000000650053000200000021005100000d3c0000c13d0000000c0060006c000027100650011a000027100060008c0000000c065000fa00000ca90000613d00002710056000c900000d2f0000c13d000000090020006c000027100210011a000027100020008c00000009021000fa00000c9c0000613d000000000404043300002710012000c900000ce20000613d00000c850000613d00000c740000c13d00000c780000613d00000c8b0000613d000700000004001d0000048c0440019700000000005204350000000000560435000004c2050000410000000604000039000004a6011001c7000004a50400004100000cee0000c13d00000004023000390000000f0310002900000ccf0000613d00000c000000613d00000bef0000c13d0000000f0900002900000bf30000613d0000000f0570002900000040033002100000001e030000390000049a03000041000008620000013d000003e80440003900000bb90000c13d000004b00400004100000002030000390000000802300029000000090020002a000800000002001d0000000901100029000000090010002a00000b4a0000c13d00000bbe0000a13d000004d10040009c000004af03000041000000200030043f000000000020041b000003e802000039000903e80040009400000b2d0000c13d0000080a0000013d000009a30000413d0000000c0250002900000b200000a13d00000000024800d900000b3d0000013d00000b130000813d00000b0e0000a13d000000000128001900000000083400a900000000047600d9000000000018004b000000000626004b00000000060204330000044e0070009c000000000718004900000afb0000c13d00000000008a004b0000044e08600197000000000607043300000af50000c13d00000000031a004b0000000f0a0000290000044e01c001970000000e0080006b000004ab0880a1c700000aa00000013d000000010ba0008a0000000200d0008c00000ad80000a13d000004ab0660a1c70000000f0080006b00000aea0000213d00000aea0000413d00000ae50000213d0000000f0060006c00000ae10000213d00000ae10000413d0000044e06c00197000000000c0c043300000000006f0435000000010600c039000000ff00600190000000400f7000390000000e066000390000000000f20435000000000f0f041a0000000d0f60003900000000028704360000044e082001970000000c0260003900000003062000c90000000020f300d900000a9f0000613d0000000103a000390000004003c000390000000e022000390000000d0320003900000000043c04360000000c0320003900000003022000c90000000020fa00d90000006002c00039000000010ad002700000000000eb001a00000aa30000013d000000010be0002900000cdb0000213d000004ab0220a1c700000a820000013d00000a7d0000213d00000a7d0000413d0000000e040000390000000d06000039000000000423043600000a770000c13d0000000e044000390000000d0740003900000000062304360000000c024000390000000304e000c900000002e0f000f9000009de0000a13d00000000006a004b000004ab0aa0a1c7000000000a0c0019000004ab066081c700000000060b00190000000104000039000000400230003900000004031000fa00000a360000613d000000000203043300000004014000b90000044e0040009c0000000004190049000000200410003900000b130000613d0000044e00400198000000030440014f000000010700c0390000000007000039000000ff0070019000000007070000290000000601000029000000400620003900000000031204360000044e0140019700000005010000290000006001200039000000000c03043300000000022704360000000000620435000000010600003900000004071000fa000009f70000613d00000004016000b90000044e0060009c0000000f06100069000000600210003900000aef0000613d0000044e001001980000000001b8013f00000a4e0000213d0000000000bc004b00000a450000213d00000a450000413d0000000000a60435000000010a00c039000000000a000039000000ff00a00190000000000a0a041a000000070a000029000000400630003900000006060000290000000004c304360000044e0c800197000000000804041a000000050400002900000060043000390000ffff0030008c00000008030000290000000002070436000000000219004900000a070000613d0000044e011001980000000a01200029000000050230021000000000030000190002ffff001001930005000c0020003d0006000d0020003d0007000e0020003d00000003023000c9000800000003001d00000001012000390001000100f000920000044e091001970000ffff0320018f0000002602000039000004cb02000041000004ca0200004100000064013000390000000c0050006b0000000805000029000000090050006b000000040220003900000000020040190000000c0240006b0008000f0020007300000024022003700000000004004019000000090450006b000e00100040007300000004042003700000000e0210002900000bb20000613d0000095a0000613d000009490000c13d0000094d0000613d000009600000613d0000000c040000290000000d0410002900000b260000613d000009120000613d000009010000c13d000009050000613d000004cc01000041000000170100003900000004021001bf0000022c0000013d00000c040000013d00000bd90000c13d0000000002030019000e000a002001020000000a032000fa000000000121004b000f000e0010007400000008014000f90000000f0010006c00000008013000f9000008700000613d0008000f003000bd000008270000013d000004b10300004100000b4f0000c13d000000090000006b00000000020180190000000e014000fa00000000021200d900000000033400d90000000f054000fa000008570000613d0000000f043000b90000000b0000006b00000000045200d90000084b0000613d0000000d0060006b0000000b0600002900000000025300a90000000a05000029000000000321004b00000009020000390000002a03000039000004a803000041000004a703000041000008680000c13d0000000f0000006b0000000002120049000008140000413d00000000026204360000000056050434000008190000613d00000000030304330000000002210436000009970000c13d000008000000c13d000000000016004b0000000006760436000000004704043c000000000605001900000002044003670000000004000031000008040000613d0000001f0310018f00000000053404360000000904000029001000000006001d000000010050019000000001050040390000000005000039000900000005001d0000000004450019000004aa044001970000003f04100039000000050130021000000000030104330000006001300210000000000161019f00000000015101cf000000000151022f00000000065601cf0000000006040433000000000161034f000007de0000613d000007cd0000c13d000004c001000041000004a8010000410000002301000039000009160000013d000008ea0000c13d0000000003040019000007aa0000613d000000000402043b000007a30000613d0000000c0020006c000c048c0050019b00000008050000390000000e0020006c000e048c0050019b00000007050000390000000f0040006c000f04900040019b0000007004400270000000100030006c001004900040019b0000000904000039000007820000c13d000007760000c13d000008380000813d0000000001b2001900000000040b0019000000600210018f000007c60000613d0000075b0000613d0000074a0000c13d0000074e0000613d0000000e0b000029000e0000000b001d00000000020b40190000044e020000410000044e00b0009c0000017b0000013d000d000e00100074000006f00000c13d00000bd20000c13d000000100010006c00000bd20000613d0000048c01100198000000000100043d00000b430000613d00000000055601cf000000000606043b000000000757022f00000000075701cf000000000641034f000006da0000613d000006c90000c13d0000000007870436000000006806043c000000000601034f000006cd0000613d00000020044001900000001f0540018f00000499011001c7000000c4011003700000004004300039000000a4021003700000002004300039000000ff0220018f0000016002200039000004980030009c00000042020000390000010202300039000004970200004100000100013000390000012202300039000000e003200039000004950040009c00000494020000410000000001140436000000400140003900000060014000390000008001400039000000c002400039000000400400043d000000000032041b000000010310003a000000000102041a000b00000001001d000005090000813d0000077b0000613d000006310000613d000006200000c13d000006240000613d00000040035002100000049b0000813d0000076f0000613d000006010000613d000005f00000c13d000005f40000613d000005d70000c13d000005cb0000c13d000005bf0000c13d000004b9022001c7000004b80220019700000001011001bf000004d0013001970000000d01000039000004b7033001971134111d0000040f11340ec80000040f000000000023041b0000000503000039000000ff0020008c000006e90000613d000005920000613d000005810000c13d000005850000613d000004b6011001c70000056b0000c13d000003cd0000813d000005d00000613d000005590000613d000005480000c13d0000054c0000613d000000100b000029000008220000c13d0000000a0000006b000000000041004b00000000013200d900000000014200d9000005270000613d00000000023400a90000052a0000613d000000000200041a0000060c0000c13d000b00000002001d00000084041001bf0000000000350435000005c40000613d000004ee0000613d000004dd0000c13d000004e10000613d00000b330000013d000004c00000413d0000000003050019000000000403001900000001054002700000000004340019000000000034001a00000b320000813d000000000023004b00000001032002700000000f032000fa00000000034200d9000004b70000613d0000000d0050006b0000000f024000b90000000b050000290000000a040000290000000e0030006c0000000c03000029000008430000c13d000000000300041a000f000000250053000c00000005001d000000000505043300000070025002700000000d0340006b0000049004500197000005dc0000c13d000005b80000613d000004800000613d0000046f0000c13d000004730000613d000004b3010000410000001601000039000004bd04000041000004bc011001c70000044f0000613d0000ffff0150018f000004bb044001970000002004500210000004ba0140019700000000050100190000042d0000413d000000000065041b00000001066001bf000004b7066001970000000c0550003900000003054000c900000b200000813d0000ffff0040008c0000043a0000a13d0000000005020019000004240000c13d0000075f0000013d000007310000c13d0000000401b0003900000000001b0435000000400b00043d000f048c0010019b000000000312004b000005640000613d000003f90000613d000003e80000c13d000003ec0000613d000005340000c13d000f00000003001d0000041d0000613d000003b20000613d000003a10000c13d00000000005a004b000000000a9a0436000000008908043c000003a50000613d000000800a000039000004bf010000410000001301000039000003520000013d11340f210000040f000004f20000013d000004cc0000c13d000004840000013d0000045e0000c13d000005960000013d000005700000c13d000004b5010000410000000803000039000000000424019f0000000703000039000004540000c13d00000000040004110000048c0330019700000006030000390000049401000041000004a1011001c70000006001100210000000c00110008a11340ed30000040f0000008002000039000000a00020043f0000044f02000041000004ae01000041000004290000c13d0000ffff0220019000000020024002700000000b03000039000000000002041b000000010030008c000003640000013d000000010100c0390000000001000039000000a00030043f0000000c011000390000000d031000390000000e0210003900000003011000c90000fffe0010008c000004ce01000041000004cd0100004100000027010000390000000403100370000000000003041b000000010040008c0000045803000041000000240440003900000000045400190000049e0050009c000000000551034f000000040540003900000023054000390000006404100370000000840030008c00002710010000390000049d030000410000063c0000813d0000000e0010006b000000ff0010008c00000084011003700000006402100370000000e40030008c000003e8010000390000ffff0110018f00000020011002700000046c0020009c000003570000613d0000046b0020009c000004ae03000041000007e40000c13d0000ffff061001900000001001200270000001d00000413d000000000065004b00000020055000390000002003300039000004ab0040009c000000000451034f000001d90000613d000a00000001001d0000000001310436000000010030019000000001030040390000000003000039000b00000003001d0000000001130019000004aa011001970000000b02000039000400000002001d0000000a020000390000000f02100029000f0005002002180000002401200039000000000141034f00000004042000390000002304200039000004710020009c000003440000613d000004700020009c0000000501000039000004780020009c000002d70000613d000004770020009c000003630000013d000006f50000c13d000004cf0010009c000000640030008c000004830020009c000002d00000613d000004820020009c0000047d0020009c000002c90000613d0000047c0020009c0000044e0130019711340f850000040f000004880020009c000002b80000613d000004870020009c000004630020009c000002010000613d000004620020009c000004660020009c000001f80000613d000004650020009c000002c00000013d000004a0020000410000046e0020009c0000031f0000613d0000046d0020009c000001e30000213d0000046a0020009c0000047a0020009c0000029b0000613d000004790020009c0000017f0000213d000004760020009c000004850020009c0000028d0000613d000004840020009c000001470000213d000004810020009c000003fd0000013d000003d70000c13d000004680020009c000001f10000613d000004670020009c000001190000213d000004640020009c0000034f0000013d000004730020009c000002fe0000613d000004720020009c000001880000213d0000046f0020009c0000010a0000213d000004690020009c00000010011002700000047f0020009c000002740000613d0000047e0020009c0000013c0000213d0000047b0020009c000000ff0000213d000004750020009c0000045a0100004100000120000004430000010000100443000000000300041100000459022001970000000302000039000000c001400039000004570040009c000000a001000039000000800240003900000455010000410000045401000041001000000003001d000000400130003900000453011001c7000004520200004100000000012104360000000a010000390000048a0020009c000002420000613d000004890020009c0000012c0000213d000004860020009c000000f40000213d000004800020009c000000aa0000213d000004740020009c0000005f0000413d00000450011001c70000044f010000410000000c01000039000003b60000013d000003900000c13d000004610020009c0000023b0000613d000004600020009c0000036c0000613d0000045f0020009c000001220000a13d0000045e0020009c000000cd0000a13d0000045d0020009c000000b90000a13d0000045c0020009c000000500000a13d0000045b0020009c000000e002200270000000340000c13d00000080040000390000044e0040019d000200000001035500030000003103550000044e0340019700000060043002700010000000000002013e06e8002906e706e606e506e406e306e200e8000106e1013d001000b606e006df06de06dd06dc06db06da06d906d806d706d606d506d406d300040028001700040086005700e7009a00b500990057007a001c008500620009006b005106d200e60098013c06d100280017000400e5001f06d0001c06cf013b000900030002000806ce001b00050001001a00b6001801ec06cd005d001400e4005c005b000c06cc06cb06ca06c906c806c706c606c506c4000400280017000406c3013a00e30139003d007906c206c1000b000300020016003c000f0012003b009706c0001b00050001001a0006007800b4004c06bf0077000b06be01eb06bd0076004c06bc00b3000900030002000800b200b1000500010138000601ea01e90137000e06bb004c06ba013606b9000d06b8001f01350084013406b700e200860079005601e8005706b606b501330056007506b406b306b2002306b106b006af06ae06ad06ac06ab000400280017000400e1002706aa01e706a906a806a706a606a506a406a3000400740010004a003a000400830006006a00110014005506a206a106a0069f069e069d000400740010004a003a0004008300060096006a00110086005700e7009a00b50099005700e0002701e6007a001c008500620009006b00510095069c00e60098013c069b069a06990698069706960004002800170004009901e506950694069306920691000400280017000401e4013a0690068f068e068d068c000400280017000400e5001f01320131068b068a068906880687000400280017000400e001e5068606850684000400280017000400e1002701e70683068206810004002800170004068001e3001c01e2013b067f01e101e00023067e067d067c00040028001700040130001c00730023067b067a0679000406780010004a003a00040082004900e300690011012f004900760069001101df000600df0068001400b000220009000300020008001e001b00050001001a0006012e008100220009000300020008001e001b00050001001a0006002706770676006800670072067506740673067200040028001700040671013a0670066f066e000400740010004a003a00040082004901de0011066d00af012d066c066b0006009600710011066a00770669066800ae001100ad00df00de00b3000900030002000800b200b1000500010138066700610666066500610006012c008401dd0664007806630662012b066106600071000d065f0094001f009301dc065e065d006600dd01db065c012a00dc065b00ac065a012d065901290658065706560655065406530018005a0652000e006500db00da06510650064f000400280017000400e10027064e064d001c00730023002800170004064c001c0073002300280017000401e8002700ab001c00730023064b0010004a003a00040082004900e300690011012f0049007600690011064a0049009501da004900ad0649000601280648001100de00b3000900030002000800b200b10005000101380006064706460018005a0645000e006501d9000e0092000b00d90091000e00030002001600aa000c00d80028001700040644001c0073002306430010004a003a000401da004900690011064200ac00d7001106410127012d0640063f01d8063e0011063d063c00af0011063b0090063a009a063906380126006601d701d600ac008001d70070001c007500620637008f0636008e063501d501d4000c00740010004a003a00040083000606340011063306320061063100d60630002700d5001c062f01d3062e062d01e101e0002300d40010004a003a0004008200490069001100d301d201d101d0062c00740010004a003a00040083000601cf001101ce0125062b009a062a062900900628062706260070001c007500620055008f0625008e00d2000c00280017000400e5001f012401310624062306220621062000030002061f061e0023002800170004061d001c007300230028001700040123001c0073002300d40010004a003a0004008200490069001100d30006006a0011061c00d6061b061a00af06190618009001cd061701cc0616009001cd01cb01ca0615001c000900510614008d000700190015061300740010004a003a0004008300060096006a00110086005700e7009a00b500990057008c0122007a001c008500620009006b005101210612008d000700190015061100740010004a003a0004008300060096006a00110086005700e7009a00b500990057008c0027012800e0002700df007a001c008500620009006b005100ad0610008d000700190015060f00740010004a003a000400830006006a0011001401c900220120005401340027001c0073002300d40010004a003a0004008200490069001100d301d201d1060e00550013004c000f001201c801c7002300d40010004a003a0004008200490069001100d300060096006a0011008100b0002201200054013400770081002200540120060d0070001c00750062060c008f060b008e00d2000c00030002000800d10005060a0029003900260007001900150038004600a906090050060806070606060500210604004500370044004300420041003600350040003f0025003400240001060300330048011f00e3003d0098001001320061011e0602011d01ea008b01c600d001c500cf006b0051060101c4001f006801c3008c002701c201c101c0008400ce011c00030002000800d100050029003900260007001900150038004600a9060000cd00cc00cb00ca00c905ff002105fe004500370044004300420041003600350040003f002500340024000105fd0033004801bf001f00980010008c002701e301be05fc0020008405fb008a0077006f007a05fa05f905f800a8000b00090067005105f7008d00070019001505f60032003100130030002f002e002d002c002b002a05f5003e008905f405f301bd05f205f105f005ef01bc05ee05ed05ec01bb011b05eb009005ea05e905e805e701cb01ca05e6011a05e50131013b000900030002000805e4006000db05e300590001001a005501ce00e2005400230070001c0075006205e2008f05e1008e00d2000c00030002000800d100050029003900260007001900150038004600a905e000cd00cc00cb00ca00c905df002105de004500370044004300420041003600350040003f002500340024000105dd00330048011f0076003d0007001001320061011e0119011d0118008b01c600d001c500cf006b005105dc01c4001f00dd05db05da002005d9011701ba05d8009505d705d6002001b9011605d5006605d405d305d205d105d001b805cf05ce05cd05cc01b7004705cb01b601150051002005ca01b505c905c8006600c801b405c7002005c605c5012705c405c305c205c100030002000800d100050029003900260007001900150038004600a905c000cd00cc00cb00ca00c905bf002105be004500370044004300420041003600350040003f002500340024000105bd00330048011f0076003d00070010005f006b011e0121011d01ba05bc05bb0137008b00cf005105ba05b901b3001f0084006401e600850014005500220009000300020008001e001b00050001001a05b801b2000601b10072006600c705b705b6008005b505b4012b004705b305b201b00114011305b105b0005d00140130005c005b000c005e0063011201af00c60053000505af00290039002600070019001500380046011105ae005000c5004f004e005205ad002105ac004500370044004300420041003600350040003f002500340024000105ab003300480110001f000705aa010f0032003100130030002f002e002d002c002b002a05a9003e00030002000805a800050029003900260007001900150038004600a905a700cd00cc00cb00ca00c905a6002105a5004500370044004300420041003600350040003f002500340024000105a40033004801bf001f0007001001be05a3001105a205a105a000de059f00d501240125059e010e00e2059d00b501ae0125059c059b00e200e10057059a05990056005400230032003100130030002f002e002d002c002b002a0598003e0032003100130030002f002e002d002c002b002a0597003e0032003100130030002f002e002d002c002b002a0596003e005e0063011201af00c60053000500c40029003900260007001900150038004601110595005000c5004f004e0052059400210593004500370044004300420041003600350040003f00250034002400010592003300480110001f00070591010f005e00630112059000c60053000500c4002900390026000700190015003800460111058f005000c5004f004e0052058e0021058d004500370044004300420041003600350040003f0025003400240001058c003300480110001f0007058b010f01e40027058a0068001401c900220009000300020008001e001b00050001001a00b60589058801b80587058605850072000e01e9004c05840058000b05830067000b05820077000b00e505810580000b0114057f000d005f057e011600a7000300020016006e000f001200c3001d003c000f0012003b001d010d001b00050001001a00060072057d004c057c057b000b057a00dc000e057901ad00a60578000d005f0577003d00030002001600a5006e000f001200c3001d003c000f0012003b001d010d001b00050001001a010c057600060078057500a400c2012a05740049057300a40572000600b4004c005e0063010b01ac003c000f0012003b001d0571007900050029003900260007001900150570056f056e056d01ab056c056b01aa056a00c10569056801a901a805670566056501a701a6056401a501a40034002400010563056205610560055f055e0068006700a301d0005400230032003100130030002f002e002d002c002b002a055d003e0068001400b000220009000300020008001e001b00050001001a0006012e008100220009000300020008001e001b00050001001a00060027055c00200068001400b000220009000300020008001e001b00050001001a0006012e008100220009000300020008001e001b00050001001a000600580056055b055a0559055800a200030002000800970053006705570005002900390026000700190015003800460556010a0555005000c5004f004e0052055400210553004500370044004300420041003600350040003f00250034002400010552003305510550054f0089008800c00071000d00010094001f0007054e0054000c0032003100130030002f002e002d002c002b002a054d003e0032003100130030002f002e002d002c002b002a054c003e054b00bf054a054901a30548054701d600ac054601a3054501a20544054301a1054201a20541054001a10066053f008a006f012a012f053e0080053d01df00b600be053c006f0013007a004c00ad010900a8000b0009005f0051053b008d000700190015053a0070001c007500620539008f0538008e053701d501d4000c0032003100130030002f002e002d002c002b002a053600c10535053401a90533053201a6000601a705310530052f0136052e000f001200a2001d000c0093052d0108000d052c052b052a01a005290528019f0527052600d7000d05250094052400e80523052205210017052001b3051f051e051d051c051b051a0519006600930064001701070518001801060517019e0516000e01390066051501050514051301bb00af05120511000f001200c3000300020016001d00230510050f0018019d050e000e005a050d000e0065050c000e0092000b00d90091000e000300020016019c000c019b050b0061019a0117050a002000840077006f011c05090508050705060505050400af004701b4019f0115050300c8050201990198050105000127004704ff01b701150197009300c804fe04fd011a04fc011304fb04fa0018019d04f904f8007204f70066006d04f604f504f40047011804f3012b01b00196019501040196019500850014005500220009000300020008001e001b00050001001a0006002704f2002000850014005500220009000300020008001e001b00050001001a0006006700560123005f04f1002001940018000b000300020016003c000f0012003b001d00a10060006c00bd00d0010300590001001a006d04f0010404ef008700770116006f009300770072006f007a0013004c0076010900a8000b000900a304ee013d04ed00e60098013c04ec0018005a019304eb0092000b04ea0091000e005a0193000e006501d9000e001600aa000c0070001c0075006204e9008f04e8008e00d2000c0058000f001200a200030002000800970053005f00050029003900260007001900150038004600bc04e7005000bb004f004e005204e6002104e5004500370044004300420041003600350040003f002500340024000104e40033004804e3011b008800c0011400d7000d00010094005f003d000700100058006e01130102019200a4019101900101003c04e200ba04e1008a000300020016000f0012003b001d0053010c000500290039002600070019001500380046010a04e00050018f004f004e005204df002104de004500370044004300420041003600350040003f002500340024000104dd0033004804dc00ad01de000d0058003d00070010005f006e018e018d04db00ac04da002000dd04d904d801b904d7004904d60020018c04d504d401b2005804d300dd04d2018b04d104d0018b007000a300c20075004c04cf04ce000b010004cd000b00ff04cc000b005e0063010b019c000c04cb00a004ca04c904c804c704c604c504c404c304c204c104c0018e04bf006404be011904bd04bc0076000f007f001300b9000d00fe00a700fd007e00fc007e007d00fb00fa000d00f9003d018a007d04bb007d04ba04b901890078009f000d04b800e804b704b604b504b404b300f8018804b204b104b004af04ae04ad04ac007c04ab018704aa00c404a904a804a704a604a500180186000d04a4003d0139007d009e007d0185018400d504a304a2007f04a10135018304a0049f018200470181002000fb00fa000d018000f9003d018a049e049d0067049c004c049b017f017e01cf0189001300b9000d049a001f049901b10498049704960495002700c20494017d049304920491017c0490048f048e00180186000d017b00e8017a0179048d01790185017800d5048c048b007f048a048901830488048701b60047018100200078009f000d018000b4003d04860485010101eb004c017700f7007c00c4048404830187048204810480047f0078009f000d047e00b4003d047d047c00610176047b047a017d017c0175047900bf017401730172012904780078009f000d00b4003d0124006101760477047600f801880175047500bf0174017301720129007c047401710473009d0472007c009d01700171047100ae0470001300b9000d00fe00a700fd007e00fc007e007d001300b9000d007c009d0170012100fe00a700fd007e00fc007e007d046f016f046e00f6016f046d0020016e016d000d046c046b003d046a0469046800d600260467046600d6008b04650464006101d30088016c00a60463046200fb00fa000d00f9003d04610460045f0061045e045d045c045b045a0459045800f80457016b0456045504540453007c0452016a04510450044f007c0107044e0169044d044c00f60168017f016a044b0198044a0449010700200448044701690446044500f601680444044304420441019b00f70440043f043e043d017800f7043c043b007f005e007f043a013504390020043800c80437043604350182043400890433043200890020043100ae0047006d006e00a300ae0430042f004c01b50093006400f5042e042d005d00140167005c005b000c0032003100130030002f002e002d002c002b002a042c003e01bd042b0020042a042900db04280427009004260425005d001400f4005c005b000c0032003100130030002f002e002d002c002b002a0424003e01230423002004220194006800ab00960014005500220009000300020008001e001b00050001001a0006005704210420002000680014005500220009000300020008001e001b00050001001a019e041f00060056001800b8000300020016003c000f0012003b001d00a10060006c00bd0166016500590001001a0087010c00dc019200ce0018009e009d000e00a5000b000300020016003c000f0012003b001d001e0060041e00f3041d00590001001a0086007900560018006d000b00030002001601c700230032003100130030002f002e002d002c002b002a041c003e01ac041b01cc000b0016003c000f0012003b001d00a10060006c00bd0166010300590001001a041a0018005a0419000e0065041800da009d005e0063041700030002000800c600530005002900390026000700190015003800460416041500500414004f004e0052041300210412004500370044004300420041003600350040003f0025003400240001041100330048041000f5008800c001190108000d000100940058003d009800100067006e0076010200a300a6040f0137000e003c00dc013d040e00b70071000d001f00be01c201c101c0008701c3008400ce0018009e0072000e00a5000b000300020016003c000f0012003b001d001e0060006c00f3040d016500590001001a0086007900560018009e0072000e00a5000b000300020016040c0023040b00bf040a01db040900d00408003c0407040600ba04050087000300020016000f0012003b001d005300f200050029003900260007001900150038004600bc0404005000bb004f004e0052040300210402004500370044004300420041003600350040003f002500340024000104010033004800b7012c0071000d00a0001f00070010006d0400016403ff003a03fe03fd03fc004703fb03fa009c008000c703f9019903f8002103f703f603f5004703f403f3009c0080010303f203f103f0010503ef016303ee008903ed03ec03eb004703ea03e9009c006703e800a003e703e6016203e50092016100a60106000b010003e4000b00ff01ae03e30032003100130030002f002e002d002c002b002a03e2003e0018005a03e1000e0065006c00da0032003100130030002f002e002d002c002b002a03e0003e0087000300020016000f0012003b001d0053016000050029003900260007001900150038004600bc03df005000bb004f004e005203de002103dd004500370044004300420041003600350040003f002500340024000103dc0033004800b70071000d001f0007001003db0032003100130030002f002e002d002c002b002a03da003e03d903d803d703d603d5015f004703d403d3009c011a007f03d203d103d003cf03ce03cd01aa004703cc03cb009c03ca007f03c90161010003c8000b00ff03c7000b007000c203c60106000b005e0063010b00aa000c03c5015e03c4009500a8000b000900f2005103c300f1015d001503c200f0000f001200a20003000200080097005300f2000500290039002600f1015d0015003803c103c003bf005003be004f004e005203bd002103bc004500370044004300420041003600350040003f002500340024000103bb003303ba03b90071000d001f00f10010008a006403b8006a001100a0015c0064015b006a001100e0002703b70099002703b600f003b5006403b403b3006403b203b103b0008a03af03ae00df03ad03ac0197006d017e03ab012800a503aa03a903a8001703a7005803a6015a03a50047015903a4015800be03a3006f005803a2015a03a10047015903a0015800be039f006f039e0032003100130030002f002e002d002c002b002a039d003e0013007a004c0095010900a8000b0009006d0051039c008d000700190015039b005f000f001200a200030002000800970053006d000500290039002600070019001500380046010a039a0050018f004f004e0052039900210398004500370044004300420041003600350040003f00250034002400010397003300480396011b008800c0039500d7000d000100940058003d00070010005f006e00950102016400a4019101900101003c018c00ba03940087000300020016000f0012003b001d0053010400050029003900260007001900150038004600bc0393005000bb004f004e0052039200210391004500370044004300420041003600350040003f002500340024000103900033004800b70071000d001f000700100157038f038e038d005a038c038b0032003100130030002f002e002d002c002b002a038a003e0032003100130030002f002e002d002c002b002a0389003e0058006e0388038700ae0386005a0385000e0065038400da008a01dc011800ce0018009e01ad000e0160000b018d03830126017a008b03820126017b008b0003000200160381004900cf005e00630380010e037f037e0060006c00f3037d00590001001a011c037c037b015c001f004d005d001400e4005c005b000c0091037a037900a40378003a0377010503760375037400250373016203720371007e0370036f036e004d036d015600ef00ab0155001400b000220009000300020008001e001b0005000100ee000600f0006b00ef008100220009000300020008001e001b0005000100ee0006015400560018000b000300020016003c000f0012003b001d00a10060006c036c0163036b0059000100ee004d0054000c013e036a036900ab012c0014005500220009000300020008001e001b00050001009b000600270368015300a00014005500220009000300020008001e001b00050001009b000601540056036700ab015500140009000300020008001e001b00050001009b0157000601220156036601530081005500220009000300020008001e001b00050001009b0152036500060056001800b8000300020016003c000f0012003b001d00a10060006c00bd0364036300590001009b004d0054000c005d001400f4005c005b000c008c005701e20362019a0117004d013e03610360015b035f035e035d035c00ef00de00b3000900030002000800b200b100050001035b00b6008c0122035a0359035800ed0357035600ed0355035400ed035301bc035200ec00210351035001510150034f034e034d034c034b034a00c1034903480347015103460345015f0344034301ab034203410340033f014f033e033d033c033b033a0339033803370336033503340333033203310330032f032e032d032c032b032a0329032803270326032503240323032203210320031f031e031d00ec031c031b031a031900c103180317031603150314016e016d014e0313031203110310014d030f014d030e030d030c030b030a00ec0309030803070306030503040303030203010078009f014e030002ff02fe02fd02fc02fb02fa02f9017702f802f702f602f502f402f302f202f102f002ef02ee02ed02ec014f02eb02ea02e902e802e702e602e5015e02e402e30133015202e20133005602e1001302e00136000e000f001201c8003c000f0012003b001d001e006000db02df0059000102de004d005d001400f4005c005b000c005d001400e4005c005b000c0018005a02dd000e006502dc000e0092000b00d90091000e00030002001600aa000c00d80054000c005d00140167005c005b000c005d00140130005c005b000c02db001801ec02da02d902d802d702d6002502d502d401a002d300b802d202d100b8006b02d000a602cf02ce02cd014c02cc003d02cb003c00ba02ca007900e6008002c9003302c801dd02c7001802c600f5016b02c50108014c015002c400a702c302c2003802c102c002bf02be02bd004f004e02bc02bb002102ba02b9003701a802b8003501d8003602b702b601a501a402b5000300020016005e006302b4010e000f0012003b009702b3005902b2002402b102b002af008002ae02ad02ac003a014b0064001702ab02aa02a902a802a7018400170088016c008902a60017014b004d005d001400e4005c005b000c0018005a02a5000e006502a4000e0092000b00d90091000e00030002001600aa000c0054000c00d8000300020016000f001200c3001d003c000f0012003b001d010d001b0005000102a30006004d0054000c00b3000900030002000800b200b10005000102a20006004d00d802a10079004d00c7004d02a00079004d00c7004d029f0023000c000000000000000000eb004b029e00000000007b0000029d0000000000000000029c029b000000000000007b0000014a0000029a029902980297029602950294029302920000029100000000000000000290000000000000028f000a014900000000028e0000028d0000000000000000028c000000000000028b000000000000028a0000000000000289000000000000028800000000000002870000000000000286000000000000028500000000000002840000000000000283000000000000028200000000000002810000000000000280000000000000027f000000000000027e000000000000027d000000000000027c000000000000027b000000000000027a0000000000000279000000000000027800000000000002770000000000000276000000000000027500000000000002740000000000000273000000000000027200000000000002710000000000000270000000000000026f000000000000026e000000000000026d000000000000026c000000000000026b000000000000026a0000000000000269000000000000026800000000000002670000000000000266000000000000026500000000000002640000000000000263000000000000026200000000000002610000000000000260000000000000025f000000000000025e000000000000025d025c000000000000000000eb000a000a00000000025b0000000000000000025a0000000002590000000000000258000a00000000025700000256025502540253007b000001480000025202510250024f000000000000024e007b000000000000024d000000000000000000000000024c0000000001470000004b0146024b024a02490000000000000000000002480000004b024702460000000000000000000a0000000001450000024500000000000000000000024400000243024202410000007b0000014500000240023f023e023d023c023b023a023900000000014800000238014400000000004b00ea00e9023700000000023600000143000a000a0142000000000000014a000000000000023502340000000000000233000000000000023202310230022f022e022d022c022b022a0144000000000229000000000000004b022802270000000000000226000002250000000000000000000002240000000a000a000a0149000a000a000a01410000000000000223000a000a000a02220000000000000221007b000002200000021f021e021d021c00000000021b0000004b021a0219000002180000000000000000000002170000021600000000000000000000000002150214000000000000007b0000014700000213021202110210004b0140020f013f004b0140020e013f004b020d00000000020c000000000000004b00ea00e9020b004b0146020a0000004b00ea00e902090208000000000000000a000a000a000a000a000a000a0207000a000a000a02060000000000000205000a000a000a014202040203020202010000000002000000004b01ff01fe000000000000000001fd00eb000a0141000001fc01fb01fa01f901f801f701f601f501f40000000000000143000a000a000a004b01f301f201f101f001ef01ee01ed000000000000000000000000000000000000000000000000000000000000", + "logIndex": 2, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002270000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e8f8f8f172cb6fb0485c9183d454a0349026c16374e33b32efb8f3ebbb2edee13", + "logIndex": 4, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x8f8f8f172cb6fb0485c9183d454a0349026c16374e33b32efb8f3ebbb2edee13" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000284202f30000000000000000000001b101008041000001b10010009c000000000101043b0000000100200190000006190000c13d000000c0011002100000000001000414000001b9011001c706c006bb0000040f000006190000613d0000801002000039000000200010043f000006c2000104300000000000320435000000000010043f000000000101041a000001b102008041000001b10020009c00000004010000290000000000210435000000000001004b000006190000213d000000000002004b000006190000413d000000800010043f0000000002000416ffffffffffffffff000000000112019f00000008010000390000002001000039000001bc01000041000006c10001042e4d61676963737761000000c40010043f000000000021041b0000800d02000039000001b401100197000000400100043d000000020200002900000040011002100000000002000414000000000100041a000000000020043f0000000001000416000000000001042d000000c0022002100000000001000019000000a40010043f000000840010043f0000000402100039000000000201041a000000e40010043f000000000202041a000000240210003900000044021000390000000401100370000000240030008c06c006b60000040f000001b40010009c000001b6011001c7000001b40020009c000000000202043b0000000402100370000001b502200197000400000001001d000002bf0000c13d02000000000000000000000501000039000000700000213d0000000000130435000001f501000041000013890030008c000000000021004b0000002401100370000005a80000013d000000030300003900000002030000390000002002100039000200000003001d00000003030000290000000103000039000000040200002900000003010000390000000002000019000001040010043f000000c00010043f00000003020000290000000002000411000000000003004b00000001010000390000000000120435000000400020043f0000069e0000613d000000400220021000000002030000290000000102000029000100000001001d00000001011000390000006002200210000000400010043f000000400200043d000001b103008041000001b10030009c000000400300043d000001b4022001970000020301000041000000440030008c0000ff0000200190000000ff0020019006c006a10000040f0000004002000039000000000301043b000300000003001d0000000002000039000000000302043b000400000002001d000000640030008c0000002003000039000001bc0200004100000064021000390000000304000029000000000031004b000001e7010000410000000401000039000001fa01000041000000040010043f000001f901000041000000000262019f000300000001001d000001b704000041000000000302041a00000001020000390000000003010019000000240000000000000020000000805f464545000000006565203e204d4158746f636f6c4665657056323a2070726f4545000000000000203e204d41585f46000000200000000000000000ffffffff0000000001040019000000000001042f000000000023041b000001f10010009c00000001010000290000000401300039000100000003001d000000240130003900000002010000290000000000540435000000000121019f00000003010000290000004401300039000000000232019f000006170000013d00000004011000390000046a0000613d000001bf040000410000000601006039000000020110c039000001bd011001c7000002cf0000013d000001ba040000410000000703000039000000000043041b0000000603000039000001120000013d000001fb01000041000001bb01000041000001e6011001c700000040012002100000026c0000413d000000000032001a00000000040000190000000701006039000000030110c039000001fd01000041000001240010043f000000a00010043f000000800020043f00000040013002100000000202000039000300000002001d0000002002000039000000010100c0390000000001000039000000000023004b000000010200c0390000004402100370000003550000c13d0000000003000411000000000014043506c0064d0000040f000001f20110009a0000000402000039000002760000013d000000c001200210000001b405100197000000000020041b0000000006000411000001b502100197000200000001001d000000000151019f00000000014101cf000000000141022f0000010004400089000000000545022f00000000054501cf0000000304400210000000000151034f000000000004004b000000000701034f000000000032041b000001b5033001970000000005000411000000000201043b0004000000000002fb1fa83c9c865498bf6dabcd278dba294ae85b441d953cd8c0934eab6d0c4ffaffffffffffffff00ffffffffffff00ffffffffffffffffe00000004000000080464545000000000065203e204d41585f6f746f636f6c46657056323a205f70726964000000000000697220696e76616c7056323a205f7061635e8281adb3321feca7c820e34e112df6160d083195007e34d0d465daa88a9079616c74696573467056323a205f726f7920696e76616c696e656669636961727056323a205f6265640000000000000092e6fe7bf246a4423d0e0b12b035777fb10fa647672355a43ca180d6c1ab216b585f464545000000466565203e204d417056323a205f6c70310b9cfb4ad476fef704e04596669f810b443835ac388283ceba5185d0d459a9000000c000000080000000840000008072000000000000006e6577206f776e656e6f7420746865206c6c657220697320537465703a2063614f776e61626c65320000006000000000000000a00000000000000084000000c000000040000000c000000064000000c04e487b7100000000ffffffffffffff7fb64bfe7fe36bd19b8e8600b4aa8c65c639ae7d344fd709f28a35acfbc15ff81a44445245535345534e544943414c5f417056323a20494445000000640000008053000000000000004f5f4144445245537056323a205a4552defde31afa28d0e9d9d315f0ad8355cd34a33ba9275ac5850d3648bd0f6ba80149b401801c942e657179ff4b55739a39c65182cbb028f60d75ca53043ea007e50000004400000000485cc955000000000200000200000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf2659b89c0d60f4f9f5762e1cd30555d1665431b1770c5bc0ddd3cda33511d41a8a5ffffffffffffff9f66830639b23b7f43d1698b06c2ef3301d7e17535f16c21e9010004df694643e2ffffffffffffff3f525f4558495354537056323a20504149d8c362d765e22700fa1faef420bfe791c7c124b9cd0de2d338d16b8cac22d99f000000001e3dd18b00000000118b48e500000000574f2ba3000000004cc25b88000000003e158b91000000003e158b9000000000715018a6000000006d771c54000000006d587a3d000000008da5cb5b000000008c2328380000000079ba50970000000079ba5096000000006d587a3c000000009af608c9000000009585b0be00000000bc063e1a00000000b8f54210000000009d836a6e000000009d836a6d00000000ceb80df200000000c9c6539600000000c97682f800000000f2fde38b00000000e6a4390500000000e30c397800000000e30c397700000000c97682f7000000009585b0bd7056323a206c70460000008400000000202b206c7046656545464943494152597056323a2042454e000000400000010000000002000000003769bd2c87b58c034e221458de6fdf3fd9f22c4ee0800bee867c1344c5717824000000640000000008c379a0000000006865206f776e65726973206e6f7420742063616c6c6572204f776e61626c653a497267abadf235b730a30a016f339945b48c2695a2ae37f4ddf8083b554655870000004000000000ffffffffffffffbfe3b4186f6b6457e019497f9722a3daaf1344cd1fd0a4f2848be0079c53165914ffffffff0000000000000000ffffffe000000001ffffffe0000006c000000432000006be00210423000006b900210421000006b40000613d00000000030000190000069c0000213d00000001030000290000069b0000a13d000000000312004b00001388024000890000069b0000013d0000138804000039000006680000413d000013880010008c0000064b0000613d00000060016002100000000005030433000006370000613d000001b106600197000006250000c13d000000000038004b0000000008980436000000007907043c0000000008020019000006290000613d0000000003520019000001b3056001980000001f0460018f0000006006200270000000000201001900000004050000290000020704000041000000000031041b00000003022001af0000001802000039000001e802000041000000210300003900000209030000410000020803000041000005e30000c13d000000030000006b000001c00100004100000120000004430000010000100443000001be011001c7000000000424019f000001b504400197000000000403041a000001fc011001c7000000e00010043f000000c00020043f000000000013041b00000004060000290000000305000029000001f3040000410000002003200039000000000103041a000000040300003900000001021000390000057a0000c13d000000000030043f00000002022001af0000061c0000613d000001f0011001c70000050b0000613d000000040020008c000001ef010000410000061b0000613d0000800202000039000001ee011001c700000004001004430000000000100443000001ed01000041000201b40010019b000004e00000613d000200000000001d0000800602000039000000c0023002100000004001700210000001b107008041000001b10070009c000000240460003900000060050000390000006404600039000000840520008a000000840460003900000000004704350000000107000029000001ec0400004100000000030004140000000002060433000000020600002900000060011002100000000001010433000000400030043f0000006003100039000001eb0010009c000000000031043500000028030000390000000000340435000000340410003900000060033002100000000403000029000000600310021000000000011304360000008401000039000001ea02000041000000c001300039000001e90030009c000005d30000c13d000001b400100198000400000003001d0000001a030000390000020d03000041000005c70000c13d0000020c04000041000002130220019700000002011000390000020504000041000001000220c1bf00000212022001970000000301100039000001c201000041000001c3010000410000002a010000390000059a0000413d000000000321001900000200011001c7000000000313019f000002650000013d000000000401a019000000000041004b0000000204000029000200000004001d000002620000a13d000000000412004b0000138802300089000001f4010000410000001901000039000004710000c13d00000000020180190000000003022019000001bb030000410000001803000039000001c103000041000005ad0000c13d000001b402100198000000000023043500000000020204330000000003410436000000000053041b000001c5010000410000001c01000039000003b60000413d000013890010008c0000002a03000039000001c303000041000001c203000041000003300000413d00000000034500190000020201000041000002010100004100000029010000390000000002120049000002f40000413d000000000035004b00000001055000390000000002620436000001b40660019700000000460404340000000005000019000000a004000039000002fa0000613d000000c002400039000000800300043d000000a0024000390000008001400039000001f80040009c0000021104100197000000410160008a000002de0000413d000000000014004b000000010440003900000001033000390000000005560436000000000503041a0000000006050019000001f703000041000000a00500003900000032010000390000035f0000013d0000001c03000039000001c503000041000003180000413d000013890050008c000001c1010000410000001801000039000003a70000c13d000000000032004b000000000200041a00000210010000410000000602000039000000070100003906c0063d0000040f0000001101000039000002930000c13d000000010020008c0000000102004039000000000142001900000000023200190000138803000039000003740000a13d000013870010008c0000030c0000c13d000000000063004b000001b403200197000001c601000041000001c7010000410000002201000039000003240000413d000013890020008c000003030000c13d000000000043004b0000000004000411000001b403300197000000000300041a000000c002000039000001fe011001c700000080013000390000004001300039000000200230003900000000002404350000006004300039000200000002001d000000200040043f0000000804000039000000000040043f000000040400002900000000010200190000020b010000410000020a010000410000002401000039000004580000413d000000440110037000000024021003700000020f010000410000020e0100004100000023010000390000040f0000413d000001f601000041000003650000c13d000000000012004b000001b40030009c0000000002030019000002ea0000013d0000000004020019000000a001000039000002db0000c13d000000000102041a0000020401000041000001200010043f000001000010043f000000e00030043f000000c00040043f000000a00050043f000000000505041a0000000105100039000000000404041a0000000204100039000000000303041a000000030310003900000206010000410000001d01000039000003c50000413d000001c4011001c70000002203000039000001c703000041000001c603000041000002c80000413d000013890040008c0000000000520435000000020500002900000000024104360000004002100039000001ff011001c70000004001400210000001b104008041000001b10040009c000000400240003900000000002504350000002005400039000000400400043d000001d60020009c000002a50000613d000001d50020009c000002d50000813d000001e40020009c0000029a0000613d000001e30020009c000001e504000041000000000051004b000001b40060009c000000000601043b000001cd0020009c0000027b0000613d000001cc0020009c000002720000613d000001cb0020009c000002770000013d000001db0020009c000002400000613d000001da0020009c000002270000613d000001d90020009c0000138801000039000001d40020009c000002070000613d000001d30020009c000001da0000613d000001d20020009c000000e30000a13d000001d10020009c000001e20020009c000001b60000613d000001e10020009c0000018f0000613d000001e00020009c000000d10000a13d000001df0020009c0000000201000039000001d00020009c000001760000613d000001cf0020009c000001690000613d000001ce0020009c000000af0000213d000001ca0020009c000000950000a13d000001c90020009c0000004101000039000000fc0000a13d000001b80010009c000000800100043d000000a00100043d000000c00100043d000000600030008c00000000050204330000004e0000613d0000003d0000c13d000000000026004b0000000006860436000000007807043c0000008006000039000000410000613d0000008002500039000001b3053001980000001f0430018f0000008002200039000001b2022001970000001f023000390000000006000019000000000010041b000001b501100197000000000052004b000001b402100197000001de0020009c000001420000613d000001dd0020009c0000011d0000613d000001dc0020009c000000a40000213d000001d80020009c000000850000a13d000001d70020009c000000760000213d000001c80020009c000000e002200270000000040030008c0000008002000039000000300000c13d000001b103300197000000600330027000dc008502f202f1000402f002ef005c02ee001800db02ed02ec02eb02ea02e902e802e702e602e502e402e302e20005002c00150005002a02e100da02e000420084008300d900d802df02de0007000200010006003c0024004c008202dd004b001a0017000502dc02db02da005c02d902d802d702d602d500d702d402d302d202d100d602d000d500d402cf00d300d2000300d100d000cf00ce005b02ce001802cd0041003b001602cc00cd02cb0081005a003300400023002a00cc00cb008000ca002900c90012001100c8003c0024004c0082003a0004000a002602ca02c9007f000f02c8007e007d000d02c702c602c502c402c302c202c102c002bf0005002c0015000502be00c702bd02bc02bb02ba02b902b802b70005002c00150005007c00100019007b002002b602b502b402b302b202b102b00005002c0015000502af0019007b002002ae02ad02ac02ab02aa0005002c00150005002a02a902a802a702a602a502a4000500390018001a00170005003802a302a20016002a002500da02a10042005a00330040008000230007000200010006003c0024004c02a0004b029f029e029d000500390018001a001700050038000300c60083007a029c002b00c500c7029b029a0299000500390018001a0017000500380003003b001600c40298029702960295000e00c3029402930292029100200290005c0079028f028e028d002a002500c2007a00c10026028c028b0078028a000e00370289000e00360288000e0077001400320076000e0002000100280287000d00750018001a00170005003f003e0074003d001600c000730059007200bf007100be0005004a0070002a002500580049004200480286001f0019001e003102850030028400220047000d00390018001a0017000500380003003b0016000f001d000c006f002f006e003200350283028202810280027f027e001000250019027d027c027b006d00bd00bc027a006c00bd00bc027902780020002c0015000500c602770019002b00bb00150276027502740273006b0018001a00170005003f0073027202710016004a0003003b00160270026f001f0019001e00310030026e00220047000d00750018001a00170005003f003e0074003d001600c000730059007200bf007100be0005004a0070002a00250058004900420048026d001f0019001e0031026c0030026b0022026a0034006a000d00750018001a00170005003f003e0074003d00160269003e00ba003d001602680070002a002500580049004200480267001f0019001e0031026600300265002202640034006a000d00390018001a00170005003800db0263003d0016004100c4026202610260025f0041025e0071006f002f006e001000b9003500690068025d025c0025025b005b025a00270014025900570014001300460067006600b802580020006b0018001a001700050257005c003f003e00b7004a000300b60256025502540253025202510250001f0056001e0022024f0034024e0055024d00b500b4000d002c00150005005a0033024c00cb024b024a00400023002a00cc008000ca002900c90012001100c8003c0024004c0082004b00390018001a00170005003800030041003b00160013000f001d000c00070002000100060008000b00090004000a000300320035006c00b300b20010024902480247005400b100b000af0246024500490072024402430242007f000f0241007e007d000d002c00150005005a001000250019007b0020006b0018001a00170005003f003e003d0016004a00030041003b0016002b0053000c006f002f006e00520240001000250065005b0012001100ae00ad0020002c00150005023f0010023e003500b700b6023d002000390018001a0017000500380003003b0016023c006900c2023b00420015023a001f0019001e003102390030023800220047000d001f0019001e0031003000ac00220047000d0237023600370235000e00360234000e00770014003200760233007f000f0232007e007d000d0231023000b1022f022e022d022c022b022a0229022802270226004502250064001402240223000e0222005902210220021f021e021d021c021b021a02190218001200110063000200010028001c0020001f0056001e0022003400ac005500ab000d001f0019001e0031021700300216002202150034006a000d02140048021300780212000e00370211000e0036021000aa020f020e001f0056001e0022020d0034020c005500ab000d00a900a800a7020b020a02090208000200010028002900120011002e001c00080024005100a6003a0004000a002a00250058004900c1001302070026020600370205000e0036020400a5002600370203000e0077001400360076000e0032000e00020001002800a4000d00850202020100170200001f0019001e003101ff003001fe00220047000d00810013000f001d000c00070002000100060008000b00090004000a005001fd00030062001001fc01fb01fa00610013000f001d000c00070002000100060008000b00090004000a000300320035006d00a300a2001001f901f801f70050006000b000af01f600b9008300d901f500d80019000700020001000601f40024005100a1004b01f3004801f2001f0056001e002201f1003401f0005501ef00b500b4000d004f0013000f0044000c00070002000100060008000b00090004000a00030010001500a00013000f001d000c00070002000100060008000b00090004000a000301ee002700230013000f001d000c00070002000100060008000b00090004000a0003009f003301ed0050005901ec00230026004e000e00270014000200010028002900120011002e001c00080024004d01eb009e004f0013000f0044000c00070002000100060008000b00090004000a00030010001500a00013000f001d000c00070002000100060008000b00090004000a000301ea002700230013000f001d000c00070002000100060008000b00090004000a0003009f003301e90050009d00230026004e000e00270014000200010028002900120011002e001c00080024004d01e8009e004f0013000f0044000c00070002000100060008000b00090004000a00030010001501e70026003701e6000e003601e500a501e400ba002b0053000c00070002000100060008000b00090004000a00030052002b000c00070002000100060008000b00090004000a00680003001001e301e2004f01e10045005f01e00064009c01df001401de01dd0061009b01dc0026004e000e01db01da01d901d801d701d601d5004501d401d300120011005e01d20002000101d1009a002900120011002e001c003c000b00090004000a000301d001cf01ce01cd01cc01cb01ca01c9009901c801c7009901c600c301c501c401c3001200110063001c0067006601c2001c003c01c1003a000401c001bf000301be01bd01bc009801bb000700020001000601ba01b90009000401b800030015000a006800970052001401b7004600960095005700140007002701b601b5006000120011005e000200010006009a01b40027003a000401b300940093004500940064009b000f0053000c00070002000100060008000b00090004000a00030052002b000c00070002000100060008000b00090004000a00030033004001b200230013000f0053000c00070002000100060008000b00090004000a00030057002b000c00070002000100060008000b00090004000a000300330040005f009d002301b10044000c00070002000100060008000b00090004000a00030010001501b0007c00100093004501af01ae009200c50027002301ad0061002b0044000c00070002000100060008000b00090004000a000300600023007c0010006501ac00460098005b0012001100ae002900120011002e001c00080024004c01ab01aa01a9003a0004000a00260027001400020001002800ad002000a9009200a701a801a701a6000700020001000601a50024005100a6003a0004000a002f0020004d01a401a301a200a80014000200010028002900120011002e001c01a10024005100a1003a0004000a001e01a0019f019e0020019d019c00260078019b000e0037019a000e0036019900aa009c01980014009701970014001f0046009500bb00140067006600b800a4000d0013000f001d000c00070002000100060008000b00090004000a000300330040019600230013000f001d000c00070002000100060008000b00090004000a00030062005f01950026004e000e00570014000200010028002900120011002e001c00080024004d01940193004b002f000d0091019201910190018f0065018e018d00d7018c018b018a01890188018700d6018600d500d4018500d300d2000300d100d000cf00ce0046018400120011005e001c000d0069002b000c00070002000100060008000b0009000401830003002d002f000d00dc00250041000f001d000c00070002000100060008000b00090004005d000300320035006c00b300b200100182018101800054017f00810013000f001d000c00070002000100060008000b00090004005d0079017e000300620010017d017c009600cd0013000f001d000c00070002000100060008000b00090004005d000300320035006d007900a300a20027017b0010007a017a00850090002d01790090002d002f000d0091000200010028001200110063001c002900120011002e001c003c000b0009000401780003002d002f000d01770084002d0054002d01760084002d0054002d01750020000d0000000000000000008f000000000000017400000000000001730000008f001b001b001b017200000000004300000000000001710170016f016e000000000000016d00430000016c0000016b016a0169016801670166016501640163000000000000000000000162000000430000008e000001610160015f015e015d0000015c00000021015b015a0000008d008c000000000021008b008a015900000000015800000021015700890088008c0000000000000021008b008a008d0000000000000156000000000000015500000000000001540000000000000153000000000000015200000000000001510000000000000150000000000000014f000000000000014e000000000000014d000000000000014c000000000000014b000000000000014a0000000000000149000000000000014800000000000001470000000000000146000000000000014500000000000001440000000000000143000000000000014200000000000001410000000000000140000000000000013f000000000000013e000000000000013d000000000000013c000000000000013b000000000000013a013901380137013600000000008e0000000000000087000000210135013400000000000000000133013201310130012f000000000000012e012d012c012b012a0129012801270126012500000086000001240000000000000000000001230000000000000000001b012201210120011f011e011d011c011b0021011a01190118000000000117000000210116011501140113011201110110000000000000010f010e000000000000000000000086000000000000010d000000430000010c000000000000010b000000000000010a0000000000000109000000430000008700000108010701060105010401030000000000000000010200000000000001010000010000ff00fe00fd002100fc00fb00fa00f900f800f700f600f5000000000000002100f400f300f2002100f100f00089008800000000000000ef00ee00ed00ec002100eb00ea00e9002100e800e700e600e50000000000000000000000e40000001b001b001b00e3001b001b001b00e2001b001b001b00e100e000df00de00dd000000000000000000000000000000000000000000000000000000000000", + "logIndex": 5, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x01000215c679199dcb92c87dfc356cf6aa5198d06dcdd9b73412e2d32c2b0bd0", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 6, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x01e0ed991fF21f4366eEDd04A968029Bd6F8C61c", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3" + ], + "data": "0x", + "logIndex": 7, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x01e0ed991fF21f4366eEDd04A968029Bd6F8C61c", + "topics": [ + "0xddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b7" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e", + "logIndex": 8, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x01e0ed991fF21f4366eEDd04A968029Bd6F8C61c", + "topics": [ + "0x867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c03" + ], + "data": "0x000000000000000000000000a65d67513328445b4a4d2f498624483c2601dda4", + "logIndex": 9, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3", + "0x01000215c679199dcb92c87dfc356cf6aa5198d06dcdd9b73412e2d32c2b0bd0", + "0x00000000000000000000000001e0ed991ff21f4366eedd04a968029bd6f8c61c" + ], + "data": "0x", + "logIndex": 10, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + }, + { + "transactionIndex": 0, + "blockNumber": 692835, + "transactionHash": "0x803f5d837172466bded29310d13daa803af33bf56b8019c222c6667013599d1f", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000039c6bf2f2360e993a5ed8e1a30edc01001af64f3" + ], + "data": "0x00000000000000000000000000000000000000000000000011ef60221270ff2c", + "logIndex": 11, + "blockHash": "0x898694052d1a0cd8d61dcbe1a4b8d2ba4b43cb98a03a0c7844c90a55d7ea3972" + } + ], + "blockNumber": 692835, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [ + "30", + "30", + "0xA65d67513328445B4A4D2F498624483c2601ddA4" + ], + "numDeployments": 3, + "solcInputHash": "add2d99d454de06c8434504df96c7cdf", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_defaultProtocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_defaultLpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_protocolFeeBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "fees", + "type": "tuple" + } + ], + "name": "DefaultFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "LpFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "PairCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "ProtocolFeeBeneficiarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "ProtocolFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + } + ], + "name": "RoyaltiesFeesSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "allPairs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairs", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairsLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + } + ], + "name": "createPair", + "outputs": [ + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "defaultFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFees", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFeesAndRecipients", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "protocolBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getPair", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getTotalFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "pairFees", + "outputs": [ + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "protocolFeeOverride", + "type": "bool" + }, + { + "internalType": "bool", + "name": "lpFeeOverride", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeBeneficiary", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "_fees", + "type": "tuple" + } + ], + "name": "setDefaultFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setLpFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_protocolFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setProtocolFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + } + ], + "name": "setProtocolFeeBeneficiary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_royaltiesFee", + "type": "uint256" + } + ], + "name": "setRoyaltiesFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "getFees(address)": { + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getFeesAndRecipients(address)": { + "details": "Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied by priority: 1. lp fee 2. royalties 3. protocol fee If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then effective fees will be allocated acording to the fee priority up to MAX_FEE value. In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.", + "params": { + "pair": "address of pair for which to calculate fees and beneficiaries" + }, + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolBeneficiary": "address that gets protocol fees", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesBeneficiary": "address that gets royalties", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getTotalFee(address)": { + "details": "Fee is capped at MAX_FEE", + "params": { + "pair": "address of pair for which to calculate fees" + }, + "returns": { + "_0": "total fee amount denominated in basis points" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setDefaultFees((uint256,uint256))": { + "params": { + "fees": "struct with default fees" + } + }, + "setLpFee(address,uint256,bool)": { + "params": { + "lpFee": "amount of lp fee denominated in basis points", + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee" + } + }, + "setProtocolFee(address,uint256,bool)": { + "params": { + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee", + "protocolFee": "amount of protocol fee denominated in basis points" + } + }, + "setProtocolFeeBeneficiary(address)": { + "params": { + "_beneficiary": "address that gets protocol fees" + } + }, + "setRoyaltiesFee(address,address,uint256)": { + "params": { + "beneficiary": "address that gets royalties", + "pair": "address of pair for which to set fee", + "royaltiesFee": "amount of royalties fee denominated in basis points" + } + }, + "transferOwnership(address)": { + "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner." + } + }, + "stateVariables": { + "MAX_FEE": { + "details": "Fee is denominated in basis points so 5000 / 10000 = 50%" + }, + "protocolFeeBeneficiary": { + "return": "address that gets protocol fees", + "returns": { + "_0": "address that gets protocol fees" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getFees(address)": { + "notice": "Returns all fees for pair" + }, + "getFeesAndRecipients(address)": { + "notice": "Returns all fees for pair and beneficiaries" + }, + "getTotalFee(address)": { + "notice": "Returns total fee pair charges" + }, + "pairFees(address)": { + "notice": "Internal mapping to store fees for pair. It is exposed for advanced integrations and in most cases contracts should use fee getters." + }, + "setDefaultFees((uint256,uint256))": { + "notice": "Sets default fees for all pairs" + }, + "setLpFee(address,uint256,bool)": { + "notice": "Sets lp fee for pair" + }, + "setProtocolFee(address,uint256,bool)": { + "notice": "Sets protocol fee for pair" + }, + "setProtocolFeeBeneficiary(address)": { + "notice": "Sets protocol fee beneficiary" + }, + "setRoyaltiesFee(address,address,uint256)": { + "notice": "Sets royalties fee and beneficiary for pair" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/UniswapV2/core/UniswapV2Factory.sol": "UniswapV2Factory" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "keccak256": "0x706cf64058eb9a12b7757e2fddfc63cc754741d7f47a87b1b964b210de6ca499", + "license": "MIT", + "urls": [ + "bzz-raw://cbe9c54f97f57ca00ba6e7fb9ab5205959846d23e68700d97d3db5f7c2dbc7fc", + "dweb:/ipfs/QmYDT5x2wqPME2WfuHjy8D6M2Rx8xewTdmsKok2a1nnbnG" + ] + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "keccak256": "0xdd15427b6e71d8e88ad7580b0789b6f5ce7eeaf321bde7256a1550b76fc6552e", + "license": "MIT", + "urls": [ + "bzz-raw://243086f49d4d6a97ea8ce437b4020c1c9f23fff7ce495cebdfa2c68c1cb34edc", + "dweb:/ipfs/QmZMS4EPXLCmV2jhJTHgkRA1P8dkcfW2wa9hp3UDvnyNaL" + ] + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "keccak256": "0x01f995b855719954faacf2c400e98267faf03d8f4581d8d279c3ebb3c5cf4adc", + "license": "MIT", + "urls": [ + "bzz-raw://3584cd788fe138aa2fb9dd9fb79992a1766ec7b0bf8fedfeec44a94912347c4d", + "dweb:/ipfs/QmciMrWS1WY1hnDdzYxg2Kq4gf36ZoHJbCYwHgFL8js6EU" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "keccak256": "0xd8d0de3bc69be9bb5106a5d83f2d6ce2fb523d763b03f2986fce0d355fce6d2a", + "license": "MIT", + "urls": [ + "bzz-raw://bd591385f6f6f94f62c2b519663fa00933d8f2f7d462cea3145e896986e53564", + "dweb:/ipfs/QmRK4x93DxKuyDdgE5PAPWrJzVrQcnBGPiTdBhwKcXanZn" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "keccak256": "0x581635a3e35ab2ae2ce040810296921859b606e19a83f5277396f8b51cb548a1", + "license": "MIT", + "urls": [ + "bzz-raw://61e91d41aa083b0d41f1c30780efbc0259c0c717c122fc11b69ee249362b2330", + "dweb:/ipfs/QmdHsKrcno9mmXAj3zotSLQqX4K6BYFxxJuzxUBGAwVKzi" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "keccak256": "0xb96650151113d4a4224a66aba18c59560b6558375b7eda755abb73f5095c233f", + "license": "MIT", + "urls": [ + "bzz-raw://254aba5995bf05b6d8a1268a9bdbe7d02a86ff4f1cd32a4104977be7384d6c20", + "dweb:/ipfs/QmRNZX4Z8m7QkBvEEbAQhs85cM3wxQ6tNDpCjuoYipZ3zE" + ] + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "keccak256": "0xc0011e89f99cc2eb22b0e55fa22f8d681ee7e24138cd97f51122cb3abbea5802", + "license": "MIT", + "urls": [ + "bzz-raw://2938d2bc18e5c497946a1ade92bed65e0e05182cb66853d80e37eea728989bd0", + "dweb:/ipfs/QmNmjqe2caUNcPc3zRViVqPJnxox4FhVj4iCnyMf2YHs6r" + ] + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "keccak256": "0xc8075f02390b9bc257755e15590b56a51e2db779350bfbb5f50ab5b6ebf2e9cc", + "license": "MIT", + "urls": [ + "bzz-raw://34ea022d70255fce6141d5eca24f81096ca371dc4a3297ebe13dd89dc6d119c5", + "dweb:/ipfs/QmXWJuuwv3S8ePZdJUbifD33VqjGng1kkbXk2bzmFcPjez" + ] + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "keccak256": "0x0821c0bd0c22253889479dbfc9ff1f418675f7eee70c2643ac9ac66c99ab4608", + "license": "MIT", + "urls": [ + "bzz-raw://944437bde1a62d1a38debca71ec0ef5353ddcbfc7dd6369f87497b7c23b788e2", + "dweb:/ipfs/QmVRh9Y34Wbxmmaue8YnxycHDDenmgpe7jRiU9xcRFc8Hk" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673", + "license": "MIT", + "urls": [ + "bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2", + "dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "keccak256": "0x5c879356795cc563440408404a52eaf672d4547949e0a5920fb17642303d9e1b", + "license": "MIT", + "urls": [ + "bzz-raw://fb210cdef017f9813af368e17ea1573bc26094dd8dba8b5db8bec4cc90883d0a", + "dweb:/ipfs/QmdixQwckiNVVWHaJD9ps5ALWsHkZGRAePkuUPw1ZhhJhM" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", + "license": "MIT", + "urls": [ + "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", + "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0xc3ff3f5c4584e1d9a483ad7ced51ab64523201f4e3d3c65293e4ca8aeb77a961", + "license": "MIT", + "urls": [ + "bzz-raw://d7d3dd6067a994690471b5fc71b6f81fac3847798b37d404f74db00b4d3c3d0e", + "dweb:/ipfs/QmRHF1RarifjNi93RttouNPkYZGyu6CD926PgRDzD5iL35" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498", + "deployedBytecode": "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498", + "devdoc": { + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "getFees(address)": { + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getFeesAndRecipients(address)": { + "details": "Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied by priority: 1. lp fee 2. royalties 3. protocol fee If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then effective fees will be allocated acording to the fee priority up to MAX_FEE value. In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.", + "params": { + "pair": "address of pair for which to calculate fees and beneficiaries" + }, + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolBeneficiary": "address that gets protocol fees", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesBeneficiary": "address that gets royalties", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getTotalFee(address)": { + "details": "Fee is capped at MAX_FEE", + "params": { + "pair": "address of pair for which to calculate fees" + }, + "returns": { + "_0": "total fee amount denominated in basis points" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setDefaultFees((uint256,uint256))": { + "params": { + "fees": "struct with default fees" + } + }, + "setLpFee(address,uint256,bool)": { + "params": { + "lpFee": "amount of lp fee denominated in basis points", + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee" + } + }, + "setProtocolFee(address,uint256,bool)": { + "params": { + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee", + "protocolFee": "amount of protocol fee denominated in basis points" + } + }, + "setProtocolFeeBeneficiary(address)": { + "params": { + "_beneficiary": "address that gets protocol fees" + } + }, + "setRoyaltiesFee(address,address,uint256)": { + "params": { + "beneficiary": "address that gets royalties", + "pair": "address of pair for which to set fee", + "royaltiesFee": "amount of royalties fee denominated in basis points" + } + }, + "transferOwnership(address)": { + "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner." + } + }, + "stateVariables": { + "MAX_FEE": { + "details": "Fee is denominated in basis points so 5000 / 10000 = 50%" + }, + "protocolFeeBeneficiary": { + "return": "address that gets protocol fees", + "returns": { + "_0": "address that gets protocol fees" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getFees(address)": { + "notice": "Returns all fees for pair" + }, + "getFeesAndRecipients(address)": { + "notice": "Returns all fees for pair and beneficiaries" + }, + "getTotalFee(address)": { + "notice": "Returns total fee pair charges" + }, + "pairFees(address)": { + "notice": "Internal mapping to store fees for pair. It is exposed for advanced integrations and in most cases contracts should use fee getters." + }, + "setDefaultFees((uint256,uint256))": { + "notice": "Sets default fees for all pairs" + }, + "setLpFee(address,uint256,bool)": { + "notice": "Sets lp fee for pair" + }, + "setProtocolFee(address,uint256,bool)": { + "notice": "Sets protocol fee for pair" + }, + "setProtocolFeeBeneficiary(address)": { + "notice": "Sets protocol fee beneficiary" + }, + "setRoyaltiesFee(address,address,uint256)": { + "notice": "Sets royalties fee and beneficiary for pair" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 83799, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 83912, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 22756, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFeeBeneficiary", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 22762, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "getPair", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_mapping(t_address,t_address))" + }, + { + "astId": 22765, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_allPairs", + "offset": 0, + "slot": "4", + "type": "t_struct(AddressSet)90826_storage" + }, + { + "astId": 22768, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "defaultFees", + "offset": 0, + "slot": "6", + "type": "t_struct(DefaultFees)24697_storage" + }, + { + "astId": 22773, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "pairFees", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_struct(Fees)24715_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "base": "t_bytes32", + "encoding": "dynamic_array", + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_address,t_mapping(t_address,t_address))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => address))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_address)" + }, + "t_mapping(t_address,t_struct(Fees)24715_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct IUniswapV2Factory.Fees)", + "numberOfBytes": "32", + "value": "t_struct(Fees)24715_storage" + }, + "t_mapping(t_bytes32,t_uint256)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(AddressSet)90826_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "astId": 90825, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_inner", + "offset": 0, + "slot": "0", + "type": "t_struct(Set)90511_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(DefaultFees)24697_storage": { + "encoding": "inplace", + "label": "struct IUniswapV2Factory.DefaultFees", + "members": [ + { + "astId": 24693, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFee", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 24696, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "lpFee", + "offset": 0, + "slot": "1", + "type": "t_uint256" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Fees)24715_storage": { + "encoding": "inplace", + "label": "struct IUniswapV2Factory.Fees", + "members": [ + { + "astId": 24699, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "royaltiesBeneficiary", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 24702, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "royaltiesFee", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 24705, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFee", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 24708, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "lpFee", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 24711, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFeeOverride", + "offset": 0, + "slot": "4", + "type": "t_bool" + }, + { + "astId": 24714, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "lpFeeOverride", + "offset": 1, + "slot": "4", + "type": "t_bool" + } + ], + "numberOfBytes": "160" + }, + "t_struct(Set)90511_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.Set", + "members": [ + { + "astId": 90506, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_values", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 90510, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_indexes", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_uint256)" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + }, + "factoryDeps": [ + "0x00040000000000020010000000000002000000000301001900000060043002700000044e03400197000300000031035500020000000103550000044e0040019d0000008004000039000000400040043f0000000100200190000000340000c13d000000040030008c0000076d0000413d000000000201043b000000e0022002700000045b0020009c000000500000a13d0000045c0020009c000000b90000a13d0000045d0020009c000000cd0000a13d0000045e0020009c000001220000a13d0000045f0020009c0000036c0000613d000004600020009c0000023b0000613d000004610020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000003900000c13d0000000104000031000000200040008c0000002004008039000003b60000013d0000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000c01000039000000800010043f0000044f01000041000000a00010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000450011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000201043b000000400100043d000004510010009c0000005f0000413d000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000004740020009c000000aa0000213d000004800020009c000000f40000213d000004860020009c0000012c0000213d000004890020009c000002420000613d0000048a0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000a01000039000003530000013d001000000002001d0000004002100039000000400020043f00000001020000390000000001210436000004520200004100000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000121019f00000453011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000400300043d00000060023000390000000000120435000000400130003900000010020000290000000000210435001000000003001d00000020023000390000045401000041000f00000002001d00000000001204350000045501000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d000000000101043b0000001004000029000000a0024000390000000003000410000000000032043500000080024000390000000000120435000000a0010000390000000000140435000004570040009c0000004a0000213d000000c001400039000000400010043f00000000020404330000000f01000029113411080000040f0000000302000039000000000012041b00000458010000410000000102000039000000000021041b0000000601000039000000000201041a00000459022001970000000003000411000000000232019f000000000021041b0000002001000039000001000010044300000120000004430000045a01000041000011350001042e000004750020009c000000ff0000213d0000047b0020009c0000013c0000213d0000047e0020009c000002740000613d0000047f0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a0000001001100270000001ed0000013d000004690020009c0000010a0000213d0000046f0020009c000001880000213d000004720020009c000002fe0000613d000004730020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000048c0010009c0000076d0000213d000000000010043f00000001010000390000034f0000013d000004640020009c000001190000213d000004670020009c000001f10000613d000004680020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000801000039000000000101041a000f00000001001d0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000e00000002001d000003d70000c13d0000000104000031000000200040008c0000002004008039000003fd0000013d000004810020009c000001470000213d000004840020009c0000028d0000613d000004850020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000701000039000001fc0000013d000004760020009c0000017f0000213d000004790020009c0000029b0000613d0000047a0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000301000039000003530000013d0000046a0020009c000001e30000213d0000046d0020009c0000031f0000613d0000046e0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000802000039000000800020043f000004a002000041000002c00000013d000004650020009c000001f80000613d000004660020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000801000039000001fc0000013d000004620020009c000002010000613d000004630020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a000001ed0000013d000004870020009c000002b80000613d000004880020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d11340f850000040f0000049001100197000000800010043f0000049001200197000000a00010043f0000044e01300197000000c00010043f000004be01000041000011350001042e0000047c0020009c000002c90000613d0000047d0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000001201000039000000800010043f0000049101000041000011350001042e000004820020009c000002d00000613d000004830020009c0000076d0000c13d000000640030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b001000000002001d0000048c0020009c0000076d0000213d0000002402100370000000000202043b000f00000002001d0000048c0020009c0000076d0000213d0000004401100370000000000101043b000e00000001001d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000004cf0010009c000006f50000c13d00000010010000290000000f020000290000000e03000029000003630000013d000004770020009c000002d70000613d000004780020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000501000039000003530000013d000004700020009c000003440000613d000004710020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000049e0020009c0000076d0000213d0000002304200039000000000034004b0000076d0000813d0000000404200039000000000141034f000000000101043b001000000001001d0000049e0010009c0000076d0000213d00000024012000390000001002000029000f0005002002180000000f02100029000000000032004b0000076d0000213d000d00000002001d000e00000001001d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d0000000a02000039000000000202041a000400000002001d0000000b02000039000000000202041a000000000101043b000300000001001d0000000f010000290000003f01100039000004aa01100197000000400300043d0000000001130019000b00000003001d000000000031004b000000000300003900000001030040390000049e0010009c0000004a0000213d00000001003001900000004a0000c13d000000400010043f0000000b0100002900000010030000290000000001310436000a00000001001d000000000003004b0000000e050000290000000d06000029000001d90000613d00000002010003670000000b03000029000000000451034f000000000404043b000004ab0040009c0000076d0000813d000000200330003900000000004304350000002005500039000000000065004b000001d00000413d00000010012002700000ffff06100190000007e40000c13d000000400100043d0000004402100039000004ae030000410000000000320435000000240210003900000001030000390000022f0000013d0000046b0020009c000003570000613d0000046c0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a00000020011002700000ffff0110018f000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d000003e801000039000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d0000000601000039000000000101041a0000048c01100197000000800010043f0000049101000041000011350001042e000000e40030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b001000000002001d0000048c0020009c0000076d0000213d0000002402100370000000000202043b000f00000002001d0000048c0020009c0000076d0000213d0000006402100370000000000202043b000e00000002001d0000004402100370000000000202043b000d00000002001d0000008401100370000000000101043b000c00000001001d000000ff0010008c0000076d0000213d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d000000000101043b0000000e0010006b0000063c0000813d000000400100043d00000044021000390000049d0300004100000000003204350000002402100039000000140300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c70000113600010430000000000001042f0000000001000416000000000001004b0000076d0000c13d0000271001000039000000800010043f0000049101000041000011350001042e000000840030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000004402100370000000000202043b0000048c0020009c0000076d0000213d0000006404100370000000000404043b0000049e0040009c0000076d0000213d0000002305400039000000000035004b0000076d0000813d0000000405400039000000000551034f000000000505043b0000049e0050009c0000076d0000213d00000000045400190000002404400039000000000034004b0000076d0000213d0000045803000041000000000403041a000000010040008c000003860000c13d000000000003041b0000000403100370000000000303043b000000000003004b000007870000c13d0000002404100370000000000404043b000000000004004b000007870000c13d0000049b01000041000000800010043f0000002001000039000000840010043f0000002701000039000000a40010043f000004cd01000041000000c40010043f000004ce01000041000000e40010043f000004c1010000410000113600010430000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000fffe0010008c0000076d0000213d00000003011000c90000000e02100039000000000202041a0000000d03100039000000000303041a0000000c01100039000000000101041a0000044e01100197000000800010043f000000a00030043f000000ff002001900000000001000039000000010100c039000000c00010043f000004be01000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000301043b000000000100041111340ee80000040f000003640000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000ffff0010008c0000076d0000213d0000045802000041000000000302041a000000010030008c000003860000c13d000000000002041b0000000b03000039000000000403041a00000020024002700000ffff02200190000004290000c13d0000049b01000041000000800010043f0000002001000039000000840010043f0000000101000039000000a40010043f000004ae01000041000000c40010043f000004b40100004100001136000104300000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000c02000039000000800020043f0000044f02000041000000a00020043f000000800200003911340ed30000040f000000c00110008a0000044e0010009c0000044e010080410000006001100210000004a1011001c7000011350001042e0000000001000416000000000001004b0000076d0000c13d0000049401000041000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d000000000100041a000000800010043f0000049101000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000101043b0000048c0010009c0000076d0000213d0000000603000039000000000303041a0000048c033001970000000004000411000000000034004b000004540000c13d0000000703000039000000000403041a0000045904400197000000000424019f000000000043041b0000000803000039000000000403041a0000045904400197000000000114019f000000000013041b000004b501000041000000800010043f0000000001000414000000040020008c000005700000c13d0000000103000031000000200030008c00000020040000390000000004034019000005960000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000901000039000000000301041a0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000e00000003001d0000045e0000c13d0000000103000031000000200030008c00000020040000390000000004034019000004840000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000901000039000000000101041a000c00000001001d0000000801000039000000000101041a000e00000001001d0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000d00000002001d000004cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000004f20000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000048c0010009c0000076d0000213d000000000010043f0000000401000039000000200010043f00000040020000390000000001000019113411080000040f000000000101041a000000800010043f0000049101000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000301043b000000000100041111340f210000040f0000000101000039000000400200043d00000000001204350000044e0020009c0000044e0200804100000040012002100000049f011001c7000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d000000000020043f0000000201000039000000200010043f00000040020000390000000001000019113411080000040f0000001002000029000000000020043f000000200010043f00000000010000190000004002000039000003520000013d0000049b01000041000000800010043f0000002001000039000000840010043f0000001301000039000000a40010043f000004bf01000041000000c40010043f000004b40100004100001136000104300000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000800a000039000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000003a50000613d000000000801034f000000008908043c000000000a9a043600000000005a004b000003a10000c13d000000000006004b000003b20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000041d0000613d0000001f01400039000000600110018f00000080021001bf001000000002001d000000400020043f000000200040008c0000076d0000413d0000000802000039000000000202041a000000800300043d000f00000003001d0000048b030000410000001004000029000000000034043500000084031001bf0000000005000410000000000053043500000000030004140000048c02200197000000040020008c000005340000c13d0000000001140019000000400010043f000000100100002900000000020104330000000901000039000000000101041a0000049003100197000000700110027000000490041001970000000f0100002911340f8c0000040f0000044f0000013d0000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000003ec0000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000003e80000c13d000000000006004b000003f90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005640000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200040008c0000076d0000413d0000000901000039000000000101041a0000049001100197000000800200043d000000000312004b00000b3d0000413d0000000f01000029000f048c0010019b0000000e0100002900000010020000291134107c0000040f0000048b01000041000000400b00043d00000000001b04350000000401b000390000000002000410000000000021043500000000010004140000000f02000029000000040020008c000007310000c13d0000000103000031000000200030008c000000200400003900000000040340190000075f0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004240000c13d000007d10000013d000000000021004b00000000050200190000043a0000a13d00000000040200190000ffff0040008c00000b200000813d00000003054000c90000000c05500039000000000605041a000004b70660019700000001066001bf000000000065041b0000000104400039000000000014004b0000042d0000413d000000000403041a0000000005010019000004ba014001970000002004500210000004bb04400197000000000114019f000000000013041b0000ffff0150018f000000000012004b0000044f0000613d000000800020043f000000a00010043f00000000010004140000044e0010009c0000044e01008041000000c001100210000004bc011001c70000800d020000390000000103000039000004bd040000411134112a0000040f00000001002001900000076d0000613d00000001010000390000045802000041000000000012041b0000000001000019000011350001042e0000049b01000041000000800010043f0000002001000039000000840010043f0000001601000039000000a40010043f000004b301000041000000c40010043f000004b40100004100001136000104300000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000004730000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b0000046f0000c13d000000000006004b000004800000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005b80000613d0000001f01400039000000600110018f00000080021001bf000f00000002001d000000400020043f000000200030008c0000076d0000413d0000000802000039000000000202041a000000800300043d000d00000003001d0000048b030000410000000f04000029000000000034043500000084031001bf0000000005000410000000000053043500000000030004140000048c02200197000000040020008c000005dc0000c13d0000000001140019000000400010043f0000000e0500002900000490045001970000000d0340006b00000b3d0000413d000000700250027000000490022001970000000f050000290000000005050433000e00000002001d000c00000005001d000f00000025005300000b3d0000413d000b00000004001d000a00000003001d000000000300041a000000000003004b000008430000c13d0000000c030000290000000e0030006c0000000a040000290000000b0500002900000b3d0000613d0000000f024000b90000000d0050006b000004b70000613d00000000034200d90000000f0030006c00000b3d0000c13d0000000f032000fa000000000043004b000008d20000c13d000000040020008c00000b3d0000413d00000001032002700000000103300039000000000023004b00000b320000813d000000000003004b0000052e0000613d00000000043200d9000000000034001a00000b3d0000413d00000000043400190000000105400270000000000035004b00000000040300190000000003050019000004c00000413d00000b330000013d0000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000004e10000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000004dd0000c13d000000000006004b000004ee0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005c40000613d0000001f01400039000000600110018f00000080021001bf000f00000002001d000000400020043f000000200030008c0000076d0000413d0000000e020000290000048c02200197000000800300043d000e00000003001d0000048b030000410000000f05000029000000000035043500000084041001bf000000000300041000000000003404350000000003000414000000040020008c000b00000002001d0000060c0000c13d0000000001150019000000400010043f0000000f010000290000000001010433000f00000001001d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000200041a000a00000002001d000000000101043b000000000401041a0000000e03000029000000000003004b00000000020000190000052a0000613d00000000023400a9000000000004004b000005270000613d00000000014200d9000000000031004b00000b3d0000c13d00000000013200d9000000000041004b000008ce0000c13d000e00000004001d000900000002001d0000000a0000006b000008220000c13d000004b201000041000000000010043f0000001201000039000000040010043f0000048f0100004100001136000104300000044e0030009c0000044e03008041000000c0013002100000004003400210000000000131019f0000048f011001c71134112f0000040f000000100b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000054c0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005480000c13d000000000006004b000005590000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005d00000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c000003cd0000813d0000076d0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000056b0000c13d000007d10000013d0000044e0010009c0000044e01008041000000c001100210000004b6011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000005850000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000005810000c13d000000000006004b000005920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000006e90000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200030008c0000076d0000413d000000800200043d000000ff0020008c0000076d0000213d0000000503000039000000000023041b11340ec80000040f00000492010000411134111d0000040f0000044e011001970000000c02000039000000000302041a000004b703300197000000000113019f000000000012041b0000000d01000039000000000001041b0000000e02000039000000000302041a000004d00130019700000001011001bf000000000012041b0000000b01000039000000000201041a000004b802200197000004b9022001c7000000000021041b0000000001000019000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005bf0000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005cb0000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005d70000c13d000007d10000013d0000044e0030009c0000044e03008041000000c0013002100000004003400210000000000131019f0000048f011001c71134112f0000040f0000000f0b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000005f40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005f00000c13d000000000006004b000006010000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000076f0000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c0000049b0000813d0000076d0000013d0000044e0030009c0000044e03008041000000c0013002100000004003500210000000000131019f0000048f011001c71134112f0000040f0000000f0b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000006240000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000006200000c13d000000000006004b000006310000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000077b0000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c000005090000813d0000076d0000013d0000000301000039000000000101041a000b00000001001d0000001001000029000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000201043b000000000102041a000000010310003a00000b3d0000613d000000000032041b000000400400043d000000c0024000390000000e030000290000000000320435000000a002400039000000000012043500000080014000390000000d02000029000000000021043500000060014000390000000f020000290000000000210435000000400140003900000010020000290000000000210435000000c001000039000000000114043600000494020000410000000000210435000e00000004001d000004950040009c0000004a0000213d0000000e02000029000000e003200039000a00000003001d000000400030043f0000044e0010009c0000044e01008041000000400110021000000000020204330000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000e030000290000012202300039000000000012043500000100013000390000049702000041000000000021043500000102023000390000000b03000029000000000032043500000042020000390000000a030000290000000000230435000004980030009c0000004a0000213d0000000e020000290000016002200039000000400020043f0000044e0010009c0000044e0100804100000040011002100000000a0200002900000000020204330000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000076d0000613d0000000c02000029000000ff0220018f000000000101043b000000400300043d0000002004300039000000000024043500000000001304350000000201000367000000a402100370000000000202043b00000040043000390000000000240435000000c401100370000000000101043b000000600230003900000000001204350000044e0030009c0000044e030080410000004001300210000000000000043f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000499011001c700000001020000391134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000006cd0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000006c90000c13d000000000005004b000006da0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000000b430000613d000000000100043d0000048c0110019800000bd20000613d000000100010006c00000bd20000c13d00000010010000290000000f020000290000000d0300002911340ee80000040f0000000001000019000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006f00000c13d000007d10000013d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000d000e0010007400000b3d0000413d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000d02000029000000000021041b0000017b0000013d0000044e00b0009c0000044e0200004100000000020b401900000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c70000000f02000029000e0000000b001d1134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0b0000290000000e057000290000074e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000074a0000c13d000000000006004b0000075b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000007c60000613d0000001f01400039000000600210018f00000000040b00190000000001b20019000000000021004b000000000200003900000001020040390000049e0010009c0000004a0000213d00000001002001900000004a0000c13d000000400010043f000000200030008c000008380000813d000000000100001900001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007760000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007820000c13d000007d10000013d0000000904000039000000000404041a001004900040019b000000100030006c000007ba0000813d0000007004400270000f04900040019b0000002404100370000000000404043b0000000f0040006c000007ba0000813d0000000705000039000000000505041a000e048c0050019b0000000e0020006c000008e00000613d0000000805000039000000000505041a000c048c0050019b0000000c0020006c000008e00000613d000000000003004b000007a30000613d0000000e010000291134107c0000040f00000002010003670000002402100370000000000402043b000000000004004b000007aa0000613d0000004401100370000000000201043b0000000c0100002900000000030400191134107c0000040f000000400200043d0000048b010000410000000000120435000d00000002001d00000004012000390000000002000410000000000021043500000000010004140000000e02000029000000040020008c000008ea0000c13d0000000103000031000000200030008c00000020040000390000000004034019000009160000013d0000049b01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f000004a801000041000000c40010043f000004c001000041000000e40010043f000004c10100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007cd0000c13d000000000005004b000007de0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500000060013002100000044e0020009c0000044e020080410000004002200210000000000112019f00001136000104300000000b0100002900000000030104330000049e0030009c0000004a0000213d00000005013002100000003f04100039000004aa04400197000000400500043d0000000004450019000900000005001d000000000054004b000000000500003900000001050040390000049e0040009c0000004a0000213d00000001005001900000004a0000c13d001000000006001d000000400040043f000000090400002900000000053404360000001f0310018f000000000001004b000008040000613d0000000001150019000000000400003100000002044003670000000006050019000000004704043c0000000006760436000000000016004b000008000000c13d000000000003004b0000000b010000290000000001010433000000000001004b000000100f000029000009970000c13d000000400100043d000000200200003900000000022104360000000903000029000000000303043300000000003204350000004002100039000000000003004b000008190000613d0000000004000019000000005605043400000000026204360000000104400039000000000034004b000008140000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e0000000f0000006b000008680000c13d000000400100043d0000006402100039000004a70300004100000000003204350000004402100039000004a803000041000000000032043500000024021000390000002a0300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e010080410000004001100210000004a9011001c7000011360001043000000000010404330000000902000039000000000202041a00000070022002700000049002200197000000000321004b00000b3d0000413d0000000f0100002900000010020000291134107c0000040f0000044f0000013d0000000a0500002900000000025300a90000000b060000290000000d0060006b0000084b0000613d00000000045200d9000000000034004b00000b3d0000c13d00000000043200d9000000000054004b000008d20000c13d0000000b0000006b0000052e0000613d0000000f043000b90000000c060000290000000e0060006c000008570000613d0000000f054000fa000000000035004b00000b3d0000c13d00000000033400d90000000f0030006c000008d20000c13d0000000e0000006b0000000b010000290000052e0000613d00000000021200d90000000e014000fa000000000012004b0000000002018019000900000002001d000000090000006b00000b4f0000c13d000000400100043d0000006402100039000004b103000041000008270000013d0000000e030000290008000f003000bd000000000003004b0000000902000029000008700000613d00000008013000f90000000f0010006c00000b3d0000c13d0000000f0400002900000008014000f9000000000031004b000008ce0000c13d0000000a0020006b000008240000213d00000008020000290000000a0020006b000008240000213d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000f000e0010007400000b3d0000413d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000f02000029000000000021041b000000000100041a0000000e02000029000000000121004b00000b3d0000413d000000000010041b000000400100043d00000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500041000000000060000191134112a0000040f00000001002001900000076d0000613d00000009020000290000000a032000fa0000000802000029000e000a002001020000000d010000290000001002000029000a00000003001d1134107c0000040f0000000b0100002900000010020000290000000e030000291134107c0000040f0000048b01000041000000400200043d0000000000120435000f00000002001d00000004012000390000000002000410000000000021043500000000010004140000000d030000290000000002030019000000040030008c00000bd90000c13d0000000104000031000000200040008c000000200400803900000c040000013d000000400100043d0000004402100039000004a2030000410000022c0000013d0000049b02000041000000000021043500000004021001bf000000200300003900000000003204350000004402100039000004a203000041000000000032043500000024021000390000001403000039000000000032043500000040011002100000049c011001c700001136000104300000049b01000041000000800010043f0000002001000039000000840010043f0000001701000039000000a40010043f000004cc01000041000000c40010043f000004b40100004100001136000104300000000d020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c70000000e020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d05700029000009050000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b000009010000c13d000000000006004b000009120000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000b260000613d0000001f01400039000000600110018f0000000d04100029000000000014004b00000000020000390000000102004039000e00000004001d0000049e0040009c0000004a0000213d00000001002001900000004a0000c13d0000000e02000029000000400020043f000000200030008c0000076d0000413d0000000d020000290000000002020433000900000002001d0000048b020000410000000e04000029000000000024043500000004024000390000000004000410000000000042043500000000020004140000000c04000029000000040040008c000009600000613d0000000e010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c70000000c020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e057000290000094d0000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000009490000c13d000000000006004b0000095a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000bb20000613d0000001f01400039000000600110018f0000000e02100029000d00000002001d0000049e0020009c0000004a0000213d0000000d02000029000000400020043f000000200030008c0000076d0000413d0000000e020000290000000002020433000c00000002001d00000002020003670000000404200370000000000404043b000e00100040007300000b3d0000413d0000000e05000029000000090450006b0000000004004019000b00000004001d0000002402200370000000000202043b0008000f0020007300000b3d0000413d00000008040000290000000c0240006b0000000002004019000a00000002001d0000000d0200002900000004022000390000000e05000029000000090050006b00000c510000213d00000008050000290000000c0050006b00000c510000213d0000049b010000410000000d030000290000000000130435000000200100003900000000001204350000006401300039000004ca0200004100000000002104350000004401300039000004cb0200004100000000002104350000002401300039000000260200003900000000002104350000044e0030009c0000044e030080410000004001300210000004a9011001c700001136000104300000ffff0320018f00000003010000290000044e091001970001000100f000920000000101200039000800000003001d00000003023000c90007000e0020003d0006000d0020003d0005000c0020003d0002ffff0010019300000000030000190000000502300210000c00000002001d0000000a0120002900000000010104330000044e01100198000d00000003001d00000a070000613d0000000002190049000f00000002001d0000044e0020009c00000b3d0000213d000000400200043d000004ac0020009c0000004a0000213d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000400700043d000004ac0070009c0000004a0000213d0000006002700039000000400020043f000000400270003900000000000204350000000002070436000000000002043500000008030000290000ffff0030008c00000b200000613d000000400300043d000004ac0030009c0000004a0000213d0000006004300039000000400040043f0000000504000029000000000804041a0000044e0c8001970000000004c304360000000606000029000000000606041a00000000006404350000004006300039000000070a000029000000000a0a041a000000ff00a00190000000000a000039000000010a00c0390000000000a60435000000000019004b00000a450000413d00000000009c004b00000a450000213d0000000f0b0000290000000000bc004b00000a4e0000213d0000000001b8013f0000044e0010019800000aef0000613d000000400100043d000004ac0010009c0000004a0000213d0000006002100039000000400020043f0000004002100039000000000002043500000020021000390000000000020435000000000001043500000000010304330000044e011001970000000f061000690000044e0060009c00000b3d0000213d00000004016000b90000000002040433000000040000006b000009f70000613d00000004071000fa000000000067004b00000b3d0000c13d000000000012001a00000b3d0000413d000000400700043d000004ac0070009c0000004a0000213d00000000011200190000006002700039000000400020043f0000004002700039000000010600003900000000006204350000000f0200002900000000022704360000000000120435000000000c03043300000aef0000013d00000008010000290000ffff0010008c00000b200000613d000000400200043d000004ac0020009c0000004a0000213d0000006001200039000000400010043f0000000501000029000000000401041a0000044e01400197000000000312043600000040062000390000000601000029000000000101041a00000000001304350000000707000029000000000707041a000000ff007001900000000007000039000000010700c0390000000000760435000000030440014f0000044e0040019800000b130000613d000000400100043d000004ac0010009c0000004a0000213d0000006004100039000000400040043f0000004004100039000000000004043500000020041000390000000000040435000000000001043500000000010204330000044e0110019700000000041900490000044e0040009c00000b3d0000213d00000004014000b90000000002030433000000040000006b00000a360000613d00000004031000fa000000000043004b00000b3d0000c13d000000000012001a00000b3d0000413d000000400300043d000004ac0030009c0000004a0000213d00000000011200190000006002300039000000400020043f00000040023000390000000104000039000000000042043500000020023000390000000000120435000000000093043500000b130000013d000000000019004b0000000f0b00002900000000060b0019000004ab066081c700000000009c004b000000000a0c0019000004ab0aa0a1c700000000006a004b000009de0000a13d000000400300043d000004ac0030009c0000004a0000213d00000002e0f000f90000006002300039000000400020043f0000000304e000c90000000c02400039000000000202041a0000044e0220019700000000062304360000000d07400039000000000707041a000000000076043500000040033000390000000e04400039000000000404041a000000ff004001900000000004000039000000010400c039000000000043043500000a770000c13d000000400300043d000004ac0030009c0000004a0000213d0000006002300039000000400020043f0000000c02000039000000000202041a0000044e0220019700000000042304360000000d06000039000000000606041a000000000064043500000040033000390000000e04000039000000000404041a000000ff004001900000000004000039000000010400c0390000000000430435000000000019004b00000a7d0000413d000000000092004b00000a7d0000213d0000000f0300002900000a820000013d000000000019004b0000000f03000029000004ab033081c7000000000092004b000004ab0220a1c7000000000032004b00000cdb0000213d000000400200043d000004ac0020009c0000004a0000213d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000400200043d000004ac0020009c0000004a0000213d000000000019004b0000000f03000029000004ab033081c7000e00000003001d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000010be00029000000000deb001900000aa30000013d000000000e030019000000000deb00190000000000eb001a00000b3d0000413d000000400c00043d000004ac00c0009c0000004a0000213d000000010ad002700000006002c00039000000400020043f0000000020fa00d900000003022000c90000000c03200039000000000303041a0000044e0330019700000000043c04360000000d03200039000000000303041a00000000003404350000000e022000390000004003c00039000000000202041a000000ff002001900000000002000039000000010200c03900000000002304350000000103a0003900000a9f0000613d000000400700043d000004ac0070009c0000004a0000213d0000006002700039000000400020043f0000000020f300d900000003062000c90000000c02600039000000000202041a0000044e0820019700000000028704360000000d0f600039000000000f0f041a0000000000f204350000000e06600039000000400f700039000000000606041a000000ff006001900000000006000039000000010600c03900000000006f0435000000000c0c04330000044e06c00197000000000019004b00000ae10000413d000000000096004b00000ae10000213d0000000f0060006c00000ae50000213d000000000019004b000000100f00002900000aea0000413d000000000098004b00000aea0000213d0000000f0080006b000000000e03001900000aa00000213d00000aef0000013d000000000096004b000004ab0660a1c70000000e0060006c00000ad80000a13d0000000200d0008c000000100f00002900000b3d0000413d000000010ba0008a00000aa00000013d000000000098004b000004ab0880a1c70000000e0080006b000000000e03001900000aa00000213d0000044e01c001970000000f0a00002900000000031a004b00000af50000c13d000000000104043300000b130000013d00000000060704330000044e0860019700000000008a004b00000afb0000c13d000000000102043300000b130000013d00000000071800490000044e0070009c00000b3d0000213d0000044e0030009c00000b3d0000213d00000000060204330000000002040433000000000626004b00000b3d0000413d000000000018004b0000052e0000613d00000000047600d900000000083400a90000000001280019000000000067004b00000b0e0000a13d000000000021004b00000b130000813d00000b3d0000013d000000000021004b00000b3d0000413d00000000024800d9000000000032004b00000b3d0000c13d000000090200002900000000020204330000000d03000029000000000032004b00000b200000a13d0000000c02500029000000000012043500000001033000390000000b010000290000000001010433000000000013004b000009a30000413d0000080a0000013d000004b201000041000000000010043f0000003201000039000000040010043f0000048f0100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b2d0000c13d000007d10000013d0000000004020019000903e80040009400000b3d0000413d000003e802000039000000000020041b0000000103000039000000200030043f000004af03000041000000000403041a000004d10040009c00000bbe0000a13d000004b201000041000000000010043f0000001101000039000000040010043f0000048f0100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b4a0000c13d000007d10000013d000000000100041a000000090010002a00000b3d0000413d0000000901100029000000000010041b00000010010000290000048c01100197001000000001001d000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000201041a000800000002001d000000090020002a00000b3d0000413d0000001001000029000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d00000009030000290000000802300029000000000101043b000000000021041b000000400100043d00000000003104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500001900000010060000291134112a0000040f00000001002001900000076d0000613d0000000d010000290000000c020000290000000b030000290000000e0400002911340f8c0000040f000000400100043d00000020021000390000000f0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d0200003900000002030000390000000005000411000004b0040000411134112a0000040f00000001002001900000076d0000613d00000458010000410000000102000039000000000021041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e0100804100000040011002100000049f011001c7000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000bb90000c13d000007d10000013d000000000000043f000003e804400039000000000043041b0000000000210435000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500001900000000060000191134112a0000040f00000001002001900000076d0000613d000008620000013d000000400100043d00000044021000390000049a03000041000000000032043500000024021000390000001e030000390000022f0000013d0000000f030000290000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000048f011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000f0570002900000bf30000613d000000000801034f0000000f09000029000000008a08043c0000000009a90436000000000059004b00000bef0000c13d000000000006004b00000c000000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000ccf0000613d0000001f01400039000000600110018f0000000f03100029000000000013004b00000000020000390000000102004039000d00000003001d0000049e0030009c0000004a0000213d00000001002001900000004a0000c13d0000000d02000029000000400020043f000000200040008c0000076d0000413d0000000f020000290000000002020433000f00000002001d0000048b020000410000000d03000029000000000023043500000004023000390000000003000410000000000032043500000000020004140000000b03000029000000040030008c00000cee0000c13d0000000d011000290000049e0010009c0000004a0000213d000000400010043f0000000c010000290000049003100197000000700110027000000490041001970000000d0100002900000000020104330000000f0100002911340f8c0000040f000000400100043d00000020021000390000000e0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d0200003900000003030000390000000005000411000004a50400004100000010060000291134112a0000040f00000001002001900000076d0000613d00000458010000410000000102000039000000000021041b000000400100043d00000020021000390000000e0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e010080410000004001100210000004a6011001c7000011350001042e0000000604000039000000000404041a000004c2050000410000000d0600002900000000005604350000000005000410000000000052043500000000020004140000048c04400197000700000004001d000000040040008c00000c8b0000613d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c700000007020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000c780000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000c740000c13d000000000006004b00000c850000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000ce20000613d0000001f01400039000000600110018f0000000d01100029000300000001001d0000049e0010009c0000004a0000213d0000000301000029000000400010043f000000200030008c0000076d0000413d000000090200002900002710012000c90000000d040000290000000004040433000000000002004b00000c9c0000613d00000009021000fa000027100020008c00000b3d0000c13d000027100210011a000000090020006c00000d490000c13d000000000004004b000000000200001900000d2f0000c13d0000000c0600002900002710056000c9000000000006004b00000ca90000613d0000000c065000fa000027100060008c00000b3d0000c13d000027100650011a0000000c0060006c00000d490000c13d000000000004004b000000000600001900000d3c0000c13d00020000002100510001000000650053000000000400001900000cbd0000613d000000020500002900000001045000b9000000000021004b00000cba0000613d00000002014000fa000000010010006c00000b3d0000c13d00000001014000fa000000020010006c00000d490000c13d0000000f0200002900000010022000b900000003010000290000000401100039000004c3022000d1000000000024004b00000d5a0000813d0000049b0200004100000003030000290000000000230435000000200200003900000000002104350000004401300039000004c902000041000000000021043500000024013000390000000e0200003900000d540000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000cd60000c13d000007d10000013d000000400100043d0000004402100039000004ad030000410000000000320435000000240210003900000003030000390000022f0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000ce90000c13d000007d10000013d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c70000000b020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000d090000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000d050000c13d000000000006004b00000d160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000d230000613d0000001f01400039000000600110018f0000000d011000290000049e0010009c0000004a0000213d000000400010043f000000200030008c0000076d0000413d00000c240000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000d2a0000c13d000007d10000013d0000000b024000b90000000e06000029000000090060006b00000d360000a13d0000000b052000fa000000000045004b00000b3d0000c13d00000000054200d90000000b0050006c00000d490000c13d000000000012004b00000b3d0000213d00000ca20000013d0000000a064000b900000008080000290000000c0080006b00000d430000a13d0000000a076000fa000000000047004b00000b3d0000c13d00000000044600d90000000a0040006c00000d490000c13d000000000056004b00000b3d0000213d00000caf0000013d00000003030000290000004401300039000004a20200004100000000002104350000002401300039000000140200003900000000002104350000049b0100004100000000001304350000000401300039000000200200003900000000002104350000044e0030009c0000044e0300804100000040013002100000049c011001c70000113600010430000004c40200004100000003040000290000000002240436000e00000002001d0000000002000410000000000021043500000000010004140000000702000029000000040020008c00000d680000c13d000000a00030008c000000a004000039000000000403401900000d940000013d00000003020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c700000007020000291134112f0000040f000000000301001900000060033002700000044e03300197000000a00030008c000000a00400003900000000040340190000001f0640018f000000e007400190000000030570002900000d830000613d000000000801034f0000000309000029000000008a08043c0000000009a90436000000000059004b00000d7f0000c13d000000000006004b00000d900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000dde0000613d0000001f01400039000001e00110018f00000003011000290000049e0010009c0000004a0000213d000000400010043f000000a00030008c0000076d0000413d0000000e010000290000000001010433000500000001001d0000048c0010009c0000076d0000213d000000030100002900000060011000390000000001010433000400000001001d0000048c0010009c0000076d0000213d0000000801000039000000000101041a0008048c0010019b0000000701000039000000000101041a0009048c0010019b000000030200002900000080012000390000000001010433000600000001001d00000040012000390000000001010433000700000001001d000e00000000001d00000dbc0000013d0000000e010000290000000101100039000000ff0110018f000e00000001001d000000010010008c00000dea0000213d0000000e0000006b000000090200002900000008010000290000000001026019000c00000001001d0000000a0200002900000000010200190000000b01006029000d00000001001d000000000001004b00000db60000613d0000000d0200002900000007012000b900000000022100d9000000070020006c00000b3d0000c13d000027100010008c00000dd20000413d000027100310011a0000000c0100002900000005020000291134107c0000040f0000000d0200002900000006012000b900000000022100d9000000060020006c00000b3d0000c13d000027100010008c00000db60000413d000027100310011a0000000c0100002900000004020000291134107c0000040f00000db60000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000de50000c13d000007d10000013d000000400200043d0000048b010000410000000000120435000e00000002001d00000004012000390000000002000410000000000021043500000000010004140000000902000029000000040020008c00000dfa0000c13d0000000103000031000000200030008c0000002004000039000000000403401900000e260000013d0000000e020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c700000009020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900000e150000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00000e110000c13d000000000006004b00000e220000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000e7d0000613d0000001f01400039000000600110018f0000000e04100029000000000014004b00000000020000390000000102004039000d00000004001d0000049e0040009c0000004a0000213d00000001002001900000004a0000c13d0000000d02000029000000400020043f000000200030008c0000076d0000413d0000000e020000290000000002020433000e00000002001d0000048b020000410000000d04000029000000000024043500000004024000390000000004000410000000000042043500000000020004140000000804000029000000040040008c00000e700000613d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c700000008020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000e5d0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000e590000c13d000000000006004b00000e6a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000e890000613d0000001f01400039000000600110018f0000000d011000290000049e0010009c0000004a0000213d000000400010043f000000200030008c0000076d0000413d0000000202000029000027100220011a0000000e0020006b00000e950000813d0000004402100039000004c80300004100000e9d0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e840000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e900000c13d000007d10000013d0000000d0200002900000000020204330000000103000029000027100330011a000000000032004b00000ea10000813d0000004402100039000004c703000041000000000032043500000024021000390000001d030000390000022f0000013d0000000e0100002900000010030000290000000f0400002911340f8c0000040f000000400100043d00000020021000390000000a0300002900000000003204350000000b02000029000000000021043500000002020003670000000403200370000000000303043b000000400410003900000000003404350000002403200370000000000303043b000000600410003900000000003404350000044e0010009c0000044e0100804100000040011002100000004402200370000000000202043b00000000030004140000044e0030009c0000044e03008041000000c003300210000000000113019f000004c5011001c70000048c062001970000800d0200003900000003030000390000000005000411000004c6040000411134112a0000040f00000001002001900000076d0000613d0000044f0000013d000004d20010009c00000ecd0000813d0000006001100039000000400010043f000000000001042d000004b201000041000000000010043f0000004101000039000000040010043f0000048f01000041000011360001043000000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000ee20000613d000000000400001900000000054100190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000edb0000413d000000000321001900000000000304350000001f02200039000004d3022001970000000001210019000000000001042d0003000000000002000100000003001d000300000002001d0000048c01100197000200000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f1f0000613d000000000101043b00000003020000290000048c02200197000300000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f1f0000613d000000000101043b0000000102000029000000000021041b000000400100043d00000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004d404000041000000020500002900000003060000291134112a0000040f000000010020019000000f1f0000613d000000000001042d000000000100001900001136000104300004000000000002000400000003001d000200000002001d0000048c01100197000300000001001d000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d000000000101043b000000000101041a000100040010007400000f7f0000413d0000000301000029000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d000000000101043b0000000102000029000000000021041b00000002010000290000048c01100197000200000001001d000000000010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d0000000202000029000000000101043b000000000301041a000100000003001d000000040030002a00000f7f0000413d000000000020043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d00000004030000290000000102300029000000000101043b000000000021041b000000400100043d00000000003104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000030500002900000002060000291134112a0000040f000000010020019000000f7d0000613d000000000001042d00000000010000190000113600010430000004b201000041000000000010043f0000001101000039000000040010043f0000048f0100004100001136000104300000000901000039000000000201041a0000049001200197000000e00320027000000070022002700000049002200197000000000001042d0004000000000002000100000004001d000200000003001d000400000001001d000004900010009c0000105c0000213d000004d50020009c0000105c0000813d000300000002001d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000106d0000613d000000000201043b0000000901000039000000000301041a000000e00330027000000000033200490000044e00300198000010320000613d00000002030000290000049003300198000010320000613d00000001040000290000049004400198000010320000613d0000000505000039000000000605041a0000004d0060008c000010500000213d000000000006004b00000fc00000613d0000000a070000390000000105000039000000010060019000000000087700a9000000010700603900000000055700a90000000106600272000000000708001900000fb50000c13d000000000005004b00000fc60000613d00000000074500a900000fc20000013d0000000105000039000000000704001900000000055700d9000000000045004b00000fc70000613d000010500000013d000000000700001900000000083700d90000000a04000039000000000084041b0000000b04000039000000000904041a0000ffff0690018f0000ffff0060008c000010700000613d000000400a00043d000004d200a0009c000010560000813d00000010059002700000ffff0550018f000000600ba000390000004000b0043f000000030c6000c90000000c0bc00039000000000d0b041a0000044e0bd00197000000000bba04360000000d0ec00039000000000e0e041a0000000000eb0435000000400ea000390000000e0cc00039000000000c0c041a000000ff00c00190000000000c000039000000010c00c0390000000000ce0435000000000c2d013f0000044e00c001980000102c0000613d000000200c9002700000ffff0cc0018f00000000005c004b00000ff30000a13d000000010d50008a0000ffff00d0008c000010500000213d00000000006d004b000000000c05c01900000000050c001900000ff50000013d000000000005004b000010760000613d0000ffff0650018f00000001099000390000ffff0990018f00000000606900d9000000400c00043d000004ac00c0009c000010560000213d0000044e09200197000000600dc000390000004000d0043f000000400dc0003900000000000d0435000000200dc0003900000000000d043500000000000c0435000000000a0a04330000044e0aa00197000000000ca900490000044e00c0009c000010500000213d000000000a8c00a9000000000b0b0433000000000073004b000010100000213d00000000038a00d90000000000c3004b000010500000c13d0000000000ab001a000010500000413d000000400300043d000004ac0030009c000010560000213d0000000007ab00190000006008300039000000400080043f0000004008300039000000010a0000390000000000a8043500000020083000390000000000780435000000000093043500000003036000c90000000c08300039000000000a08041a000004b70aa0019700000000099a019f000000000098041b0000000d08300039000000000078041b0000000e03300039000000000803041a000004d00780019700000001077001bf000000000073041b000000000904041a0000001003500210000004d703300197000000000363019f000004b705900197000000000353019f000000000034041b000000e00220021000000003040000290000007003400210000004d803300197000000000232019f00000004030000290000049003300197000000000232019f000000000021041b0000049001400197000000400200043d0000002004200039000000000014043500000000003204350000044e0020009c0000044e02008041000000400120021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d020000390000000103000039000004d9040000411134112a0000040f00000001002001900000106e0000613d000000000001042d000004b201000041000000000010043f0000001101000039000000040010043f0000048f010000410000113600010430000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000000400100043d0000004402100039000004d60300004100000000003204350000002402100039000000150300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c70000113600010430000000000001042f00000000010000190000113600010430000004b201000041000000000010043f0000003201000039000000040010043f0000048f010000410000113600010430000004b201000041000000000010043f0000001201000039000000040010043f0000048f0100004100001136000104300000000004010019000000400100043d000004510010009c000010ee0000813d0000004005100039000000400050043f0000002005100039000004da06000041000000000065043500000019050000390000000000510435000000400500043d000000440150003900000000003104350000002001500039000004db0300004100000000003104350000048c022001970000002403500039000000000023043500000044020000390000000000250435000004980050009c000010ee0000213d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000010c60000c13d00000001020000390000000104000031000000000004004b000010da0000613d0000001f01400039000004d3011001970000003f01100039000004d303100197000000400100043d0000000003310019000000000013004b000000000600003900000001060040390000049e0030009c000010ee0000213d0000000100600190000010ee0000c13d000000400030043f0000000003410436000004d3054001980000001f0640018f00000000045300190000000307000367000010b80000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000010b40000c13d000000000006004b000010dc0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000010dc0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e030080410000006003300210000000000113019f0000044e0020009c0000044e02008041000000c002200210000000000121019f00000000020400191134112a0000040f000000010220018f000300000001035500000060011002700001044e0010019d0000044e04100197000000000004004b0000109e0000c13d00000060010000390000008003000039000000000002004b000010f40000613d0000000001010433000000000001004b000010ed0000613d000004dc0010009c000011050000213d0000001f0010008c000011050000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000011050000c13d000000000001004b000010f40000613d000000000001042d000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000000400100043d0000004402100039000004dd03000041000000000032043500000024021000390000001c0300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c7000011360001043000000000010000190000113600010430000000000001042f0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000111b0000613d000000000101043b000000000001042d00000000010000190000113600010430000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f0000000100200190000011290000613d000000000101043b000000000001042d000000000001042f0000112d002104210000000102000039000000000001042d0000000002000019000000000001042d00001132002104230000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff4d61676963737761702056320000000000000000000000000000000000000000020000000000000000000000000000000000000c000000a00000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc0310000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000010000000000000000000000008b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b0200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f0000000000000000000000000000000000000000000000000000000000030009ffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000006a62784100000000000000000000000000000000000000000000000000000000ba9a7a5500000000000000000000000000000000000000000000000000000000d505acce00000000000000000000000000000000000000000000000000000000dd62ed3d00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000e1f1c4a700000000000000000000000000000000000000000000000000000000fff6cae900000000000000000000000000000000000000000000000000000000d505accf00000000000000000000000000000000000000000000000000000000d6cf0c3700000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000d21220a700000000000000000000000000000000000000000000000000000000ba9a7a5600000000000000000000000000000000000000000000000000000000bc25cf770000000000000000000000000000000000000000000000000000000089afcb4300000000000000000000000000000000000000000000000000000000a9059cba00000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000aab5497c0000000000000000000000000000000000000000000000000000000089afcb440000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000007ecebdff000000000000000000000000000000000000000000000000000000007ecebe0000000000000000000000000000000000000000000000000000000000883bdbfd000000000000000000000000000000000000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000252c09d60000000000000000000000000000000000000000000000000000000032148f6600000000000000000000000000000000000000000000000000000000485cc95400000000000000000000000000000000000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000004f1a47080000000000000000000000000000000000000000000000000000000032148f67000000000000000000000000000000000000000000000000000000003644e5150000000000000000000000000000000000000000000000000000000030adf81e0000000000000000000000000000000000000000000000000000000030adf81f00000000000000000000000000000000000000000000000000000000313ce56700000000000000000000000000000000000000000000000000000000252c09d7000000000000000000000000000000000000000000000000000000002b8e066600000000000000000000000000000000000000000000000000000000095ea7b20000000000000000000000000000000000000000000000000000000018160ddc0000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000dfe16810000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000000000000000000000000000000000000902f1ac00000000000000000000000000000000000000000000000000000000022c0d9f00000000000000000000000000000000000000000000000000000000053f14da70a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000002400000080000000000000000000000000000000000000000000000000000000000000000000000000ffffffe00000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000800000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913202000000000000000000000000000000000000400000000000000000000000006e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9000000000000000000000000000000000000000000000000ffffffffffffff1f02000000000000000000000000000000000000000000000000000000000000001901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f00000000000000000000000000000000000000800000000000000000000000004d616769637377617056323a20494e56414c49445f5349474e4154555245000008c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000004d616769637377617056323a2045585049524544000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000200000000000000000000000004d414749432d56320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000000200000000000000000000000000000000000020000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d8193649600000000000000000000000000000000000000400000000000000000000000004954595f4255524e4544000000000000000000000000000000000000000000004d616769637377617056323a20494e53554646494349454e545f4c495155494400000000000000000000000000000000000000840000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000ffffffffffffff9f4f4c4400000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000a6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb494c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f4954595f4d494e544544000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000004d616769637377617056323a20464f5242494444454e000000000000000000000000000000000000000000000000000000000064000000800000000000000000313ce567000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000100010000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff0000000000000000000000000000000000000000000000000000ffff000000000200000000000000000000000000000000000040000000800000000000000000ac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a00000000000000000000000000000000000000600000008000000000000000004d616769637377617056323a204c4f434b454400000000000000000000000000495459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000008000000000000000008c232838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f5e1009d836a6e000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000080000000000000000000000000d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8224d616769637377617056323a2062616c616e63653141646a75737465640000004d616769637377617056323a2062616c616e63653041646a75737465640000004d616769637377617056323a204b000000000000000000000000000000000000414d4f554e5400000000000000000000000000000000000000000000000000004d616769637377617056323a20494e53554646494349454e545f494e5055545f4d616769637377617056323a20494e56414c49445f544f0000000000000000004d616769637377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e5400000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17000000000000000000000000000000000000000000000000ffffffffffffffa0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92500000000000000000000000000000000000100000000000000000000000000004d616769637377617056323a204f564552464c4f57000000000000000000000000000000000000000000000000000000000000000000000000000000ffff000000000000ffffffffffffffffffffffffffff00000000000000000000000000001c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad17472616e7366657228616464726573732c75696e743235362900000000000000a9059cbb000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4d616769637377617056323a205452414e534645525f4641494c4544000000000b016bb9e76d006b75e00547a1918c0594a277a401bf8a467e042cfd0f2efa9f", + "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498" + ] +} \ No newline at end of file diff --git a/deployments/treasureMainnet/solcInputs/add2d99d454de06c8434504df96c7cdf.json b/deployments/treasureMainnet/solcInputs/add2d99d454de06c8434504df96c7cdf.json new file mode 100644 index 0000000..83b85e2 --- /dev/null +++ b/deployments/treasureMainnet/solcInputs/add2d99d454de06c8434504df96c7cdf.json @@ -0,0 +1,355 @@ +{ + "language": "Solidity", + "sources": { + "contracts/Rewards/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\n/// @dev Adapted to pragma solidity 0.8 from https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/FullMath.sol\nlibrary FullMath {\n /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = a * b\n // Compute the product mod 2**256 and mod 2**256 - 1\n // then use the Chinese Remainder Theorem to reconstruct\n // the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2**256 + prod0\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(a, b, not(0))\n prod0 := mul(a, b)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division\n if (prod1 == 0) {\n require(denominator > 0);\n assembly {\n result := div(prod0, denominator)\n }\n return result;\n }\n\n // Make sure the result is less than 2**256.\n // Also prevents denominator == 0\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0]\n // Compute remainder using mulmod\n uint256 remainder;\n assembly {\n remainder := mulmod(a, b, denominator)\n }\n // Subtract 256 bit number from 512 bit number\n assembly {\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator\n // Compute largest power of two divisor of denominator.\n // Always >= 1.\n uint256 twos = (0 - denominator) & denominator;\n // Divide denominator by power of two\n assembly {\n denominator := div(denominator, twos)\n }\n\n // Divide [prod1 prod0] by the factors of two\n assembly {\n prod0 := div(prod0, twos)\n }\n // Shift in bits from prod1 into prod0. For this we need\n // to flip `twos` such that it is 2**256 / twos.\n // If twos is zero, then it becomes one\n assembly {\n twos := add(div(sub(0, twos), twos), 1)\n }\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2**256\n // Now that denominator is an odd number, it has an inverse\n // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n // Compute the inverse by starting with a seed that is correct\n // correct for four bits. That is, denominator * inv = 1 mod 2**4\n uint256 inv = (3 * denominator) ^ 2;\n // Now use Newton-Raphson iteration to improve the precision.\n // Thanks to Hensel's lifting lemma, this also works in modular\n // arithmetic, doubling the correct bits in each step.\n inv *= 2 - denominator * inv; // inverse mod 2**8\n inv *= 2 - denominator * inv; // inverse mod 2**16\n inv *= 2 - denominator * inv; // inverse mod 2**32\n inv *= 2 - denominator * inv; // inverse mod 2**64\n inv *= 2 - denominator * inv; // inverse mod 2**128\n inv *= 2 - denominator * inv; // inverse mod 2**256\n\n // Because the division is now exact we can divide by multiplying\n // with the modular inverse of denominator. This will give us the\n // correct result modulo 2**256. Since the precoditions guarantee\n // that the outcome is less than 2**256, this is the final result.\n // We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inv;\n return result;\n }\n }\n\n /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n result = mulDiv(a, b, denominator);\n if (mulmod(a, b, denominator) > 0) {\n require(result < type(uint256).max);\n result++;\n }\n }\n}\n" + }, + "contracts/Rewards/libraries/PackedUint144.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.0;\n\nlibrary PackedUint144 {\n uint256 private constant MAX_UINT24 = type(uint24).max;\n uint256 private constant MAX_UINT48 = type(uint48).max;\n uint256 private constant MAX_UINT72 = type(uint72).max;\n uint256 private constant MAX_UINT96 = type(uint96).max;\n uint256 private constant MAX_UINT120 = type(uint120).max;\n uint256 private constant MAX_UINT144 = type(uint144).max;\n\n error NonZero();\n error FullyPacked();\n\n function pushUint24Value(uint144 packedUint144, uint24 value) internal pure returns (uint144) {\n if (value == 0) revert NonZero(); // Not strictly necessairy for our use-case since value (incentiveId) can't be 0.\n if (packedUint144 > MAX_UINT120) revert FullyPacked();\n return (packedUint144 << 24) + value;\n }\n\n function countStoredUint24Values(uint144 packedUint144) internal pure returns (uint256) {\n if (packedUint144 == 0) return 0;\n if (packedUint144 <= MAX_UINT24) return 1;\n if (packedUint144 <= MAX_UINT48) return 2;\n if (packedUint144 <= MAX_UINT72) return 3;\n if (packedUint144 <= MAX_UINT96) return 4;\n if (packedUint144 <= MAX_UINT120) return 5;\n return 6;\n }\n\n function getUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint24) {\n return uint24(packedUint144 >> (i * 24));\n }\n\n function removeUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint144) {\n if (i > 5) return packedUint144;\n uint256 rightMask = MAX_UINT144 >> (24 * (6 - i));\n uint256 leftMask = (~rightMask) << 24;\n uint256 left = packedUint144 & leftMask;\n uint256 right = packedUint144 & rightMask;\n return uint144((left >> 24) | right);\n }\n}\n" + }, + "contracts/Rewards/StakingContractMainnet.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.11;\n\nimport \"lib/solmate/src/utils/SafeTransferLib.sol\";\nimport \"lib/solmate/src/utils/ReentrancyGuard.sol\";\nimport \"./libraries/PackedUint144.sol\";\nimport \"./libraries/FullMath.sol\";\n\n/// @title Fork of https://github.com/sushiswap/StakingContract\n/// @notice Permissionless staking contract that allows any number of incentives to be running for any token (erc20).\n/// Incentives can be created by anyone, the total reward amount must be sent at creation.\n/// Incentives can be updated (change reward rate / duration).\n/// Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.\ncontract StakingContractMainnet is ReentrancyGuard {\n using SafeTransferLib for ERC20;\n using PackedUint144 for uint144;\n\n struct Incentive {\n address creator; // 1st slot\n address token; // 2nd slot\n address rewardToken; // 3rd slot\n uint32 endTime; // 3rd slot\n bool isRewardRounded; // 3rd slot\n uint256 rewardPerLiquidity; // 4th slot\n uint32 lastRewardTime; // 5th slot\n uint112 rewardRemaining; // 5th slot\n uint112 liquidityStaked; // 5th slot\n }\n\n uint256 public incentiveCount;\n\n // Starts with 1. Zero is an invalid incentive.\n mapping(uint256 => Incentive) public incentives;\n\n /// @dev rewardPerLiquidityLast[user][incentiveId]\n /// @dev Semantic overload: if value is zero user isn't subscribed to the incentive.\n mapping(address => mapping(uint256 => uint256)) public rewardPerLiquidityLast;\n\n /// @dev userStakes[user][stakedToken]\n mapping(address => mapping(address => UserStake)) public userStakes;\n\n // Incentive count won't be greater than type(uint24).max on mainnet.\n // This means we can use uint24 values to identify incentives.\n struct UserStake {\n uint112 liquidity;\n uint144 subscribedIncentiveIds; // Six packed uint24 values.\n }\n\n error InvalidTimeFrame();\n error IncentiveOverflow();\n error AlreadySubscribed();\n error AlreadyUnsubscribed();\n error NotSubscribed();\n error OnlyCreator();\n error NoToken();\n error InvalidInput();\n error BatchError(bytes innerErorr);\n error InsufficientStakedAmount();\n error NotStaked();\n error InvalidIndex();\n\n event IncentiveCreated(\n address indexed token,\n address indexed rewardToken,\n address indexed creator,\n uint256 id,\n uint256 amount,\n uint256 startTime,\n uint256 endTime,\n bool isRewardRounded\n );\n event IncentiveUpdated(uint256 indexed id, int256 changeAmount, uint256 newStartTime, uint256 newEndTime);\n event Stake(address indexed token, address indexed user, uint256 amount);\n event Unstake(address indexed token, address indexed user, uint256 amount);\n event Subscribe(uint256 indexed id, address indexed user);\n event Unsubscribe(uint256 indexed id, address indexed user);\n event Claim(uint256 indexed id, address indexed user, uint256 amount);\n\n function createIncentive(\n address token,\n address rewardToken,\n uint112 rewardAmount,\n uint32 startTime,\n uint32 endTime,\n bool isRewardRounded\n ) external nonReentrant returns (uint256 incentiveId) {\n if (rewardAmount <= 0) revert InvalidInput();\n\n if (startTime < block.timestamp) startTime = uint32(block.timestamp);\n\n if (startTime >= endTime) revert InvalidTimeFrame();\n\n unchecked {\n incentiveId = ++incentiveCount;\n }\n\n if (incentiveId > type(uint24).max) revert IncentiveOverflow();\n\n _saferTransferFrom(rewardToken, rewardAmount);\n\n incentives[incentiveId] = Incentive({\n creator: msg.sender,\n token: token,\n rewardToken: rewardToken,\n lastRewardTime: startTime,\n endTime: endTime,\n isRewardRounded: isRewardRounded,\n rewardRemaining: rewardAmount,\n liquidityStaked: 0,\n // Initial value of rewardPerLiquidity can be arbitrarily set to a non-zero value.\n rewardPerLiquidity: type(uint256).max / 2\n });\n\n emit IncentiveCreated(\n token, rewardToken, msg.sender, incentiveId, rewardAmount, startTime, endTime, isRewardRounded\n );\n }\n\n function updateIncentive(uint256 incentiveId, int112 changeAmount, uint32 newStartTime, uint32 newEndTime)\n external\n nonReentrant\n {\n Incentive storage incentive = incentives[incentiveId];\n\n if (msg.sender != incentive.creator) revert OnlyCreator();\n\n _accrueRewards(incentive);\n\n if (newStartTime != 0) {\n if (newStartTime < block.timestamp) {\n newStartTime = uint32(block.timestamp);\n }\n\n incentive.lastRewardTime = newStartTime;\n }\n\n if (newEndTime != 0) {\n if (newEndTime < block.timestamp) {\n newEndTime = uint32(block.timestamp);\n }\n\n incentive.endTime = newEndTime;\n }\n\n if (incentive.lastRewardTime >= incentive.endTime) {\n revert InvalidTimeFrame();\n }\n\n if (changeAmount > 0) {\n incentive.rewardRemaining += uint112(changeAmount);\n\n ERC20(incentive.rewardToken).safeTransferFrom(msg.sender, address(this), uint112(changeAmount));\n } else if (changeAmount < 0) {\n uint112 transferOut = uint112(-changeAmount);\n\n if (transferOut > incentive.rewardRemaining) {\n transferOut = incentive.rewardRemaining;\n }\n\n unchecked {\n incentive.rewardRemaining -= transferOut;\n }\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, transferOut);\n }\n\n emit IncentiveUpdated(incentiveId, changeAmount, incentive.lastRewardTime, incentive.endTime);\n }\n\n function stakeAndSubscribeToIncentives(\n address token,\n uint112 amount,\n uint256[] memory incentiveIds,\n bool transferExistingRewards\n ) external {\n stakeToken(token, amount, transferExistingRewards);\n\n uint256 n = incentiveIds.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n subscribeToIncentive(incentiveIds[i]);\n }\n }\n\n function stakeToken(address token, uint112 amount, bool transferExistingRewards) public nonReentrant {\n _saferTransferFrom(token, amount);\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n userStake.liquidity += amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n // Loop through already subscribed incentives.\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards) {\n _claimReward(incentive, incentiveId, previousLiquidity);\n } else {\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n }\n\n incentive.liquidityStaked += amount;\n }\n\n emit Stake(token, msg.sender, amount);\n }\n\n function unstakeToken(address token, uint112 amount, bool transferExistingRewards) external nonReentrant {\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n if (amount > previousLiquidity) revert InsufficientStakedAmount();\n\n userStake.liquidity -= amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards || userStake.liquidity == 0) {\n _claimReward(incentive, incentiveId, previousLiquidity);\n } else {\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n }\n\n incentive.liquidityStaked -= amount;\n }\n\n ERC20(token).safeTransfer(msg.sender, amount);\n\n emit Unstake(token, msg.sender, amount);\n }\n\n function subscribeToIncentives(uint256[] memory incentiveIds) external {\n uint256 n = incentiveIds.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n subscribeToIncentive(incentiveIds[i]);\n }\n }\n\n function subscribeToIncentive(uint256 incentiveId) public nonReentrant {\n if (incentiveId > incentiveCount || incentiveId <= 0) {\n revert InvalidInput();\n }\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] != 0) {\n revert AlreadySubscribed();\n }\n\n Incentive storage incentive = incentives[incentiveId];\n\n if (userStakes[msg.sender][incentive.token].liquidity <= 0) {\n revert NotStaked();\n }\n\n _accrueRewards(incentive);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity;\n\n UserStake storage userStake = userStakes[msg.sender][incentive.token];\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.pushUint24Value(uint24(incentiveId));\n\n incentive.liquidityStaked += userStake.liquidity;\n\n emit Subscribe(incentiveId, msg.sender);\n }\n\n /// @param incentiveIndex ∈ [0,5]\n function unsubscribeFromIncentive(address token, uint256 incentiveIndex, bool ignoreRewards)\n external\n nonReentrant\n {\n UserStake storage userStake = userStakes[msg.sender][token];\n\n if (incentiveIndex >= userStake.subscribedIncentiveIds.countStoredUint24Values()) revert InvalidIndex();\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(incentiveIndex);\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] == 0) {\n revert AlreadyUnsubscribed();\n }\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n /// In case there is a token specific issue we can ignore rewards.\n if (!ignoreRewards) {\n _claimReward(incentive, incentiveId, userStake.liquidity);\n }\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = 0;\n\n incentive.liquidityStaked -= userStake.liquidity;\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.removeUint24ValueAt(incentiveIndex);\n\n emit Unsubscribe(incentiveId, msg.sender);\n }\n\n function accrueRewards(uint256 incentiveId) external nonReentrant {\n if (incentiveId > incentiveCount || incentiveId <= 0) {\n revert InvalidInput();\n }\n\n _accrueRewards(incentives[incentiveId]);\n }\n\n function claimRewards(uint256[] calldata incentiveIds) external nonReentrant returns (uint256[] memory rewards) {\n uint256 n = incentiveIds.length;\n\n rewards = new uint256[](n);\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) {\n revert InvalidInput();\n }\n\n Incentive storage incentive = incentives[incentiveIds[i]];\n\n _accrueRewards(incentive);\n\n rewards[i] = _claimReward(incentive, incentiveIds[i], userStakes[msg.sender][incentive.token].liquidity);\n }\n }\n\n /// @dev Claims rewards for all incentives in the list, skipping reward rounding.\n function claimAllRewards(uint256[] calldata incentiveIds)\n external\n nonReentrant\n returns (uint256[] memory rewards)\n {\n uint256 n = incentiveIds.length;\n rewards = new uint256[](n);\n for (uint256 i = 0; i < n; i = _increment(i)) {\n if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) {\n revert InvalidInput();\n }\n\n Incentive storage incentive = incentives[incentiveIds[i]];\n _accrueRewards(incentive);\n rewards[i] =\n _claimReward(incentive, incentiveIds[i], userStakes[msg.sender][incentive.token].liquidity, true);\n }\n }\n\n function _accrueRewards(Incentive storage incentive) internal {\n uint256 lastRewardTime = incentive.lastRewardTime;\n\n uint256 endTime = incentive.endTime;\n\n unchecked {\n uint256 maxTime = block.timestamp < endTime ? block.timestamp : endTime;\n\n if (incentive.liquidityStaked > 0 && lastRewardTime < maxTime) {\n uint256 totalTime = endTime - lastRewardTime;\n\n uint256 passedTime = maxTime - lastRewardTime;\n\n uint256 reward = (uint256(incentive.rewardRemaining) * passedTime) / totalTime;\n\n // Increments of less than type(uint224).max - overflow is unrealistic.\n incentive.rewardPerLiquidity += (reward * type(uint112).max) / incentive.liquidityStaked;\n\n incentive.rewardRemaining -= uint112(reward);\n\n incentive.lastRewardTime = uint32(maxTime);\n } else if (incentive.liquidityStaked == 0 && lastRewardTime < block.timestamp) {\n incentive.lastRewardTime = uint32(maxTime);\n }\n }\n }\n\n function _claimReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity)\n internal\n returns (uint256 reward)\n {\n return _claimReward(incentive, incentiveId, usersLiquidity, false);\n }\n\n function _claimReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity, bool skipRounding)\n internal\n returns (uint256 reward)\n {\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n uint256 rewardDelta;\n // Check if the reward should be rounded\n if (!skipRounding && incentive.isRewardRounded) {\n uint8 decimals = ERC20(incentive.rewardToken).decimals();\n uint256 roundedReward = (reward / 10 ** decimals) * 10 ** decimals;\n // Delta of rewards to be left claimable for the user in the future\n rewardDelta = reward - roundedReward;\n reward = roundedReward;\n }\n\n // Calculate the reward per liquidity delta based on actual rewards given\n uint256 rewardPerLiquidityDelta = (rewardDelta * type(uint112).max) / usersLiquidity;\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity - rewardPerLiquidityDelta;\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, reward);\n emit Claim(incentiveId, msg.sender, reward);\n }\n\n // We offset the rewardPerLiquidityLast snapshot so that the current reward is included next time we call _claimReward.\n function _saveReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity, uint112 newLiquidity)\n internal\n returns (uint256 reward)\n {\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n uint256 rewardPerLiquidityDelta = (reward * type(uint112).max) / newLiquidity;\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity - rewardPerLiquidityDelta;\n }\n\n function _calculateReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity)\n internal\n view\n returns (uint256 reward)\n {\n uint256 userRewardPerLiquidtyLast = rewardPerLiquidityLast[msg.sender][incentiveId];\n\n if (userRewardPerLiquidtyLast == 0) revert NotSubscribed();\n\n uint256 rewardPerLiquidityDelta;\n\n unchecked {\n rewardPerLiquidityDelta = incentive.rewardPerLiquidity - userRewardPerLiquidtyLast;\n }\n\n reward = FullMath.mulDiv(rewardPerLiquidityDelta, usersLiquidity, type(uint112).max);\n }\n\n function _saferTransferFrom(address token, uint256 amount) internal {\n if (token.code.length == 0) revert NoToken();\n\n ERC20(token).safeTransferFrom(msg.sender, address(this), amount);\n }\n\n function _increment(uint256 i) internal pure returns (uint256) {\n unchecked {\n return i + 1;\n }\n }\n\n function batch(bytes[] calldata datas) external {\n uint256 n = datas.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n (bool success, bytes memory result) = address(this).delegatecall(datas[i]);\n\n if (!success) {\n revert BatchError(result);\n }\n }\n }\n}\n" + }, + "contracts/Rewards/test/Console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n function _sendLogPayload(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE_ADDRESS;\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function log() internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n\n function logInt(int256 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(int)\", p0));\n }\n\n function logUint(uint256 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function logString(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint256 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function log(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint256 p0, uint256 p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint)\", p0, p1));\n }\n\n function log(uint256 p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string)\", p0, p1));\n }\n\n function log(uint256 p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool)\", p0, p1));\n }\n\n function log(uint256 p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address)\", p0, p1));\n }\n\n function log(string memory p0, uint256 p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint256 p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint256 p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint256 p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint256 p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n}\n" + }, + "contracts/Rewards/test/mock/Token.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"lib/solmate/src/tokens/ERC20.sol\";\n\ncontract Token is ERC20 {\n constructor() ERC20(\"\", \"\", 18) {}\n\n function mint(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n}\n" + }, + "contracts/Rewards/test/PackedUint144.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport \"../libraries/PackedUint144.sol\";\n\ncontract PackedUintTest is Test {\n using PackedUint144 for uint144;\n\n function testCountStoredUint24Values(uint24 a) public {\n uint144 packed = 0;\n assertEq(packed.countStoredUint24Values(), 0);\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 1);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 2);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 3);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 4);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 5);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 6);\n }\n\n function proveFail_pushUint24Value(uint144 a, uint24 b) public pure {\n while (a.countStoredUint24Values() < 7) {\n a = a.pushUint24Value(b);\n }\n }\n\n function testPushUint24Value(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint24 nil = 0;\n uint144 packed = 0;\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, nil, a))));\n if (b == 0) return;\n packed = packed.pushUint24Value(b);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, a, b))));\n if (c == 0) return;\n packed = packed.pushUint24Value(c);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, a, b, c))));\n if (d == 0) return;\n packed = packed.pushUint24Value(d);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, a, b, c, d))));\n if (e == 0) return;\n packed = packed.pushUint24Value(e);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n if (f == 0) return;\n packed = packed.pushUint24Value(f);\n assertEq(packed, uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n\n function testGetUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n assertEq(packed.getUint24ValueAt(6), uint24(0));\n assertEq(packed.getUint24ValueAt(5), a);\n assertEq(packed.getUint24ValueAt(4), b);\n assertEq(packed.getUint24ValueAt(3), c);\n assertEq(packed.getUint24ValueAt(2), d);\n assertEq(packed.getUint24ValueAt(1), e);\n assertEq(packed.getUint24ValueAt(0), f);\n }\n\n function testRemoveUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n uint24 nil = 0;\n assertEq(packed.removeUint24ValueAt(0), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n assertEq(packed.removeUint24ValueAt(1), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, f))));\n assertEq(packed.removeUint24ValueAt(2), uint144(bytes18(abi.encodePacked(nil, a, b, c, e, f))));\n assertEq(packed.removeUint24ValueAt(3), uint144(bytes18(abi.encodePacked(nil, a, b, d, e, f))));\n assertEq(packed.removeUint24ValueAt(4), uint144(bytes18(abi.encodePacked(nil, a, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(5), uint144(bytes18(abi.encodePacked(nil, b, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(6), uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n}\n" + }, + "contracts/Rewards/test/StakingContractMainnet.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"./TestSetup.sol\";\n\ncontract CreateIncentiveTest is TestSetup {\n function testCreateIncentive(uint112 amount, uint32 startTime, uint32 endTime) public {\n _createIncentive(address(tokenA), address(tokenB), amount, startTime, endTime, false);\n }\n\n function testFailCreateIncentiveInvalidRewardToken(uint32 startTime, uint32 endTime) public {\n _createIncentive(address(tokenA), zeroAddress, 1, startTime, endTime, false);\n }\n\n function testUpdateIncentive(\n int112 changeAmount0,\n int112 changeAmount1,\n uint32 startTime0,\n uint32 startTime1,\n uint32 endTime0,\n uint32 endTime1\n ) public {\n _updateIncentive(ongoingIncentive, changeAmount0, startTime0, endTime0);\n _updateIncentive(ongoingIncentive, changeAmount1, startTime1, endTime1);\n }\n\n function testStake(uint112 amount0, uint112 amount1) public {\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _stake(address(tokenA), amount1, johnDoe, true);\n }\n\n function testSubscribe() public {\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribeSeparate(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribe(uint112 amount) public {\n uint256[] memory idsToSubscribe = new uint256[](2);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n _stakeAndSubscribeToIncentives(address(tokenA), amount, idsToSubscribe, johnDoe, true);\n }\n\n function testAccrue(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n uint256 step = testIncentiveDuration / 2;\n vm.warp(block.timestamp + step);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n _accrueRewards(0);\n _accrueRewards(stakingContract.incentiveCount() + 1);\n }\n\n function testClaimRewards0() public {\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n }\n\n function testClaimRewards1(uint112 amount) public {\n if (amount == 0) return;\n _stake(address(tokenA), amount, johnDoe, true);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n vm.warp(incentive.endTime);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEqInexact(reward, totalReward, 1);\n incentive = _getIncentive(ongoingIncentive);\n assertEq(incentive.rewardRemaining, 0);\n }\n\n function testClaimRewards2(uint96 amount0, uint96 amount1) public {\n if (amount0 == 0 || amount1 == 0) return;\n uint256 maxRatio = 1000000;\n if (amount0 / amount1 > 1000000) return; // to avoid rounding innacuracies for easier testing\n if (amount1 / amount0 > 1000000) return;\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _stake(address(tokenA), amount0, johnDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n uint256 soloReward = _claimReward(ongoingIncentive, johnDoe);\n\n _subscribeToIncentive(ongoingIncentive, janeDoe);\n vm.warp(incentive.endTime);\n\n uint256 reward0 = _claimReward(ongoingIncentive, johnDoe);\n uint256 reward1 = _claimReward(ongoingIncentive, janeDoe);\n\n incentive = _getIncentive(ongoingIncentive);\n uint256 ratio;\n if (amount0 / amount1 > 0) {\n ratio = maxRatio * amount0 / amount1;\n assertEqInexact(maxRatio * reward0 / reward1, ratio, 10);\n }\n if (amount1 / amount0 > 0) {\n ratio = maxRatio * amount1 / amount0;\n assertEqInexact(maxRatio * reward1 / reward0, ratio, 10);\n }\n assertEqInexact(reward0 + reward1 + soloReward, totalReward, 10);\n }\n\n function testClaimRoundedRewards() public {\n uint112 amount = testIncentiveAmount;\n uint256 duration = testIncentiveDuration;\n uint256 incentiveId = _createIncentive(\n address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration), true\n );\n uint256[] memory incentiveIds = new uint256[](1);\n incentiveIds[0] = incentiveId;\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n\n // 2 users stake and subscribe\n _stake(address(tokenA), 1, johnDoe, true);\n _stake(address(tokenA), 1, janeDoe, true);\n _subscribeToIncentive(incentiveId, johnDoe);\n _subscribeToIncentive(incentiveId, janeDoe);\n\n // 1/30 the time has passed\n vm.warp(incentive.lastRewardTime + 86400);\n\n // Each user got 1/60 of the total reward amount\n (,, uint256 johnDoeReward) = _calculateReward(incentiveId, johnDoe);\n (,, uint256 janeDoeReward) = _calculateReward(incentiveId, janeDoe);\n assertEq(johnDoeReward, 16666666666666666666);\n assertEq(janeDoeReward, 16666666666666666666);\n\n // 1 user claims\n vm.prank(johnDoe);\n uint256[] memory johnDoeClaimed = stakingContract.claimRewards(incentiveIds);\n assertEq(johnDoeClaimed[0], 16000000000000000000);\n\n // User still has some rewards pending\n (,, johnDoeReward) = _calculateReward(incentiveId, johnDoe);\n assertEq(johnDoeReward, 666666666666666666);\n\n // Other user still has the same reward\n (,, janeDoeReward) = _calculateReward(incentiveId, janeDoe);\n assertEq(janeDoeReward, 16666666666666666666);\n }\n\n function testUnstakeSaveRewards() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 rewardRemaining = incentive.rewardRemaining;\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2 + 100);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp(incentive.endTime);\n _unstake(address(tokenA), 1, johnDoe, false);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, rewardRemaining);\n reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, 0);\n }\n\n function testFalseStakeAndSubscribe(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(0, johnDoe);\n _subscribeToIncentive(stakingContract.incentiveCount() + 1, johnDoe);\n }\n\n function testStakeInvalidToken() public {\n vm.prank(johnDoe);\n vm.expectRevert(noToken);\n stakingContract.stakeToken(janeDoe, 1, true);\n }\n\n function testRewardRate() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n uint256 oldRate = _rewardRate(ongoingIncentive);\n vm.warp(block.timestamp + testIncentiveDuration / 2);\n stakingContract.accrueRewards(ongoingIncentive);\n uint256 newRate = _rewardRate(ongoingIncentive);\n assertEq(oldRate, newRate);\n }\n\n function testBatch() public {\n bytes[] memory data = new bytes[](2);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n assertEq(liquidity, 1);\n assertEq(subscriptions, ongoingIncentive);\n }\n\n function testBatch2() public {\n bytes[] memory data = new bytes[](3);\n uint256[] memory idsToSubscribe = new uint256[](3);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n idsToSubscribe[2] = futureIncentive;\n\n data[0] =\n abi.encodeCall(stakingContract.stakeAndSubscribeToIncentives, (address(tokenA), 1, idsToSubscribe, true));\n data[1] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 1, false));\n data[2] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 0, false));\n\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n\n assertEq(liquidity, 1);\n assertEq(subscriptions, pastIncentive);\n }\n\n function testFailedBatchRaisesProperError() public {\n bytes[] memory data = new bytes[](3);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n data[2] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n vm.expectRevert(alreadySubscribed);\n stakingContract.batch(data);\n }\n}\n" + }, + "contracts/Rewards/test/TestSetup.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\nimport \"../StakingContractMainnet.sol\";\nimport \"./mock/Token.sol\";\n\ncontract TestSetup is Test {\n address johnDoe = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266;\n address janeDoe = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8;\n address zeroAddress = 0x0000000000000000000000000000000000000000;\n\n uint256 MAX_UINT256 = type(uint256).max;\n uint112 MAX_UINT112 = type(uint112).max;\n uint32 testIncentiveDuration = 2592000;\n uint112 testIncentiveAmount = 1e21;\n\n bytes4 invalidTimeFrame = bytes4(keccak256(\"InvalidTimeFrame()\"));\n bytes4 notSubscribed = bytes4(keccak256(\"NotSubscribed()\"));\n bytes4 alreadySubscribed = bytes4(keccak256(\"AlreadySubscribed()\"));\n bytes4 noToken = bytes4(keccak256(\"NoToken()\"));\n bytes4 invalidInput = bytes4(keccak256(\"InvalidInput()\"));\n bytes4 insufficientStakedAmount = bytes4(keccak256(\"InsufficientStakedAmount\"));\n bytes4 notStaked = bytes4(keccak256(\"NotStaked()\"));\n bytes4 invalidIndex = bytes4(keccak256(\"InvalidIndex()\"));\n bytes4 panic = 0x4e487b71;\n bytes overflow = abi.encodePacked(panic, bytes32(uint256(0x11)));\n\n StakingContractMainnet stakingContract = new StakingContractMainnet();\n\n Token tokenA = new Token();\n Token tokenB = new Token();\n Token tokenC = new Token();\n\n uint256 pastIncentive;\n uint256 ongoingIncentive;\n uint256 futureIncentive;\n\n function setUp() public {\n tokenA.mint(MAX_UINT256);\n tokenB.mint(MAX_UINT256);\n tokenC.mint(MAX_UINT256);\n\n tokenA.approve(address(stakingContract), MAX_UINT256);\n tokenB.approve(address(stakingContract), MAX_UINT256);\n tokenC.approve(address(stakingContract), MAX_UINT256);\n\n tokenA.transfer(johnDoe, MAX_UINT112);\n tokenA.transfer(janeDoe, MAX_UINT112);\n\n vm.prank(johnDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n vm.prank(janeDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n uint112 amount = testIncentiveAmount;\n uint256 currentTime = testIncentiveDuration * 30;\n uint256 duration = testIncentiveDuration;\n\n vm.warp(currentTime - duration);\n pastIncentive = _createIncentive(\n address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration), false\n );\n vm.warp(currentTime);\n ongoingIncentive = _createIncentive(\n address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration), false\n );\n futureIncentive = _createIncentive(\n address(tokenA),\n address(tokenB),\n amount,\n uint32(block.timestamp + duration),\n uint32(block.timestamp + duration * 2),\n false\n );\n }\n\n function testFail_basic_sanity() public {\n assertTrue(false);\n }\n\n function test_basic_sanity() public {\n assertTrue(true);\n }\n\n function _createIncentive(\n address token,\n address rewardToken,\n uint112 amount,\n uint32 startTime,\n uint32 endTime,\n bool isRewardRounded\n ) public returns (uint256) {\n uint256 count = stakingContract.incentiveCount();\n uint256 thisBalance = Token(rewardToken).balanceOf(address(this));\n uint256 stakingContractBalance = Token(rewardToken).balanceOf(address(stakingContract));\n\n if (amount <= 0) {\n vm.expectRevert(invalidInput);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime, isRewardRounded);\n }\n\n if (endTime <= startTime || endTime <= block.timestamp) {\n vm.expectRevert(invalidTimeFrame);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime, isRewardRounded);\n }\n\n uint256 id = stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime, isRewardRounded);\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(id);\n\n assertEq(incentive.creator, address(this));\n assertEq(incentive.token, token);\n assertEq(incentive.rewardToken, rewardToken);\n assertEq(incentive.lastRewardTime, startTime < block.timestamp ? uint32(block.timestamp) : startTime);\n assertEq(incentive.endTime, endTime);\n assertEq(incentive.rewardRemaining, amount);\n assertEq(incentive.liquidityStaked, 0);\n assertEq(incentive.rewardPerLiquidity, type(uint256).max / 2);\n assertEq(count + 1, id);\n assertEq(stakingContract.incentiveCount(), id);\n assertEq(thisBalance - amount, Token(rewardToken).balanceOf(address(this)));\n assertEq(stakingContractBalance + amount, Token(rewardToken).balanceOf(address(stakingContract)));\n return id;\n }\n\n function _updateIncentive(uint256 incentiveId, int112 changeAmount, uint32 startTime, uint32 endTime) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n Token(incentive.rewardToken).balanceOf(address(this));\n Token(incentive.rewardToken).balanceOf(address(stakingContract));\n uint32 newStartTime = startTime == 0\n ? incentive.lastRewardTime\n : (startTime < uint32(block.timestamp) ? uint32(block.timestamp) : startTime);\n uint32 newEndTime =\n endTime == 0 ? incentive.endTime : (endTime < uint32(block.timestamp) ? uint32(block.timestamp) : endTime);\n\n if (newStartTime >= newEndTime) {\n vm.expectRevert(invalidTimeFrame);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount == type(int112).min) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount > 0 && uint112(changeAmount) + uint256(incentive.rewardRemaining) > type(uint112).max) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n\n if (changeAmount < 0 && uint112(-changeAmount) > incentive.rewardRemaining) {\n changeAmount = -int112(incentive.rewardRemaining);\n }\n\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.lastRewardTime, newStartTime);\n assertEq(updatedIncentive.endTime, newEndTime);\n assertEq(\n updatedIncentive.rewardRemaining,\n changeAmount < 0\n ? incentive.rewardRemaining - uint112(-changeAmount)\n : incentive.rewardRemaining + uint112(changeAmount)\n );\n assertEq(updatedIncentive.creator, incentive.creator);\n assertEq(updatedIncentive.token, incentive.token);\n assertEq(updatedIncentive.rewardToken, incentive.rewardToken);\n assertEq(updatedIncentive.liquidityStaked, incentive.liquidityStaked);\n }\n\n function _stake(address token, uint112 amount, address from, bool transferRewards) public {\n // todo check if current incentives stakes got updates correctly\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(\"TRANSFER_FROM_FAILED\");\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n }\n\n function _unstake(address token, uint112 amount, address from, bool transferRewards) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userLiquidityBefore) {\n vm.expectRevert(insufficientStakedAmount);\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore + amount, userBalanceAfter);\n assertEq(userLiquidityBefore - amount, userLiquidityAfter);\n }\n\n function _subscribeToIncentive(uint256 incentiveId, address from) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint112 liquidity = _getUsersLiquidityStaked(from, incentive.token);\n\n (uint256 rpl) = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.prank(from);\n vm.expectRevert(invalidInput);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (rpl != 0) {\n vm.prank(from);\n vm.expectRevert(alreadySubscribed);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (liquidity == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n vm.prank(from);\n stakingContract.subscribeToIncentive(incentiveId);\n\n StakingContractMainnet.Incentive memory incentiveAfter = _getIncentive(incentiveId);\n uint144 subscribedIncentives = _getUsersSubscribedIncentives(from, incentive.token);\n\n assertEq(incentive.liquidityStaked + liquidity, incentiveAfter.liquidityStaked);\n assertEq(uint24(subscribedIncentives), uint24(incentiveId));\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), incentiveAfter.rewardPerLiquidity);\n if (block.timestamp > incentive.lastRewardTime) {\n assertEq(\n incentiveAfter.lastRewardTime,\n block.timestamp > incentiveAfter.endTime ? incentiveAfter.endTime : block.timestamp\n );\n } else {\n assertEq(incentiveAfter.lastRewardTime, incentive.lastRewardTime);\n }\n }\n\n function _stakeAndSubscribeToIncentives(\n address token,\n uint112 amount,\n uint256[] memory incentiveIds,\n address from,\n bool transferRewards\n ) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesBefore = _getUsersSubscribedIncentives(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesAfter = _getUsersSubscribedIncentives(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n assertLt(subscribedIncentivesBefore, subscribedIncentivesAfter);\n }\n\n function _accrueRewards(uint256 incentiveId) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 rewardPerLiquidity;\n uint256 rewardRemaining;\n uint256 lastRewardTime;\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n if (incentive.liquidityStaked > 0 && incentive.lastRewardTime < maxTime) {\n (rewardPerLiquidity, rewardRemaining, lastRewardTime) = _calculateAccrueChange(incentiveId);\n } else {\n rewardPerLiquidity = incentive.rewardPerLiquidity;\n rewardRemaining = incentive.rewardRemaining;\n if (incentive.lastRewardTime < block.timestamp) {\n lastRewardTime = maxTime;\n } else {\n lastRewardTime = incentive.lastRewardTime;\n }\n }\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.expectRevert(invalidInput);\n stakingContract.accrueRewards(incentiveId);\n return;\n }\n\n stakingContract.accrueRewards(incentiveId);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(updatedIncentive.lastRewardTime, lastRewardTime);\n assertEq(updatedIncentive.rewardRemaining, rewardRemaining);\n }\n\n function _calculateAccrueChange(uint256 incentiveId)\n public\n view\n returns (uint256 rewardPerLiquidity, uint256 rewardRemaining, uint256 lastRewardTime)\n {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 totalTime = incentive.endTime - incentive.lastRewardTime;\n if (totalTime == 0 || incentive.liquidityStaked == 0 || block.timestamp < incentive.lastRewardTime) {\n return (incentive.rewardPerLiquidity, incentive.rewardRemaining, incentive.lastRewardTime);\n }\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n uint256 passedTime = maxTime - incentive.lastRewardTime;\n uint256 reward = uint256(passedTime) * incentive.rewardRemaining / totalTime;\n uint256 rplChange = reward * type(uint112).max / incentive.liquidityStaked;\n rewardPerLiquidity = incentive.rewardPerLiquidity + rplChange;\n rewardRemaining = incentive.rewardRemaining - reward;\n lastRewardTime = maxTime;\n }\n\n function _claimReward(uint256 incentiveId, address from) public returns (uint256 reward) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 oldBalance = Token(incentive.rewardToken).balanceOf(from);\n (uint256 rewardPerLiquidityLast, uint256 rewardPerLiquidity, uint256 expectedReward) =\n _calculateReward(incentiveId, from);\n uint256[] memory incentiveIds = new uint256[](1);\n incentiveIds[0] = incentiveId;\n if (rewardPerLiquidityLast == 0) {\n vm.prank(from);\n vm.expectRevert(notSubscribed);\n stakingContract.claimRewards(incentiveIds);\n return 0;\n }\n vm.prank(from);\n uint256[] memory rewards = stakingContract.claimRewards(incentiveIds);\n reward = rewards[0];\n assertEq(reward, expectedReward);\n uint256 newBalance = Token(incentive.rewardToken).balanceOf(from);\n assertEq(newBalance - oldBalance, reward);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), rewardPerLiquidity);\n }\n\n function _calculateReward(uint256 incentiveId, address from)\n internal\n view\n returns (uint256 rplLast, uint256 newRewardPerLiquidity, uint256 reward)\n {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n (newRewardPerLiquidity,,) = _calculateAccrueChange(incentiveId);\n uint256 usersLiquidity = _getUsersLiquidityStaked(from, incentive.token);\n rplLast = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n if (rplLast != 0) {\n reward = (newRewardPerLiquidity - rplLast) * usersLiquidity / type(uint112).max;\n }\n }\n\n function _getUsersLiquidityStaked(address user, address token) public view returns (uint112) {\n (uint112 liquidity,) = stakingContract.userStakes(user, token);\n return liquidity;\n }\n\n function _getUsersSubscribedIncentives(address user, address token) public view returns (uint144) {\n (, uint144 incentiveIds) = stakingContract.userStakes(user, token);\n return incentiveIds;\n }\n\n function _rewardRate(uint256 incentiveId) public view returns (uint256) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n if (incentive.endTime != incentive.lastRewardTime) {\n return\n incentive.rewardRemaining * uint256(type(uint112).max) / (incentive.endTime - incentive.lastRewardTime);\n } else {\n return 0;\n }\n }\n\n function _getIncentive(uint256 id) public view returns (StakingContractMainnet.Incentive memory incentive) {\n (\n address creator,\n address token,\n address rewardToken,\n uint32 endTime,\n bool isRewardRounded,\n uint256 rewardPerLiquidity,\n uint32 lastRewardTime,\n uint112 rewardRemaining,\n uint112 liquidityStaked\n ) = stakingContract.incentives(id);\n incentive = StakingContractMainnet.Incentive(\n creator,\n token,\n rewardToken,\n endTime,\n isRewardRounded,\n rewardPerLiquidity,\n lastRewardTime,\n rewardRemaining,\n liquidityStaked\n );\n }\n\n function assertEqInexact(uint256 value, uint256 shouldBe, uint256 err) public {\n assertTrue(value <= shouldBe + err);\n assertTrue(value >= shouldBe - err);\n }\n}\n" + }, + "contracts/Router/IMagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol\";\nimport \"../Vault/INftVault.sol\";\n\n/// @title Router contract for swapping, managing liquidity and interacting with vaults\ninterface IMagicSwapV2Router is IUniswapV2Router01 {\n /// @dev Amounts does not match\n error MagicSwapV2WrongAmounts();\n error MagicSwapV2WrongAmountDeposited();\n error MagicSwapV2WrongAmountADeposited();\n error MagicSwapV2WrongAmountBDeposited();\n error MagicSwapV2InvalidPath();\n\n /// @notice Struct that specifies data for liquidity-related operations on vault.\n /// @param token address of NFT vault\n /// @param collection list of NFT addresses\n /// @param tokenId list of token IDs\n /// @param amount list of token amounts. For ERC721 amount is always 1.\n struct NftVaultLiquidityData {\n INftVault token;\n address[] collection;\n uint256[] tokenId;\n uint256[] amount;\n }\n\n /// @notice Emitted when NFT-ERC20 liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vault vault data of deposited NFTs\n event NFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vaultA vault data of deposited NFTs for first side\n /// @param vaultB vault data of deposited NFTs for second side\n event NFTNFTLiquidityAdded(\n address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB\n );\n\n /// @notice Emitted when NFT-ERC20 liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vault vault data of withdrawn NFTs\n event NFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vaultA vault data of withdrawn NFTs for first side\n /// @param vaultB vault data of withdrawn NFTs for second side\n event NFTNFTLiquidityRemoved(\n address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB\n );\n\n /// @notice Deposit NFTs to vault\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to deposit\n /// @param _tokenId list of token IDs to deposit\n /// @param _amount list of token amounts to deposit. For ERC721 amount is always 1.\n /// @param _vault address of the vault where NFTs are deposited\n /// @param _to address that gets ERC20 for deposited NFTs\n /// @return amountMinted amount of ERC20 minted for deposited NFTs\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted);\n\n /// @dev Withdraw NFTs from vault\n /// @dev Vault token must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to withdraw\n /// @param _tokenId list of token IDs to withdraw\n /// @param _amount list of token amounts to withdraw. For ERC721 amount is always 1.\n /// @param _vault address of the vault to withdraw NFTs from\n /// @param _to address that gets withdrawn NFTs\n /// @return amountBurned amount of ERC20 redeemed for NFTs\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and second ERC20 token\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _tokenB address of token B\n /// @param _amountBDesired desired amount of token B to be added as liquidity\n /// @param _amountBMin minimum amount of token B to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and ETH\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _amountETHMin desired amount of ETH to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountToken amount of vault token added as liquidity\n /// @return amountETH amount of ETH added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using two NFT vaults\n /// @dev All NFTs must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to deposit as liquidity for first side\n /// @param _vaultB vault data for NFTs to deposit as liquidity for second side\n /// @param _amountAMin minimum amount of token A to be deposited\n /// @param _amountBMin minimum amount of token B to be deposited\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ERC20 token\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _tokenB address of token B\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to Token B\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ETH\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountTokenMin minimum amount of vault token to be redeemed\n /// @param _amountETHMin minimum amount of ETH to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to ETH\n /// @return amountToken amount of vault token redeemed\n /// @return amountETH amount of ETH redeemed\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs\n /// @dev Lp token must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to withdraw from liquidity for first side\n /// @param _vaultB vault data for NFTs to withdraw from liquidity for second side\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Swap NFTs for ERC20\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for token\n /// @param _tokenId list of token IDs to swap for token\n /// @param _amount list of token amounts to swap for token. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of output token expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets output token\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for ETH\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for ETH\n /// @param _tokenId list of token IDs to swap for ETH\n /// @param _amount list of token amounts to swap for ETH. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of ETH expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets ETH\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap ERC20 for NFTs\n /// @dev ERC20 must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for tokens\n /// @param _tokenId list of token IDs to receive for tokens\n /// @param _amount list of token amounts to receive for tokens. For ERC721 amount is always 1.\n /// @param _amountInMax maximum acceptable amount of token to swap for NFTs\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap ETH for NFTs\n /// @dev Does not require any approvals. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for ETH\n /// @param _tokenId list of token IDs to receive for ETH\n /// @param _amount list of token amounts to receive for ETH. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for NFTs\n /// @dev All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover\n /// during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn`\n /// as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.\n /// @param _collectionIn list of input NFT addresses\n /// @param _tokenIdIn list of input token IDs\n /// @param _amountIn list of input token amounts. For ERC721 amount is always 1.\n /// @param _collectionOut list of output NFT addresses\n /// @param _tokenIdOut list of output token IDs\n /// @param _amountOut list of output token amounts. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n}\n" + }, + "contracts/Router/MagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"./IMagicSwapV2Router.sol\";\nimport \"../UniswapV2/periphery/UniswapV2Router02.sol\";\nimport \"../UniswapV2/core/interfaces/IUniswapV2Pair.sol\";\n\n// ▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▒░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓\n\ncontract MagicSwapV2Router is IMagicSwapV2Router, UniswapV2Router02 {\n uint256 public constant ONE = 1e18;\n address public constant BURN_ADDRESS = address(0xdead);\n\n constructor(address _factory, address _WETH) UniswapV2Router02(_factory, _WETH) {}\n\n /// @inheritdoc IMagicSwapV2Router\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted) {\n amountMinted = _depositVault(_collection, _tokenId, _amount, _vault, _to);\n }\n\n function _depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) internal returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n INftVault.CollectionData memory collectionData = _vault.getAllowedCollectionData(_collection[i]);\n if (collectionData.nftType == INftVault.NftType.ERC721) {\n IERC721(_collection[i]).safeTransferFrom(msg.sender, address(_vault), _tokenId[i]);\n } else if (collectionData.nftType == INftVault.NftType.ERC1155) {\n IERC1155(_collection[i]).safeTransferFrom(\n msg.sender, address(_vault), _tokenId[i], _amount[i], bytes(\"\")\n );\n } else {\n revert INftVault.UnsupportedNft();\n }\n }\n\n amountMinted = _vault.depositBatch(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned) {\n amountBurned = _withdrawVault(_collection, _tokenId, _amount, _vault, msg.sender, _to);\n }\n\n function _withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _from,\n address _to\n ) internal returns (uint256 amountBurned) {\n IERC20 vaultToken = IERC20(address(_vault));\n uint256 amountToBurn = nftAmountToERC20(_amount);\n uint256 fromBalance = vaultToken.balanceOf(_from);\n uint256 totalSupply = vaultToken.totalSupply();\n\n /// @dev if user withdraws all NFT tokens but does not have totalSupply of ERC20 tokens (some are locked\n /// in UniV2 pool), we optimistically assume that user has enough and adjust `amountToBurn`\n /// to user balance. If user balance does not meet required minimum then Vault will revert anyway.\n if (amountToBurn == totalSupply && fromBalance < totalSupply) {\n amountToBurn = fromBalance;\n }\n\n if (_from == address(this)) _approveIfNeeded(address(_vault), amountToBurn);\n\n vaultToken.transferFrom(_from, address(_vault), amountToBurn);\n amountBurned = _vault.withdrawBatch(_to, _collection, _tokenId, _amount);\n\n if (amountToBurn != amountBurned) revert MagicSwapV2WrongAmounts();\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted =\n _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vault.token), _tokenB, amountAMinted, _amountBDesired, amountAMinted, _amountBMin);\n\n if (amountAMinted != amountA) revert MagicSwapV2WrongAmountDeposited();\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n TransferHelper.safeTransfer(address(_vault.token), pair, amountA);\n TransferHelper.safeTransferFrom(_tokenB, msg.sender, pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount) {\n uint256 amountMinted =\n _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n _approveIfNeeded(address(_vault.token), amountMinted);\n\n (amountToken, amountETH, lpAmount) = _addLiquidityETH(\n address(_vault.token), amountMinted, amountMinted, _amountETHMin, address(this), _to, _deadline\n );\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted =\n _depositVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this));\n uint256 amountBMinted =\n _depositVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this));\n\n (amountA, amountB) = _addLiquidity(\n address(_vaultA.token), address(_vaultB.token), amountAMinted, amountBMinted, _amountAMin, _amountBMin\n );\n\n if (amountAMinted != amountA) {\n if (amountAMinted < amountA) {\n revert MagicSwapV2WrongAmountADeposited();\n }\n\n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountAMinted - amountA);\n }\n\n if (amountBMinted != amountB) {\n if (amountBMinted < amountB) {\n revert MagicSwapV2WrongAmountBDeposited();\n }\n\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountBMinted - amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n TransferHelper.safeTransfer(address(_vaultA.token), pair, amountA);\n TransferHelper.safeTransfer(address(_vaultB.token), pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTNFTLiquidityAdded(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) = removeLiquidity(\n address(_vault.token), _tokenB, _lpAmount, _amountAMin, _amountBMin, address(this), _deadline\n );\n\n // withdraw NFTs and send to user\n uint256 amountBurned =\n _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountA -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), _tokenB, amountA);\n\n amountA = 0;\n amountB += amountOut;\n } else if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountA);\n }\n\n TransferHelper.safeTransfer(_tokenB, _to, amountB);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) = removeLiquidity(\n address(_vault.token), WETH, _lpAmount, _amountTokenMin, _amountETHMin, address(this), _deadline\n );\n\n // withdraw NFTs and send to user\n uint256 amountBurned =\n _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountToken -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), WETH, amountToken);\n\n amountToken = 0;\n amountETH += amountOut;\n } else if (amountToken > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountToken);\n }\n\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(_to, amountETH);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) = removeLiquidity(\n address(_vaultA.token),\n address(_vaultB.token),\n _lpAmount,\n _amountAMin,\n _amountBMin,\n address(this),\n _deadline\n );\n\n // withdraw NFTs and send to user\n uint256 amountBurnedA =\n _withdrawVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this), _to);\n uint256 amountBurnedB =\n _withdrawVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this), _to);\n\n amountA -= amountBurnedA;\n amountB -= amountBurnedB;\n\n if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountA);\n }\n\n if (amountB > 0) {\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n\n emit NFTNFTLiquidityRemoved(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), _to, _deadline);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n if (_path[_path.length - 1] != WETH) revert MagicSwapV2InvalidPath();\n\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), address(this), _deadline);\n\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(_to, amounts[amounts.length - 1]);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = _swapTokensForExactTokens(amountOut, _amountInMax, _path, msg.sender, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = swapETHForExactTokens(amountOut, _path, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collectionIn, _tokenIdIn, _amountIn, INftVault(_path[0]), address(this));\n address vaultOut = _path[_path.length - 1];\n uint256 amountOutMin = nftAmountToERC20(_amountOut);\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, _path, address(this), address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collectionOut, _tokenIdOut, _amountOut, INftVault(vaultOut), address(this), _to);\n\n uint256 dust = amounts[amounts.length - 1] - amountOutMin;\n\n // send leftover of input token back to the pool and sync\n if (dust > 0) {\n // refund user unused token\n address pair = UniswapV2Library.pairFor(factory, _path[_path.length - 2], vaultOut);\n TransferHelper.safeTransfer(vaultOut, pair, dust);\n IUniswapV2Pair(pair).sync();\n }\n }\n\n function swapLeftover(address _tokenA, address _tokenB, uint256 _amountIn) internal returns (uint256 amountOut) {\n if (_amountIn == 0) return 0;\n\n address[] memory path = new address[](2);\n path[0] = _tokenA;\n path[1] = _tokenB;\n\n _approveIfNeeded(_tokenA, _amountIn);\n\n // swap leftover to tokenB\n // TODO: can be front-run, issue?\n uint256[] memory amounts =\n _swapExactTokensForTokens(_amountIn, 1, path, address(this), address(this), block.timestamp);\n\n return amounts[1];\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal pure returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function _approveIfNeeded(address _token, uint256 _amount) internal {\n if (IERC20(_token).allowance(address(this), address(this)) < _amount) {\n SafeERC20.safeApprove(IERC20(_token), address(this), 0);\n SafeERC20.safeApprove(IERC20(_token), address(this), type(uint256).max);\n }\n }\n}\n" + }, + "contracts/Router/test/MagicSwapV2Router.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport {console2, Test} from \"forge-std/Test.sol\";\n\nimport {IERC20} from \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport {ERC721Mintable} from \"lib/ERC721Mintable.sol\";\nimport {ERC1155Mintable} from \"lib/ERC1155Mintable.sol\";\n\nimport {WETH} from \"./mock/WETH.sol\";\nimport {IMagicSwapV2Router, MagicSwapV2Router} from \"../MagicSwapV2Router.sol\";\nimport {UniswapV2Factory} from \"../../UniswapV2/core/UniswapV2Factory.sol\";\nimport {IUniswapV2Router01} from \"../../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol\";\nimport {NftVaultFactory, INftVault} from \"../../Vault/NftVaultFactory.sol\";\nimport {TestHelper} from \"../../test/TestHelper.sol\";\nimport {TestUniswapV2LibraryContract} from \"../../test/TestUniswapV2LibraryContract.sol\";\n\ncontract MagicSwapV2RouterTest is Test, TestHelper {\n WETH weth;\n UniswapV2Factory factory;\n MagicSwapV2Router magicSwapV2Router;\n NftVaultFactory nftVaultFactory;\n ERC721Mintable nft1;\n ERC1155Mintable nft2;\n TestUniswapV2LibraryContract uniswapV2Library;\n\n uint256 ONE;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData[] public collections1;\n INftVault.CollectionData[] public collections2;\n\n INftVault vault1;\n INftVault vault2;\n\n address[] public collectionArray;\n uint256[] public tokenIdArray;\n uint256[] public amountArray;\n\n address[] public collectionArray1;\n uint256[] public tokenIdArray1;\n uint256[] public amountArray1;\n\n function setUp() public {\n weth = new WETH();\n\n uniswapV2Library = new TestUniswapV2LibraryContract();\n patchUniswapV2Library(address(uniswapV2Library), \"TestUniswapV2LibraryContract.sol\", \"\");\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n magicSwapV2Router = new MagicSwapV2Router(address(factory), address(weth));\n bytes memory args = abi.encode(address(factory), address(weth));\n patchUniswapV2Library(address(magicSwapV2Router), \"MagicSwapV2Router.sol\", args);\n\n nftVaultFactory = new NftVaultFactory();\n\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections1.push(collectionERC721all);\n vault1 = nftVaultFactory.createVault(collections1);\n nft1 = ERC721Mintable(collectionERC721all.addr);\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections2.push(collectionERC721all);\n collections2.push(collectionERC1155all);\n vault2 = nftVaultFactory.createVault(collections2);\n nft2 = ERC1155Mintable(collectionERC1155all.addr);\n\n ONE = vault1.ONE();\n }\n\n function _dealWeth(address _user, uint256 _amount) public {\n vm.deal(_user, _amount);\n vm.prank(_user);\n weth.deposit{value: _amount}();\n vm.prank(_user);\n weth.approve(address(magicSwapV2Router), _amount);\n }\n\n function _copyStorage()\n public\n view\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n _collection = collectionArray;\n _tokenId = tokenIdArray;\n _amount = amountArray;\n }\n\n function _mintTokens(address _user)\n public\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n (_collection, _tokenId, _amount) = _copyStorage();\n\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n nft1.mint(_user, _tokenId[i]);\n vm.prank(_user);\n nft1.setApprovalForAll(address(magicSwapV2Router), true);\n } else {\n nft2.mint(_user, _tokenId[i], _amount[i]);\n vm.prank(_user);\n nft2.setApprovalForAll(address(magicSwapV2Router), true);\n }\n }\n }\n\n function _checkNftBalances(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address _owner\n ) public view {\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n assertEq(nft1.ownerOf(_tokenId[i]), _owner);\n } else {\n assertEq(nft2.balanceOf(_owner, _tokenId[i]), _amount[i]);\n }\n }\n }\n\n function _checkERC20Balances(\n address[] memory _collection,\n uint256[] memory,\n uint256[] memory _amount,\n address _vault,\n address _owner,\n uint256 _prevBalance\n ) public view {\n uint256 totalAmount;\n\n for (uint256 i = 0; i < _collection.length; i++) {\n totalAmount += _amount[i];\n }\n\n assertEq(IERC20(_vault).balanceOf(_owner), totalAmount * ONE + _prevBalance);\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal view returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function testDepositWithdrawVault(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 50);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint64).max);\n\n // deposit 1\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n vm.prank(user1);\n uint256 amountMinted1 = magicSwapV2Router.depositVault(_collection1, _tokenId1, _amount1, vault1, user1);\n\n assertEq(amountMinted1, nftAmountToERC20(_amount1));\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault1));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault1), user1, 0);\n\n // deposit 2\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n vm.prank(user2);\n uint256 amountMinted2 = magicSwapV2Router.depositVault(_collection2, _tokenId2, _amount2, vault2, user2);\n\n assertEq(amountMinted2, nftAmountToERC20(_amount2));\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), user2, 0);\n\n // withdraw 1\n vm.startPrank(user1);\n IERC20(address(vault1)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount1));\n\n uint256 amountBurned1 = magicSwapV2Router.withdrawVault(_collection1, _tokenId1, _amount1, vault1, user3);\n vm.stopPrank();\n\n assertEq(amountBurned1, amountMinted1);\n assertEq(IERC20(address(vault1)).balanceOf(user1), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(vault1)), 0);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user3);\n\n // withdraw 2\n\n collectionArray = [address(nft1), address(nft1), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n (address[] memory _collection3,,) = _mintTokens(user2);\n\n vm.startPrank(user2);\n IERC20(address(vault2)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount2));\n\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2WrongAmounts.selector);\n magicSwapV2Router.withdrawVault(_collection3, _tokenId2, _amount2, vault2, user4);\n\n uint256 leftover = vault2.ONE() - vault2.LAST_NFT_AMOUNT();\n IERC20(address(vault2)).transfer(user4, leftover + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n vm.stopPrank();\n\n vm.prank(user4);\n IERC20(address(vault2)).transfer(user2, 1);\n\n vm.prank(user2);\n uint256 amountBurned2 = magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n\n assertEq(amountBurned2 + leftover, amountMinted2);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(vault2)), 0);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, user4);\n }\n\n function testAddLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n // UniswapV2Pair balance is using uint112\n // and amount of NFTs is multiplied by 1e18 when transformed to ERC20\n // and we are depositing multple NFTs\n // so trying to avoid overflow revert\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testAddLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n vm.deal(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired1\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n vm.deal(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFTETH{value: amountBDesired2}(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired2\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testAddLiquidityNFTNFT(uint256 _tokenId) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1, 1, 1];\n\n (address[] memory _collectionA1, uint256[] memory _tokenIdA1, uint256[] memory _amountA1) = _mintTokens(user1);\n\n collectionArray = [address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++];\n amountArray = [5, 5];\n\n (address[] memory _collectionB1, uint256[] memory _tokenIdB1, uint256[] memory _amountB1) = _mintTokens(user1);\n\n vm.prank(user1);\n\n address pair;\n uint256 amountA1;\n uint256 amountB1;\n {\n (uint256 __amountA1, uint256 __amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA1,\n tokenId: _tokenIdA1,\n amount: _amountA1\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB1,\n tokenId: _tokenIdB1,\n amount: _amountB1\n }),\n nftAmountToERC20(_amountA1),\n nftAmountToERC20(_amountB1),\n user1,\n block.timestamp\n );\n\n amountA1 = __amountA1;\n amountB1 = __amountB1;\n\n // All amounts were used\n assertEq(amountA1, nftAmountToERC20(_amountA1));\n assertEq(amountB1, nftAmountToERC20(_amountB1));\n\n // All vault tokens were transferred to the pair\n pair = uniswapV2Library.pairFor(address(factory), address(vault1), address(vault2));\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA1, _tokenIdA1, _amountA1, address(vault1));\n _checkNftBalances(_collectionB1, _tokenIdB1, _amountB1, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n }\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1];\n\n (address[] memory _collectionA2, uint256[] memory _tokenIdA2, uint256[] memory _amountA2) = _mintTokens(user2);\n\n collectionArray = [address(nft2)];\n tokenIdArray = [_tokenId++];\n amountArray = [5];\n\n (address[] memory _collectionB2, uint256[] memory _tokenIdB2, uint256[] memory _amountB2) = _mintTokens(user2);\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA2,\n tokenId: _tokenIdA2,\n amount: _amountA2\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB2,\n tokenId: _tokenIdB2,\n amount: _amountB2\n }),\n nftAmountToERC20(_amountA2) - ONE,\n nftAmountToERC20(_amountB2),\n user2,\n block.timestamp\n );\n\n // Optimal amounts where used\n assertEq(amountA2, 2.5 * 10 ** 18);\n assertEq(amountB2, nftAmountToERC20(_amountB2));\n\n // Optimal vault tokens were transferred to the pair\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1 + amountA2);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1 + amountB2);\n\n // Leftover vault tokens were transferred to the burn address\n assertEq(IERC20(address(vault1)).balanceOf(address(0xdead)), nftAmountToERC20(_amountA2) - amountA2);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA2, _tokenIdA2, _amountA2, address(vault1));\n _checkNftBalances(_collectionB2, _tokenIdB2, _amountB2, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testRemoveLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevWETHBalance = weth.balanceOf(user1);\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, weth.balanceOf(user1) - prevWETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testRemoveLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevETHBalance = user1.balance;\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, user1.balance - prevETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(weth.balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function _seedLiquidity1(uint256 _tokenId) public returns (uint256 tokenId) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1)\n ];\n collectionArray1 = collectionArray;\n\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n tokenIdArray1 = tokenIdArray;\n\n amountArray = [uint256(1), 1, 1, 1, uint256(1), 1, 1, 1];\n amountArray1 = amountArray;\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18 / 2;\n uint256 amountBMin1 = 9500e18 / 2;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return _tokenId;\n }\n\n function _seedLiquidity2(uint256 _tokenId, uint256 _amount) public returns (uint256 tokenId, uint256 amount) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft2),\n address(nft2),\n address(nft2),\n address(nft2)\n ];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1, _amount++, _amount++, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18;\n uint256 amountBMin1 = 9500e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return (_tokenId, _amount);\n }\n\n function testSwapNftForTokens(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n uniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = uniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForTokens(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), amountOut);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n address[] memory wrongPath = new address[](2);\n wrongPath[0] = address(vault2);\n wrongPath[1] = address(vault1);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n uniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = uniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2InvalidPath.selector);\n magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, wrongPath, user2, block.timestamp\n );\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance + amountOut);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapTokensForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n uniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = uniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n uint256 amountInMax = amountIn;\n\n _dealWeth(user2, amountIn);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapTokensForNft(\n _collection1, _tokenId1, _amount1, amountInMax, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapETHForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n uniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = uniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = uniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n\n uint256 dust = 1e18;\n vm.deal(user2, amountIn + dust);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapETHForNft{value: amountIn + dust}(\n _collection1, _tokenId1, _amount1, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance - amountIn);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n _tokenId = _seedLiquidity1(_tokenId);\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[7]];\n tokenIdArray = [tokenIdArray[7]];\n amountArray = [amountArray[7]];\n\n address[] memory _collectionOut = collectionArray;\n uint256[] memory _tokenIdOut = tokenIdArray;\n uint256[] memory _amountOut = amountArray;\n\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1];\n\n (address[] memory _collectionIn, uint256[] memory _tokenIdIn, uint256[] memory _amountIn) = _mintTokens(user2);\n\n address[] memory path = new address[](3);\n path[0] = address(vault1);\n path[1] = address(weth);\n path[2] = address(vault2);\n\n uint256 amountIn;\n uint256 amountOut;\n {\n amountIn = nftAmountToERC20(_amountIn);\n uint256[] memory amounts = uniswapV2Library.getAmountsOut(address(factory), amountIn, path);\n amountOut = amounts[amounts.length - 1];\n console2.log(\"amountOut\", amountOut);\n }\n\n _amountOut[0] = amountOut / ONE;\n\n assertTrue(nftAmountToERC20(_amountOut) < amountOut);\n assertEq(nftAmountToERC20(_amountOut) / ONE, amountOut / ONE);\n\n uint256 prevPairVault2Balance;\n {\n address pair = uniswapV2Library.pairFor(address(factory), path[1], path[2]);\n prevPairVault2Balance = IERC20(address(vault2)).balanceOf(pair);\n }\n\n vm.prank(user2);\n uint256[] memory swapAmounts = magicSwapV2Router.swapNftForNft(\n _collectionIn, _tokenIdIn, _amountIn, _collectionOut, _tokenIdOut, _amountOut, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collectionIn, _tokenIdIn, _amountIn, address(vault1));\n _checkNftBalances(_collectionOut, _tokenIdOut, _amountOut, user2);\n assertEq(swapAmounts[0], amountIn);\n assertEq(swapAmounts[2], amountOut);\n\n uint256 dust = swapAmounts[swapAmounts.length - 1] - amountOut / ONE * ONE;\n console2.log(\"dust\", dust);\n assertTrue(dust > 0);\n assertEq(\n IERC20(address(vault2)).balanceOf(uniswapV2Library.pairFor(address(factory), path[1], path[2])),\n prevPairVault2Balance - amountOut + dust\n );\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(IERC20(address(vault1)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n}\n" + }, + "contracts/Router/test/mock/WETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ncontract WETH {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed src, address indexed guy, uint256 wad);\n event Transfer(address indexed src, address indexed dst, uint256 wad);\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n receive() external payable {\n deposit();\n }\n\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n emit Deposit(msg.sender, msg.value);\n }\n\n function withdraw(uint256 wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n (bool success,) = payable(msg.sender).call{value: wad}(\"\");\n require(success, \"Transfer failed\");\n emit Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint256) {\n return address(this).balance;\n }\n\n function approve(address guy, uint256 wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n emit Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint256 wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint256 wad) public returns (bool) {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n emit Transfer(src, dst, wad);\n\n return true;\n }\n}\n" + }, + "contracts/test/TestHelper.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\n\ncontract TestHelper is Test {\n function patchUniswapV2Library(\n address contractUsingUniswapV2Library,\n string memory contractFilename,\n bytes memory args\n ) public {\n bytes memory bytecode = abi.encodePacked(vm.getCode(contractFilename), args);\n\n bytes32 ORIGINAL_INIT_CODE_HASH = 0x010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43;\n bytes32 NEW_INIT_CODE_HASH = 0x010004dba4c88c36b9cf5b708cdea396e454c1d162b487daa289669537fe8f0d;\n\n bytecode = veryBadBytesReplacer(bytecode, ORIGINAL_INIT_CODE_HASH, NEW_INIT_CODE_HASH);\n vm.etch(contractUsingUniswapV2Library, bytecode);\n }\n\n /**\n * @dev Non-optimised code to replace a certain 32 bytes sequence in a longer bytes object.\n * @dev Assumes the 32 bytes sequence is exactly once present in the bytes object.\n * Reverts if it is not present and only replaces first occurrence if present multiple times.\n */\n function veryBadBytesReplacer(bytes memory bytecode, bytes32 target, bytes32 replacement)\n internal\n pure\n returns (bytes memory result)\n {\n result = veryBadBytesReplacer(bytecode, abi.encodePacked(target), abi.encodePacked(replacement));\n }\n\n function veryBadBytesReplacer(bytes memory bytecode, bytes memory target, bytes memory replacement)\n internal\n pure\n returns (bytes memory result)\n {\n require(target.length <= bytecode.length);\n require(target.length == replacement.length);\n\n uint256 lengthTarget = target.length;\n uint256 lengthBytecode = bytecode.length - lengthTarget + 1;\n uint256 i;\n for (i; i < lengthBytecode;) {\n uint256 j = 0;\n for (j; j < lengthTarget;) {\n if (bytecode[i + j] == target[j]) {\n if (j == lengthTarget - 1) {\n // Target found, replace with replacement, and return result.\n return result = replaceBytes(bytecode, replacement, i);\n }\n } else {\n break;\n }\n unchecked {\n ++j;\n }\n }\n\n unchecked {\n ++i;\n }\n }\n // Should always find one single match. -> revert if not.\n revert();\n }\n\n function veryBadBytesReplacer(\n bytes memory bytecode,\n bytes memory target,\n bytes memory replacement,\n bool replaceFirstOnly\n ) internal pure returns (bytes memory) {\n require(target.length <= bytecode.length);\n require(target.length == replacement.length);\n\n uint256 lengthTarget = target.length;\n uint256 lengthBytecode = bytecode.length - lengthTarget + 1;\n for (uint256 i; i < lengthBytecode; ++i) {\n uint256 j = 0;\n for (j; j < lengthTarget; ++j) {\n if (bytecode[i + j] == target[j]) {\n if (j == lengthTarget - 1) {\n // Target found, replace with replacement.\n bytecode = replaceBytes(bytecode, replacement, i);\n if (replaceFirstOnly) return bytecode;\n }\n } else {\n break;\n }\n }\n }\n return bytecode;\n }\n\n /**\n * @dev Reverts if startPosition + replacement.length is bigger than bytecode.length.\n */\n function replaceBytes(bytes memory bytecode, bytes memory replacement, uint256 startPosition)\n internal\n pure\n returns (bytes memory)\n {\n uint256 lengthReplacement = replacement.length;\n for (uint256 j; j < lengthReplacement;) {\n bytecode[startPosition + j] = replacement[j];\n\n unchecked {\n ++j;\n }\n }\n return bytecode;\n }\n}\n" + }, + "contracts/test/TestUniswapV2LibraryContract.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport {UniswapV2Library} from \"../UniswapV2/periphery/libraries/UniswapV2Library.sol\";\n\ncontract TestUniswapV2LibraryContract {\n function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {\n return UniswapV2Library.sortTokens(tokenA, tokenB);\n }\n\n function pairFor(address factory, address tokenA, address tokenB) public pure returns (address pair) {\n return UniswapV2Library.pairFor(factory, tokenA, tokenB);\n }\n\n function getReserves(address factory, address tokenA, address tokenB)\n public\n view\n returns (uint256 reserveA, uint256 reserveB)\n {\n return UniswapV2Library.getReserves(factory, tokenA, tokenB);\n }\n\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) public pure returns (uint256 amountB) {\n return UniswapV2Library.quote(amountA, reserveA, reserveB);\n }\n\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n public\n view\n returns (uint256 amountOut)\n {\n return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n public\n view\n returns (uint256 amountIn)\n {\n return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountsOut(address factory, uint256 amountIn, address[] memory path)\n public\n view\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsOut(factory, amountIn, path);\n }\n\n function getAmountsIn(address factory, uint256 amountOut, address[] memory path)\n public\n view\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsIn(factory, amountOut, path);\n }\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Callee {\n function uniswapV2Call(address sender, uint256 amount0, uint256 amount1, bytes calldata data) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external pure returns (string memory);\n function symbol() external pure returns (string memory);\n function decimals() external pure returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint256);\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Factory {\n struct DefaultFees {\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n }\n\n struct Fees {\n address royaltiesBeneficiary;\n /// @dev in basis point, denominated by 10000\n uint256 royaltiesFee;\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n /// @dev if true, Fees.protocolFee is used even if set to 0\n bool protocolFeeOverride;\n /// @dev if true, Fees.lpFee is used even if set to 0\n bool lpFeeOverride;\n }\n\n event PairCreated(address indexed token0, address indexed token1, address pair, uint256);\n event DefaultFeesSet(DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(address indexed pair, address beneficiary, uint256 royaltiesFee);\n event ProtocolFeesSet(address indexed pair, uint256 protocolFee, bool overrideFee);\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n /// @notice Returns total fee pair charges\n /// @dev Fee is capped at MAX_FEE\n /// @param pair address of pair for which to calculate fees\n /// @return totalFee total fee amount denominated in basis points\n function getTotalFee(address pair) external view returns (uint256 totalFee);\n\n /// @notice Returns all fees for pair\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFees(address _pair) external view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee);\n\n /// @notice Returns all fees for pair and beneficiaries\n /// @dev Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract\n /// does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied\n /// by priority:\n /// 1. lp fee\n /// 2. royalties\n /// 3. protocol fee\n /// If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then\n /// effective fees will be allocated acording to the fee priority up to MAX_FEE value.\n /// In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.\n /// @param pair address of pair for which to calculate fees and beneficiaries\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesBeneficiary address that gets royalties\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolBeneficiary address that gets protocol fees\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFeesAndRecipients(address pair)\n external\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n );\n\n /// @return protocolFeeBeneficiary address that gets protocol fees\n function protocolFeeBeneficiary() external view returns (address protocolFeeBeneficiary);\n\n /// @notice Internal mapping to store fees for pair. It is exposed for advanced integrations\n /// and in most cases contracts should use fee getters.\n function pairFees(address pair) external view returns (address, uint256, uint256, uint256, bool, bool);\n\n function getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs() external view returns (address[] memory pairs);\n function allPairs(uint256) external view returns (address pair);\n function allPairsLength() external view returns (uint256);\n\n function createPair(address tokenA, address tokenB) external returns (address pair);\n\n /// @notice Sets default fees for all pairs\n /// @param fees struct with default fees\n function setDefaultFees(DefaultFees memory fees) external;\n\n /// @notice Sets royalties fee and beneficiary for pair\n /// @param pair address of pair for which to set fee\n /// @param beneficiary address that gets royalties\n /// @param royaltiesFee amount of royalties fee denominated in basis points\n function setRoyaltiesFee(address pair, address beneficiary, uint256 royaltiesFee) external;\n\n /// @notice Sets protocol fee for pair\n /// @param pair address of pair for which to set fee\n /// @param protocolFee amount of protocol fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setProtocolFee(address pair, uint256 protocolFee, bool overrideFee) external;\n\n /// @notice Sets lp fee for pair\n /// @param pair address of pair for which to set fee\n /// @param lpFee amount of lp fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setLpFee(address pair, uint256 lpFee, bool overrideFee) external;\n\n /// @notice Sets protocol fee beneficiary\n /// @param _beneficiary address that gets protocol fees\n function setProtocolFeeBeneficiary(address _beneficiary) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Pair {\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n /// @notice Emitted by the pool for increases to the number of observations that can be stored\n /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n /// just before a mint/swap/burn.\n /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n event IncreaseObservationCardinalityNext(\n uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew\n );\n\n function MINIMUM_LIQUIDITY() external pure returns (uint256);\n function factory() external view returns (address);\n function token0() external view returns (address);\n function token1() external view returns (address);\n function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\n function observations(uint256 index)\n external\n view\n returns (uint32 blockTimestamp, uint256 priceCumulative, bool initialized);\n\n function observe(uint32[] calldata secondsAgos) external view returns (uint256[] memory tickCumulatives);\n function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n\n function mint(address to) external returns (uint256 liquidity);\n function burn(address to) external returns (uint256 amount0, uint256 amount1);\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;\n function skim(address to) external;\n function sync() external;\n\n function initialize(address, address) external;\n}\n" + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Oracle (modifier version of Oracle.sol from UniswapV3)\n/// @notice Provides price data useful for a wide variety of system designs\n/// @dev Instances of stored oracle data, \"observations\", are collected in the oracle array\n/// Every pool is initialized with an oracle array length of 1. Anyone can pay the SSTOREs to increase the\n/// maximum length of the oracle array. New slots will be added when the array is fully populated.\n/// Observations are overwritten when the full length of the oracle array is populated.\n/// The most recent observation is available, independent of the length of the oracle array, by passing 0 to observe()\nlibrary Oracle {\n struct Observation {\n // the block timestamp of the observation\n uint32 blockTimestamp;\n // the price accumulator, i.e. price * time elapsed since the pool was first initialized\n uint256 priceCumulative;\n // whether or not the observation is initialized\n bool initialized;\n }\n\n /// @notice Transforms a previous observation into a new observation, given the passage of time and the current price values\n /// @dev blockTimestamp _must_ be chronologically equal to or greater than last.blockTimestamp, safe for 0 or 1 overflows\n /// @param last The specified observation to be transformed\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @return Observation The newly populated observation\n function transform(Observation memory last, uint32 blockTimestamp, uint256 lastPrice)\n private\n pure\n returns (Observation memory)\n {\n uint32 delta = blockTimestamp - last.blockTimestamp;\n return Observation({\n blockTimestamp: blockTimestamp,\n priceCumulative: last.priceCumulative + lastPrice * delta,\n initialized: true\n });\n }\n\n /// @notice Initialize the oracle array by writing the first slot. Called once for the lifecycle of the observations array\n /// @param self The stored oracle array\n /// @param time The time of the oracle initialization, via block.timestamp truncated to uint32\n /// @return cardinality The number of populated elements in the oracle array\n /// @return cardinalityNext The new length of the oracle array, independent of population\n function initialize(Observation[65535] storage self, uint32 time)\n internal\n returns (uint16 cardinality, uint16 cardinalityNext)\n {\n self[0] = Observation({blockTimestamp: time, priceCumulative: 0, initialized: true});\n return (1, 1);\n }\n\n /// @notice Writes an oracle observation to the array\n /// @dev Writable at most once per block. Index represents the most recently written element. cardinality and index must be tracked externally.\n /// If the index is at the end of the allowable array length (according to cardinality), and the next cardinality\n /// is greater than the current one, cardinality may be increased. This restriction is created to preserve ordering.\n /// @param self The stored oracle array\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @param cardinality The number of populated elements in the oracle array\n /// @param cardinalityNext The new length of the oracle array, independent of population\n /// @return indexUpdated The new index of the most recently written element in the oracle array\n /// @return cardinalityUpdated The new cardinality of the oracle array\n function write(\n Observation[65535] storage self,\n uint16 index,\n uint32 blockTimestamp,\n uint256 lastPrice,\n uint16 cardinality,\n uint16 cardinalityNext\n ) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated) {\n Observation memory last = self[index];\n\n // early return if we've already written an observation this block\n if (last.blockTimestamp == blockTimestamp) return (index, cardinality);\n\n // if the conditions are right, we can bump the cardinality\n if (cardinalityNext > cardinality && index == (cardinality - 1)) {\n cardinalityUpdated = cardinalityNext;\n } else {\n cardinalityUpdated = cardinality;\n }\n\n indexUpdated = (index + 1) % cardinalityUpdated;\n self[indexUpdated] = transform(last, blockTimestamp, lastPrice);\n }\n\n /// @notice Prepares the oracle array to store up to `next` observations\n /// @param self The stored oracle array\n /// @param current The current next cardinality of the oracle array\n /// @param next The proposed next cardinality which will be populated in the oracle array\n /// @return next The next cardinality which will be populated in the oracle array\n function grow(Observation[65535] storage self, uint16 current, uint16 next) internal returns (uint16) {\n require(current > 0, \"I\");\n // no-op if the passed next value isn't greater than the current next value\n if (next <= current) return current;\n // store in each slot to prevent fresh SSTOREs in swaps\n // this data will not be used because the initialized boolean is still false\n for (uint16 i = current; i < next; i++) {\n self[i].blockTimestamp = 1;\n }\n return next;\n }\n\n /// @notice comparator for 32-bit timestamps\n /// @dev safe for 0 or 1 overflows, a and b _must_ be chronologically before or equal to time\n /// @param time A timestamp truncated to 32 bits\n /// @param a A comparison timestamp from which to determine the relative position of `time`\n /// @param b From which to determine the relative position of `time`\n /// @return bool Whether `a` is chronologically <= `b`\n function lte(uint32 time, uint32 a, uint32 b) private pure returns (bool) {\n // if there hasn't been overflow, no need to adjust\n if (a <= time && b <= time) return a <= b;\n\n uint256 aAdjusted = a > time ? a : a + 2 ** 32;\n uint256 bAdjusted = b > time ? b : b + 2 ** 32;\n\n return aAdjusted <= bAdjusted;\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a target, i.e. where [beforeOrAt, atOrAfter] is satisfied.\n /// The result may be the same observation, or adjacent observations.\n /// @dev The answer must be contained in the array, used when the target is located within the stored observation\n /// boundaries: older than the most recent observation and younger, or the same age as, the oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation recorded before, or at, the target\n /// @return atOrAfter The observation recorded at, or after, the target\n function binarySearch(Observation[65535] storage self, uint32 time, uint32 target, uint16 index, uint16 cardinality)\n private\n view\n returns (Observation memory beforeOrAt, Observation memory atOrAfter)\n {\n uint256 l = (index + 1) % cardinality; // oldest observation\n uint256 r = l + cardinality - 1; // newest observation\n uint256 i;\n while (true) {\n i = (l + r) / 2;\n\n beforeOrAt = self[i % cardinality];\n\n // we've landed on an uninitialized price, keep searching higher (more recently)\n if (!beforeOrAt.initialized) {\n l = i + 1;\n continue;\n }\n\n atOrAfter = self[(i + 1) % cardinality];\n\n bool targetAtOrAfter = lte(time, beforeOrAt.blockTimestamp, target);\n\n // check if we've found the answer!\n if (targetAtOrAfter && lte(time, target, atOrAfter.blockTimestamp)) break;\n\n if (!targetAtOrAfter) r = i - 1;\n else l = i + 1;\n }\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a given target, i.e. where [beforeOrAt, atOrAfter] is satisfied\n /// @dev Assumes there is at least 1 initialized observation.\n /// Used by observeSingle() to compute the counterfactual accumulator values as of a given block timestamp.\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param lastPrice The active price at the time of the returned or simulated observation\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation which occurred at, or before, the given timestamp\n /// @return atOrAfter The observation which occurred at, or after, the given timestamp\n function getSurroundingObservations(\n Observation[65535] storage self,\n uint32 time,\n uint32 target,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n // optimistically set before to the newest observation\n beforeOrAt = self[index];\n\n // if the target is chronologically at or after the newest observation, we can early return\n if (lte(time, beforeOrAt.blockTimestamp, target)) {\n if (beforeOrAt.blockTimestamp == target) {\n // if newest observation equals target, we're in the same block, so we can ignore atOrAfter\n return (beforeOrAt, atOrAfter);\n } else {\n // otherwise, we need to transform\n return (beforeOrAt, transform(beforeOrAt, target, lastPrice));\n }\n }\n\n // now, set before to the oldest observation\n beforeOrAt = self[(index + 1) % cardinality];\n if (!beforeOrAt.initialized) beforeOrAt = self[0];\n\n // ensure that the target is chronologically at or after the oldest observation\n require(lte(time, beforeOrAt.blockTimestamp, target), \"OLD\");\n\n // if we've reached this point, we have to binary search\n return binarySearch(self, time, target, index, cardinality);\n }\n\n /// @dev Reverts if an observation at or before the desired observation timestamp does not exist.\n /// 0 may be passed as `secondsAgo' to return the current cumulative values.\n /// If called with a timestamp falling between two observations, returns the counterfactual accumulator values\n /// at exactly the timestamp between the two observations.\n /// @param self The stored oracle array\n /// @param time The current block timestamp\n /// @param secondsAgo The amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulative The price * time elapsed since the pool was first initialized, as of `secondsAgo`\n function observeSingle(\n Observation[65535] storage self,\n uint32 time,\n uint32 secondsAgo,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256 priceCumulative) {\n if (secondsAgo == 0) {\n Observation memory last = self[index];\n if (last.blockTimestamp != time) last = transform(last, time, lastPrice);\n return last.priceCumulative;\n }\n\n uint32 target = time - secondsAgo;\n\n (Observation memory beforeOrAt, Observation memory atOrAfter) =\n getSurroundingObservations(self, time, target, lastPrice, index, cardinality);\n\n if (target == beforeOrAt.blockTimestamp) {\n // we're at the left boundary\n return beforeOrAt.priceCumulative;\n } else if (target == atOrAfter.blockTimestamp) {\n // we're at the right boundary\n return atOrAfter.priceCumulative;\n } else {\n // we're in the middle\n uint32 observationTimeDelta = atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp;\n uint32 targetDelta = target - beforeOrAt.blockTimestamp;\n return beforeOrAt.priceCumulative\n + ((atOrAfter.priceCumulative - beforeOrAt.priceCumulative) / observationTimeDelta) * targetDelta;\n }\n }\n\n /// @notice Returns the accumulator values as of each time seconds ago from the given time in the array of `secondsAgos`\n /// @dev Reverts if `secondsAgos` > oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param secondsAgos Each amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulatives The price * time elapsed since the pool was first initialized, as of each `secondsAgo`\n function observe(\n Observation[65535] storage self,\n uint32 time,\n uint32[] memory secondsAgos,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256[] memory priceCumulatives) {\n require(cardinality > 0, \"I\");\n\n priceCumulatives = new uint256[](secondsAgos.length);\n for (uint256 i = 0; i < secondsAgos.length; i++) {\n priceCumulatives[i] = observeSingle(self, time, secondsAgos[i], lastPrice, index, cardinality);\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, \"ds-math-add-overflow\");\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, \"ds-math-sub-underflow\");\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, \"ds-math-mul-overflow\");\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing various math operations\n\nlibrary UniswapV2Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UQ112x112.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../../interfaces/IUniswapV2Pair.sol\";\nimport \"../../interfaces/IUniswapV2Callee.sol\";\nimport \"../../interfaces/IUniswapV2Factory.sol\";\n\nimport \"../../libraries/UniswapV2Math.sol\";\nimport \"../../libraries/UQ112x112.sol\";\nimport \"../../libraries/Oracle.sol\";\n\nimport \"../../UniswapV2ERC20.sol\";\n\n/// @dev Minimally adjusted vanilla UniswapV2Pair implementation for testing\n/// @dev CHANGELOG:\n/// - remove body of _mintFee function\n/// - refactor uint112(-1) to type(uint112).max\ncontract UniswapV2PairOriginal is UniswapV2ERC20 {\n using SafeMath for uint256;\n using UQ112x112 for uint224;\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"UniswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"UniswapV2: TRANSFER_FAILED\");\n }\n\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"UniswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"UniswapV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)\n function _mintFee(uint112, uint112) private pure returns (bool) {\n return false;\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Mint(msg.sender, amount0, amount1);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"UniswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"UniswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"UniswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));\n uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(1000 ** 2),\n \"UniswapV2: K\"\n );\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n // force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n // force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/Oracle.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../../periphery/libraries/OracleLibrary.sol\";\nimport \"../UniswapV2Factory.sol\";\n\ncontract OracleImpl {\n function consult(address pair, uint32 period) public view returns (uint256) {\n return OracleLibrary.consult(pair, period);\n }\n}\n\ncontract OracleTest is Test {\n uint256 public constant TIMESTAMP = 1668642357;\n uint256 public constant BLOCKTIME = 15;\n uint256 public START_PRICE;\n\n UniswapV2Pair public pair;\n UniswapV2Factory factory;\n\n ERC20Mintable public DAI;\n ERC20Mintable public WETH;\n OracleImpl public oracleImpl;\n\n address user1 = address(10000001);\n\n address protocolFeeBeneficiary = address(10000005);\n\n function setUp() public {\n DAI = new ERC20Mintable();\n WETH = new ERC20Mintable();\n oracleImpl = new OracleImpl();\n\n vm.warp(TIMESTAMP);\n\n factory = new UniswapV2Factory(150, 30, protocolFeeBeneficiary);\n\n pair = UniswapV2Pair(factory.createPair(address(WETH), address(DAI)));\n WETH.mint(address(pair), 1000e18);\n DAI.mint(address(pair), 1500000e18);\n pair.mint(user1);\n\n START_PRICE = 1500000e18 * 1e18 / 1000e18;\n }\n\n function _mineBlock(uint256 _time) public {\n vm.roll(block.number + 1);\n vm.warp(block.timestamp + _time);\n }\n\n function _swap(uint256 _wethIn, uint256 _daiIn) public returns (uint256 amountOut) {\n _mineBlock(BLOCKTIME);\n\n (uint112 reserve0, uint112 reserve1,) = pair.getReserves();\n if (_wethIn > 0) {\n uint256 amount1Out =\n UniswapV2Library.getAmountOut(_wethIn, reserve0, reserve1, address(pair), address(factory));\n WETH.mint(address(pair), _wethIn);\n pair.swap(0, amount1Out, user1, bytes(\"\"));\n amountOut = amount1Out;\n } else if (_daiIn > 0) {\n uint256 amount0Out =\n UniswapV2Library.getAmountOut(_daiIn, reserve1, reserve0, address(pair), address(factory));\n DAI.mint(address(pair), _daiIn);\n pair.swap(amount0Out, 0, user1, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testTokensOrder() public {\n assertEq(address(WETH), pair.token0());\n assertEq(address(DAI), pair.token1());\n }\n\n function testConsultOld() public {\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1800);\n\n assertEq(pair.lastPrice(), 0);\n\n _swap(0.01e18, 0);\n vm.warp(block.timestamp + BLOCKTIME);\n assertEq(oracleImpl.consult(address(pair), 15), START_PRICE);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 16);\n\n vm.warp(block.timestamp + 1800 - BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 1800), START_PRICE);\n\n _swap(1e18, 0);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n struct TestAction {\n uint256 wethIn;\n uint256 daiIn;\n uint256 timetravelBefore;\n uint256 timetravelAfter;\n uint32 period;\n uint256 TWAP;\n uint16 observationCardinalityNext;\n uint256 observationIndex;\n }\n\n // workaround for \"UnimplementedFeatureError: Copying of type struct memory to storage not yet supported.\"\n uint256 public constant depositTestCasesLength = 22;\n\n function getTestAction(uint256 _index) public view returns (TestAction memory) {\n TestAction[depositTestCasesLength] memory testSwapCases = [\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 60,\n period: 60,\n TWAP: START_PRICE,\n observationCardinalityNext: 120,\n observationIndex: 0\n }),\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 1800,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1499970495435267142183,\n observationCardinalityNext: 120,\n observationIndex: 1\n }),\n TestAction({\n wethIn: 100e18, // big trade\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 45,\n period: 1800,\n TWAP: 1499969511978807824364,\n observationCardinalityNext: 120,\n observationIndex: 2\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 1363107217423634267487,\n observationCardinalityNext: 120,\n observationIndex: 3\n }),\n TestAction({\n wethIn: 0,\n daiIn: 1000000e18, // huge trade\n timetravelBefore: 900,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1243352310158670807355,\n observationCardinalityNext: 120,\n observationIndex: 4\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1263646160072652749974,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 60 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1344821559728580520453,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 120 sec since huge trade\n timetravelAfter: 330, // 450 sec since huge trade\n period: 1800,\n TWAP: 1872461657492111028567,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 510 sec since huge trade\n timetravelAfter: 390, // 900 sec since huge trade\n period: 1800,\n TWAP: 2481277154911569307160,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 960 sec since huge trade\n timetravelAfter: 390, // 1350 sec since huge trade\n period: 1800,\n TWAP: 3090092652331027585753,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 15, // 1380 sec since huge trade\n timetravelAfter: 400, // 1780 sec since huge trade\n period: 1800,\n TWAP: 3671849683198509940853,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 5, // 1800 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 1860 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 145, // 2020 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 250e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921715,\n observationCardinalityNext: 120,\n observationIndex: 6\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 2783849579014797350624,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 500000e18,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290057,\n observationCardinalityNext: 120,\n observationIndex: 8\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 2554290763490825493524,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n })\n ];\n\n return testSwapCases[_index];\n }\n\n function testConsult() public {\n for (uint256 i = 0; i < depositTestCasesLength; i++) {\n TestAction memory testCase = getTestAction(i);\n\n vm.warp(block.timestamp + testCase.timetravelBefore);\n _swap(testCase.wethIn, testCase.daiIn);\n vm.warp(block.timestamp + testCase.timetravelAfter);\n\n assertEq(oracleImpl.consult(address(pair), testCase.period), testCase.TWAP);\n\n if (testCase.observationCardinalityNext > pair.observationCardinalityNext()) {\n pair.increaseObservationCardinalityNext(testCase.observationCardinalityNext);\n }\n\n assertEq(pair.observationIndex(), testCase.observationIndex);\n }\n }\n\n function testObservationsSingleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, 0);\n assertEq(initialized, true);\n\n _swap(0.01e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME);\n assertEq(initialized, true);\n\n _swap(1e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n function _assertCardinality(\n uint16 observationIndex,\n uint16 observationCardinality,\n uint16 observationCardinalityNext\n ) public {\n assertEq(pair.observationIndex(), observationIndex);\n assertEq(pair.observationCardinality(), observationCardinality);\n assertEq(pair.observationCardinalityNext(), observationCardinalityNext);\n }\n\n function testIncreaseObservationCardinalityNext() public {\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n pair.increaseObservationCardinalityNext(3);\n _assertCardinality(0, 1, 3);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(0, 3, 3);\n\n pair.increaseObservationCardinalityNext(10);\n _assertCardinality(0, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(3, 10, 10);\n\n for (uint256 i = 0; i < 6; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 10);\n\n _swap(1e18, 0);\n _assertCardinality(0, 10, 10);\n\n pair.increaseObservationCardinalityNext(15);\n _assertCardinality(0, 10, 15);\n\n for (uint256 i = 0; i < 9; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 15);\n\n _swap(1e18, 0);\n _assertCardinality(10, 15, 15);\n\n for (uint256 i = 0; i < 4; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(14, 15, 15);\n\n _swap(1e18, 0);\n _assertCardinality(0, 15, 15);\n }\n\n function testObservationsMultipleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n _swap(0.01e18, 0);\n assertEq(pair.lastPrice(), START_PRICE);\n\n (uint32 blockTimestamp0, uint256 priceCumulative0, bool initialized0) = pair.observations(0);\n assertEq(blockTimestamp0, block.timestamp);\n assertEq(priceCumulative0, START_PRICE * BLOCKTIME);\n assertEq(initialized0, true);\n\n pair.increaseObservationCardinalityNext(3);\n\n _swap(100e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(0);\n assertEq(blockTimestamp, blockTimestamp0);\n assertEq(priceCumulative, priceCumulative0);\n assertEq(initialized, initialized0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(1);\n assertEq(blockTimestamp, blockTimestamp0 + BLOCKTIME);\n assertEq(priceCumulative, priceCumulative0 + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Factory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\n\nimport {ERC20} from \"lib/ERC20Mintable.sol\";\n\nimport {IUniswapV2Factory, UniswapV2Factory} from \"../UniswapV2Factory.sol\";\nimport {TestUniswapV2LibraryContract} from \"../../../test/TestUniswapV2LibraryContract.sol\";\nimport {TestHelper} from \"../../../test/TestHelper.sol\";\n\ncontract UniswapV2FactoryTest is Test, TestHelper {\n UniswapV2Factory factory;\n TestUniswapV2LibraryContract uniswapV2Library;\n address pool1;\n address hacker = address(10000004);\n address owner = address(10000005);\n\n address tokenA = address(10000006);\n address tokenB = address(10000007);\n\n address protocolFeeBeneficiary = address(10000005);\n\n uint256 tooBigFee;\n uint256 MAX_FEE;\n\n event PairCreated(address indexed token0, address indexed token1, address pair, uint256);\n event DefaultFeesSet(IUniswapV2Factory.DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(address indexed pair, address beneficiary, uint256 royaltiesFee);\n event ProtocolFeesSet(address indexed pair, uint256 protocolFee, bool overrideFee);\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n function setUp() public {\n uniswapV2Library = new TestUniswapV2LibraryContract();\n bytes memory args = abi.encode();\n patchUniswapV2Library(address(uniswapV2Library), \"TestUniswapV2LibraryContract.sol\", args);\n\n vm.prank(owner);\n factory = new UniswapV2Factory(0, 0, protocolFeeBeneficiary);\n\n MAX_FEE = factory.MAX_FEE();\n tooBigFee = MAX_FEE + 1;\n\n pool1 = _createPair(tokenA, tokenB);\n }\n\n function _assertFees(\n address _expectedPool,\n address _expectedRoyaltiesBeneficiary,\n uint256 _expectedRoyaltiesFee,\n uint256 _expectedProtocolFee,\n uint256 _expectedLpFee,\n address _expectedProtocolFeeBeneficiary\n ) public {\n (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n ) = factory.getFeesAndRecipients(_expectedPool);\n\n assertEq(lpFee, _expectedLpFee);\n assertEq(royaltiesBeneficiary, _expectedRoyaltiesBeneficiary);\n assertEq(royaltiesFee, _expectedRoyaltiesFee);\n assertEq(protocolBeneficiary, _expectedProtocolFeeBeneficiary);\n assertEq(protocolFee, _expectedProtocolFee);\n }\n\n function _createPair(address _tokenA, address _tokenB) public returns (address pair) {\n vm.mockCall(_tokenA, abi.encodeCall(ERC20.decimals, ()), abi.encode(18));\n vm.mockCall(_tokenB, abi.encodeCall(ERC20.decimals, ()), abi.encode(18));\n\n pair = factory.createPair(_tokenA, _tokenB);\n }\n\n function testSetDefaultFees(uint256 _lpFee, uint256 _protocolFee) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_protocolFee + _lpFee <= MAX_FEE);\n\n (uint256 protocolFee, uint256 lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n\n _assertFees(pool1, address(0), 0, 0, 0, protocolFeeBeneficiary);\n\n IUniswapV2Factory.DefaultFees memory fees =\n IUniswapV2Factory.DefaultFees({protocolFee: _protocolFee, lpFee: _lpFee});\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setDefaultFees(fees);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit DefaultFeesSet(fees);\n factory.setDefaultFees(fees);\n\n (protocolFee, lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, _lpFee);\n\n _assertFees(pool1, address(0), 0, _protocolFee, _lpFee, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee > MAX_FEE\");\n factory.setDefaultFees(IUniswapV2Factory.DefaultFees({protocolFee: tooBigFee, lpFee: _lpFee}));\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: lpFee > MAX_FEE\");\n factory.setDefaultFees(IUniswapV2Factory.DefaultFees({protocolFee: _protocolFee, lpFee: tooBigFee}));\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n factory.setDefaultFees(IUniswapV2Factory.DefaultFees({protocolFee: tooBigFee / 2 + 1, lpFee: tooBigFee / 2}));\n }\n\n function testSetLpFee(address _pair, uint256 _lpFee, address _tokenA, address _tokenB) public {\n vm.assume(_lpFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setLpFee(_pair, _lpFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setLpFee(_pair, _lpFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit LpFeesSet(_pair, _lpFee, true);\n factory.setLpFee(_pair, _lpFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n assertEq(lpFee, _lpFee);\n assertFalse(protocolFeeOverride);\n assertTrue(lpFeeOverride);\n\n _assertFees(_pair, address(0), 0, 0, _lpFee, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _lpFee > MAX_FEE\");\n factory.setLpFee(_pair, tooBigFee, true);\n }\n\n function testSetRoyaltiesFee(\n address _pair,\n address _royaltiesBeneficiary,\n uint256 _royaltiesFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_royaltiesFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _beneficiary invalid\");\n factory.setRoyaltiesFee(_pair, address(0), _royaltiesFee);\n\n vm.assume(_royaltiesBeneficiary != address(0));\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit RoyaltiesFeesSet(_pair, _royaltiesBeneficiary, _royaltiesFee);\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, _royaltiesBeneficiary);\n assertEq(royaltiesFee, _royaltiesFee);\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n assertFalse(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(_pair, _royaltiesBeneficiary, _royaltiesFee, 0, 0, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _royaltiesFee > MAX_FEE\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, tooBigFee);\n }\n\n function testSetProtocolFee(address _pair, uint256 _protocolFee, address _tokenA, address _tokenB) public {\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_pair != pool1);\n\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeesSet(_pair, _protocolFee, true);\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, 0);\n assertTrue(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(_pair, address(0), 0, _protocolFee, 0, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _protocolFee > MAX_FEE\");\n factory.setProtocolFee(_pair, tooBigFee, true);\n }\n\n function testSetProtocolFeeBeneficiary(address _beneficiary) public {\n vm.assume(_beneficiary != address(0));\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n assertEq(factory.protocolFeeBeneficiary(), _beneficiary);\n _assertFees(pool1, address(0), 0, 0, 0, _beneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: BENEFICIARY\");\n factory.setProtocolFeeBeneficiary(address(0));\n }\n\n function testGetFees(uint256 _lpFee, uint256 _royaltiesFee, uint256 _protocolFee) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_royaltiesFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n\n vm.startPrank(owner);\n factory.setLpFee(pool1, _lpFee, true);\n factory.setRoyaltiesFee(pool1, owner, _royaltiesFee);\n factory.setProtocolFee(pool1, _protocolFee, true);\n vm.stopPrank();\n\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = factory.getFees(pool1);\n uint256 totalFee = lpFee + royaltiesFee + protocolFee;\n\n assertEq(lpFee, _lpFee);\n\n /// logic below should check that:\n /// - totalFee is never above MAX_FEE\n /// - if _lpFee + _royaltiesFee + _protocolFee > MAX_FEE\n /// then we fill totalFee with fees in following priority:\n /// 1. lpFee\n /// 2. royaltiesFee\n /// 3. protocolFee\n /// until we get to MAX_FEE\n\n if (_lpFee < MAX_FEE) {\n if (_lpFee + _royaltiesFee < MAX_FEE) {\n assertEq(royaltiesFee, _royaltiesFee);\n\n if (_lpFee + _royaltiesFee + _protocolFee <= MAX_FEE) {\n assertEq(protocolFee, _protocolFee);\n assertEq(_lpFee + _royaltiesFee + _protocolFee, factory.getTotalFee(pool1));\n } else {\n assertEq(protocolFee, MAX_FEE - _lpFee - _royaltiesFee);\n }\n } else {\n assertEq(royaltiesFee, MAX_FEE - _lpFee);\n assertEq(protocolFee, 0);\n }\n } else {\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n }\n\n assertEq(totalFee, factory.getTotalFee(pool1));\n assertTrue(totalFee <= MAX_FEE);\n }\n\n /// @notice we cannot test the create2 address, because the foundry and hardhat generated bytecode\n /// is different which makes both the hash and the address different\n function testCreatePairUni(address _tokenA, address _tokenB) public {\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.mockCall(_tokenA, abi.encodeCall(ERC20.decimals, ()), abi.encode(18));\n vm.mockCall(_tokenB, abi.encodeCall(ERC20.decimals, ()), abi.encode(18));\n\n (address token0, address token1) = uniswapV2Library.sortTokens(_tokenA, _tokenB);\n address expectedPair = uniswapV2Library.pairFor(address(factory), _tokenA, _tokenB);\n\n vm.expectEmit(true, true, true, true);\n emit PairCreated(token0, token1, expectedPair, 2);\n address pair = factory.createPair(_tokenA, _tokenB);\n\n // assertEq(pair, expectedPair);\n assertEq(factory.getPair(_tokenA, _tokenB), pair);\n assertEq(factory.getPair(_tokenB, _tokenA), pair);\n assertEq(factory.allPairs(1), pair);\n assertEq(factory.allPairsLength(), 2);\n\n address[] memory allPairs = factory.allPairs();\n assertEq(allPairs[0], pool1);\n assertEq(allPairs[1], pair);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Pair.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../UniswapV2Factory.sol\";\nimport \"./mock/UniswapV2PairOriginal.sol\";\n\ncontract UniswapV2PairTest is Test {\n UniswapV2Pair pair;\n UniswapV2Pair pairWithFees;\n UniswapV2PairOriginal pairOriginal;\n UniswapV2Factory factory;\n\n ERC20Mintable token0;\n ERC20Mintable token1;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n address royaltiesBeneficiary = address(10000006);\n\n uint256 royaltiesFee = 50;\n uint256 protocolFee = 50;\n\n function setUp() public {\n address tokenA = address(new ERC20Mintable());\n address tokenB = address(new ERC20Mintable());\n (tokenA, tokenB) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n token0 = ERC20Mintable(tokenA);\n token1 = ERC20Mintable(tokenB);\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n vm.startPrank(address(factory));\n\n pair = new UniswapV2Pair();\n pair.initialize(address(token0), address(token1));\n\n pairOriginal = new UniswapV2PairOriginal();\n pairOriginal.initialize(address(token0), address(token1));\n\n pairWithFees = UniswapV2Pair(factory.createPair(address(token0), address(token1)));\n\n vm.stopPrank();\n\n factory.setRoyaltiesFee(address(pairWithFees), royaltiesBeneficiary, royaltiesFee);\n factory.setProtocolFee(address(pairWithFees), protocolFee, true);\n factory.setProtocolFeeBeneficiary(protocolFeeBeneficiary);\n }\n\n function _assertPairs(UniswapV2Pair _pair, UniswapV2PairOriginal _pairOriginal) public {\n assertEq(_pair.token0(), _pairOriginal.token0());\n assertEq(_pair.token1(), _pairOriginal.token1());\n\n (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _pair.getReserves();\n (uint112 _reserve0Org, uint112 _reserve1Org, uint32 _blockTimestampLastOrg) = _pairOriginal.getReserves();\n\n assertEq(_reserve0, _reserve0Org);\n assertEq(_reserve1, _reserve1Org);\n assertEq(_blockTimestampLast, _blockTimestampLastOrg);\n\n assertEq(_pair.factory(), _pairOriginal.factory());\n\n assertEq(token0.balanceOf(address(_pair)), token0.balanceOf(address(_pairOriginal)));\n assertEq(token1.balanceOf(address(_pair)), token1.balanceOf(address(_pairOriginal)));\n }\n\n function _addLiquidity(address _pair, uint256 _amount0, uint256 _amount1, address _to)\n public\n returns (uint256 liquidity)\n {\n token0.mint(_pair, _amount0);\n token1.mint(_pair, _amount1);\n\n liquidity = UniswapV2Pair(_pair).mint(_to);\n }\n\n function testMintBurnRegression(uint112 _amount0, uint112 _amount1) public {\n vm.assume(_amount0 > pair.MINIMUM_LIQUIDITY());\n vm.assume(_amount1 > pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidity = _addLiquidity(address(pair), _amount0, _amount1, user1);\n assertEq(liquidity, pair.totalSupply() - pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidityOriginal = _addLiquidity(address(pairOriginal), _amount0, _amount1, user1);\n assertEq(liquidityOriginal, pairOriginal.totalSupply() - pairOriginal.MINIMUM_LIQUIDITY());\n\n assertEq(liquidity, liquidityOriginal);\n\n _assertPairs(pair, pairOriginal);\n\n vm.prank(user1);\n pair.transfer(address(pair), liquidity);\n (uint256 amount0, uint256 amount1) = pair.burn(user1);\n\n vm.prank(user1);\n pairOriginal.transfer(address(pairOriginal), liquidity);\n (uint256 amount0Org, uint256 amount1Org) = pairOriginal.burn(user2);\n\n assertEq(amount0, amount0Org);\n assertEq(amount1, amount1Org);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function _swap(address _pair, uint256 _amount0In, uint256 _amount1In, address _to)\n public\n returns (uint256 amountOut)\n {\n (uint112 reserve0, uint112 reserve1,) = UniswapV2Pair(_pair).getReserves();\n token0.mint(_pair, _amount0In);\n token1.mint(_pair, _amount1In);\n\n if (_amount0In > _amount1In) {\n uint256 amount1Out = UniswapV2Library.getAmountOut(_amount0In, reserve0, reserve1, _pair, address(factory));\n UniswapV2Pair(_pair).swap(0, amount1Out, _to, bytes(\"\"));\n amountOut = amount1Out;\n } else {\n uint256 amount0Out = UniswapV2Library.getAmountOut(_amount1In, reserve1, reserve0, _pair, address(factory));\n UniswapV2Pair(_pair).swap(amount0Out, 0, _to, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testSwapRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max));\n _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max));\n _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max));\n _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max));\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n uint256 amount1Out = _swap(address(pair), _amount0In, 0, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n assertEq(amount1Out, amount1OutOrg);\n _assertPairs(pair, pairOriginal);\n\n for (uint256 i = 0; i < 20; i++) {\n if (i % 2 == 0) {\n _swap(address(pair), _amount0In, 0, user1);\n _swap(address(pairOriginal), _amount0In, 0, user2);\n } else {\n _swap(address(pair), 0, _amount1In, user1);\n _swap(address(pairOriginal), 0, _amount1In, user2);\n }\n }\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSkimRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max));\n _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max));\n _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max));\n _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max));\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n pair.skim(user1);\n assertEq(token0.balanceOf(user1), _amount0In);\n assertEq(token1.balanceOf(user1), _amount1In);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n pairOriginal.skim(user2);\n assertEq(token0.balanceOf(user2), _amount0In);\n assertEq(token1.balanceOf(user2), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSyncRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max));\n _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max));\n _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max));\n _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max));\n\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n\n pair.sync();\n pairOriginal.sync();\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSwapWithFees(\n uint96 _reserve0,\n uint96 _reserve1,\n uint72 _amount0In,\n uint72 _amount1In,\n uint256 _hijackAmount\n ) public {\n _reserve0 = uint96(bound(_reserve0, 10000e18, type(uint96).max));\n _reserve1 = uint96(bound(_reserve1, 10000e18, type(uint96).max));\n _amount0In = uint72(bound(_amount0In, 0.001e18, type(uint72).max));\n _amount1In = uint72(bound(_amount1In, 0.001e18, type(uint72).max));\n _hijackAmount = uint72(bound(_hijackAmount, 0.001e18, type(uint72).max));\n vm.assume(_amount0In > _hijackAmount);\n\n _addLiquidity(address(pairWithFees), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pairWithFees, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n (, address beneficiary, uint256 royalties, address protocolBeneficiary, uint256 protocolBeneficiaryFee) =\n factory.getFeesAndRecipients(address(pairWithFees));\n\n assertEq(beneficiary, royaltiesBeneficiary);\n assertEq(royalties, royaltiesFee);\n assertEq(token0.balanceOf(beneficiary), 0);\n uint256 royaltiesAmount = _amount0In * royalties / 10000;\n\n assertEq(protocolBeneficiary, protocolFeeBeneficiary);\n assertEq(protocolBeneficiaryFee, protocolFee);\n assertEq(token0.balanceOf(protocolBeneficiary), 0);\n uint256 protocolFeeAmount = _amount0In * protocolBeneficiaryFee / 10000;\n\n uint256 amount1Out = _swap(address(pairWithFees), _amount0In, _hijackAmount, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n assertEq(token0.balanceOf(beneficiary), royaltiesAmount);\n assertEq(token0.balanceOf(protocolBeneficiary), protocolFeeAmount);\n assertEq(token1.balanceOf(beneficiary), _hijackAmount * royalties / 10000);\n assertEq(token1.balanceOf(protocolBeneficiary), _hijackAmount * protocolBeneficiaryFee / 10000);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n uint256 maxPercentDelta = (royaltiesFee + protocolFee + 1) * 1e18 / 10000;\n assertApproxEqRel(amount1Out, amount1OutOrg, maxPercentDelta);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./interfaces/IUniswapV2ERC20.sol\";\nimport \"./libraries/SafeMath.sol\";\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using SafeMath for uint256;\n\n string public constant name = \"Magicswap V2\";\n string public constant symbol = \"MAGIC-V2\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH =\n 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint256) public nonces;\n\n constructor() {\n uint256 chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(bytes(\"1\")),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint256 value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint256 value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external\n {\n require(deadline >= block.timestamp, \"MagicswapV2: EXPIRED\");\n bytes32 digest = keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"MagicswapV2: INVALID_SIGNATURE\");\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\n\nimport \"./interfaces/IUniswapV2Factory.sol\";\nimport \"./UniswapV2Pair.sol\";\n\ncontract UniswapV2Factory is IUniswapV2Factory, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n\n /// @dev Fee is denominated in basis points so 5000 / 10000 = 50%\n uint256 public constant MAX_FEE = 5000;\n\n address public protocolFeeBeneficiary;\n\n mapping(address => mapping(address => address)) public getPair;\n EnumerableSet.AddressSet private _allPairs;\n\n DefaultFees public defaultFees;\n mapping(address => Fees) public pairFees;\n\n constructor(uint256 _defaultProtocolFee, uint256 _defaultLpFee, address _protocolFeeBeneficiary) {\n DefaultFees memory startFees = DefaultFees({protocolFee: _defaultProtocolFee, lpFee: _defaultLpFee});\n\n setDefaultFees(startFees);\n setProtocolFeeBeneficiary(_protocolFeeBeneficiary);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getTotalFee(address _pair) public view returns (uint256) {\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = _getFees(_pair);\n return lpFee + royaltiesFee + protocolFee;\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFees(address _pair) public view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n return _getFees(_pair);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFeesAndRecipients(address _pair)\n public\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n )\n {\n (lpFee, royaltiesFee, protocolFee) = _getFees(_pair);\n\n royaltiesBeneficiary = pairFees[_pair].royaltiesBeneficiary;\n protocolBeneficiary = protocolFeeBeneficiary;\n }\n\n function allPairs() external view returns (address[] memory) {\n return _allPairs.values();\n }\n\n function allPairs(uint256 _index) external view returns (address) {\n return _allPairs.at(_index);\n }\n\n function allPairsLength() external view returns (uint256) {\n return _allPairs.length();\n }\n\n function createPair(address tokenA, address tokenB) external returns (address pair) {\n require(tokenA != tokenB, \"MagicswapV2: IDENTICAL_ADDRESSES\");\n (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"MagicswapV2: ZERO_ADDRESS\");\n require(getPair[token0][token1] == address(0), \"MagicswapV2: PAIR_EXISTS\"); // single check is sufficient\n bytes memory bytecode = type(UniswapV2Pair).creationCode;\n bytes32 salt = keccak256(abi.encodePacked(token0, token1));\n assembly {\n pair := create2(0, add(bytecode, 32), mload(bytecode), salt)\n }\n IUniswapV2Pair(pair).initialize(token0, token1);\n getPair[token0][token1] = pair;\n getPair[token1][token0] = pair; // populate mapping in the reverse direction\n _allPairs.add(pair);\n emit PairCreated(token0, token1, pair, _allPairs.length());\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setDefaultFees(DefaultFees memory _fees) public onlyOwner {\n require(_fees.protocolFee <= MAX_FEE, \"MagicswapV2: protocolFee > MAX_FEE\");\n require(_fees.lpFee <= MAX_FEE, \"MagicswapV2: lpFee > MAX_FEE\");\n require(_fees.protocolFee + _fees.lpFee <= MAX_FEE, \"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n\n defaultFees = _fees;\n\n emit DefaultFeesSet(_fees);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setLpFee(address _pair, uint256 _lpFee, bool _overrideFee) external onlyOwner {\n require(_lpFee <= MAX_FEE, \"MagicswapV2: _lpFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].lpFee = _lpFee;\n pairFees[_pair].lpFeeOverride = _overrideFee;\n\n emit LpFeesSet(_pair, _lpFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setRoyaltiesFee(address _pair, address _beneficiary, uint256 _royaltiesFee) external onlyOwner {\n require(_royaltiesFee <= MAX_FEE, \"MagicswapV2: _royaltiesFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n require(_beneficiary != address(0), \"MagicswapV2: _beneficiary invalid\");\n\n pairFees[_pair].royaltiesBeneficiary = _beneficiary;\n pairFees[_pair].royaltiesFee = _royaltiesFee;\n\n emit RoyaltiesFeesSet(_pair, _beneficiary, _royaltiesFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFee(address _pair, uint256 _protocolFee, bool _overrideFee) external onlyOwner {\n require(_protocolFee <= MAX_FEE, \"MagicswapV2: _protocolFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].protocolFee = _protocolFee;\n pairFees[_pair].protocolFeeOverride = _overrideFee;\n\n emit ProtocolFeesSet(_pair, _protocolFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFeeBeneficiary(address _beneficiary) public onlyOwner {\n require(_beneficiary != address(0), \"MagicswapV2: BENEFICIARY\");\n protocolFeeBeneficiary = _beneficiary;\n\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n }\n\n function _getLpFee(address _pair) internal view returns (uint256 lpFee) {\n if (pairFees[_pair].lpFeeOverride) {\n return pairFees[_pair].lpFee;\n } else {\n return defaultFees.lpFee;\n }\n }\n\n function _getRoyaltiesFee(address _pair) internal view returns (uint256 royaltiesFee) {\n return pairFees[_pair].royaltiesFee;\n }\n\n function _getProtocolFee(address _pair) internal view returns (uint256 protocolFee) {\n if (pairFees[_pair].protocolFeeOverride) {\n return pairFees[_pair].protocolFee;\n } else {\n return defaultFees.protocolFee;\n }\n }\n\n function _getFees(address _pair) internal view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n lpFee = _getLpFee(_pair);\n /// lpFee should never be above MAX_FEE but never too safe.\n /// If lpFee is set to MAX_FEE then we know there's no more space for other fees\n if (lpFee >= MAX_FEE) {\n return (MAX_FEE, 0, 0);\n }\n\n royaltiesFee = _getRoyaltiesFee(_pair);\n /// if royaltiesFee + lpFee is greater than MAX_FEE, then decrease royaltiesFee\n /// and return as we know there's no more space for other fees\n if (royaltiesFee >= MAX_FEE - lpFee) {\n return (lpFee, MAX_FEE - lpFee, 0);\n }\n\n protocolFee = _getProtocolFee(_pair);\n /// if protocolFee + royaltiesFee + lpFee is greater than MAX_FEE, then decrease protocolFee\n if (protocolFee > MAX_FEE - lpFee - royaltiesFee) {\n protocolFee = MAX_FEE - lpFee - royaltiesFee;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"./interfaces/IUniswapV2Pair.sol\";\nimport \"./interfaces/IUniswapV2Factory.sol\";\n\nimport \"./libraries/UniswapV2Math.sol\";\nimport \"./libraries/Oracle.sol\";\n\nimport \"./UniswapV2ERC20.sol\";\n\ncontract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {\n using SafeMath for uint256;\n using Oracle for Oracle.Observation[65535];\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n uint256 public constant BASIS_POINTS = 10000;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n // decimal points of token0\n uint256 public TOKEN0_DECIMALS;\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n // the most recent price of token1/token0. Inherits decimals of token1.\n uint256 public lastPrice;\n // the most-recently updated index of the observations array\n uint16 public observationIndex;\n // the current maximum number of observations that are being stored\n uint16 public observationCardinality;\n // the next maximum number of observations to store, triggered in observations.write\n uint16 public observationCardinalityNext;\n\n Oracle.Observation[65535] public override observations;\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"MagicswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"MagicswapV2: TRANSFER_FAILED\");\n }\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"MagicswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n\n TOKEN0_DECIMALS = UniswapV2ERC20(_token0).decimals();\n\n (uint16 cardinality, uint16 cardinalityNext) = observations.initialize(_blockTimestamp());\n\n observationIndex = 0;\n observationCardinality = cardinality;\n observationCardinalityNext = cardinalityNext;\n }\n\n function _blockTimestamp() internal view virtual returns (uint32) {\n return uint32(block.timestamp); // truncation is desired\n }\n\n /// @dev update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"MagicswapV2: OVERFLOW\");\n\n uint32 blockTimestamp;\n uint32 timeElapsed;\n unchecked {\n blockTimestamp = uint32(block.timestamp % 2 ** 32);\n timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n }\n\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // this is first trade of the block and reserves are not yet updated\n lastPrice = 10 ** TOKEN0_DECIMALS * _reserve1 / _reserve0;\n\n // write an oracle entry\n (observationIndex, observationCardinality) = observations.write(\n observationIndex, _blockTimestamp(), lastPrice, observationCardinality, observationCardinalityNext\n );\n }\n\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n /// @dev Calculates fees and sends them to beneficiaries\n function _takeFees(uint256 balance0Adjusted, uint256 balance1Adjusted, uint256 amount0In, uint256 amount1In)\n internal\n returns (uint256 balance0, uint256 balance1)\n {\n (, address royaltiesBeneficiary, uint256 royaltiesFee, address protocolFeeBeneficiary, uint256 protocolFee) =\n IUniswapV2Factory(factory).getFeesAndRecipients(address(this));\n\n address _token0 = token0;\n address _token1 = token1;\n\n for (uint8 i = 0; i < 2; i++) {\n address feeToken = i == 0 ? _token0 : _token1;\n uint256 swapAmount = i == 0 ? amount0In : amount1In;\n\n if (swapAmount > 0) {\n uint256 royaltiesFeeAmount = swapAmount * royaltiesFee / BASIS_POINTS;\n\n // send royalties\n if (royaltiesFeeAmount > 0) {\n _safeTransfer(feeToken, royaltiesBeneficiary, royaltiesFeeAmount);\n }\n\n uint256 protocolFeeAmount = swapAmount * protocolFee / BASIS_POINTS;\n\n // send protocol fee\n if (protocolFeeAmount > 0) {\n _safeTransfer(feeToken, protocolFeeBeneficiary, protocolFeeAmount);\n }\n }\n }\n\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n // Make sure that either balance does not go below adjusted balance used for K calcualtions.\n // If balances after fee transfers are above or equal adjusted balances then K still holds.\n require(balance0 >= balance0Adjusted / BASIS_POINTS, \"MagicswapV2: balance0Adjusted\");\n require(balance1 >= balance1Adjusted / BASIS_POINTS, \"MagicswapV2: balance1Adjusted\");\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Mint(msg.sender, amount0, amount1);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n /// @dev keeping bytes parameter for backward compatibility of the interface\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"MagicswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"MagicswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"MagicswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"MagicswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(address(this));\n uint256 balance0Adjusted = balance0.mul(BASIS_POINTS).sub(amount0In.mul(totalFee));\n uint256 balance1Adjusted = balance1.mul(BASIS_POINTS).sub(amount1In.mul(totalFee));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(BASIS_POINTS ** 2),\n \"MagicswapV2: K\"\n );\n (balance0, balance1) = _takeFees(balance0Adjusted, balance1Adjusted, amount0In, amount1In);\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n /// @dev Read TWAP price\n function observe(uint32[] calldata secondsAgos)\n external\n view\n override\n returns (uint256[] memory priceCumulatives)\n {\n return observations.observe(_blockTimestamp(), secondsAgos, lastPrice, observationIndex, observationCardinality);\n }\n\n /// @dev Increase number of data points for price history\n function increaseObservationCardinalityNext(uint16 _observationCardinalityNext) external override lock {\n uint16 observationCardinalityNextOld = observationCardinalityNext; // for the event\n uint16 observationCardinalityNextNew =\n observations.grow(observationCardinalityNextOld, _observationCardinalityNext);\n observationCardinalityNext = observationCardinalityNextNew;\n if (observationCardinalityNextOld != observationCardinalityNextNew) {\n emit IncreaseObservationCardinalityNext(observationCardinalityNextOld, observationCardinalityNextNew);\n }\n }\n\n /// @dev force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n /// @dev force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/Babylonian.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// computes square roots using the babylonian method\n// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method\nlibrary Babylonian {\n // credit for this implementation goes to\n // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687\n function sqrt(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);\n // however that code costs significantly more gas\n uint256 xx = x;\n uint256 r = 1;\n if (xx >= 0x100000000000000000000000000000000) {\n xx >>= 128;\n r <<= 64;\n }\n if (xx >= 0x10000000000000000) {\n xx >>= 64;\n r <<= 32;\n }\n if (xx >= 0x100000000) {\n xx >>= 32;\n r <<= 16;\n }\n if (xx >= 0x10000) {\n xx >>= 16;\n r <<= 8;\n }\n if (xx >= 0x100) {\n xx >>= 8;\n r <<= 4;\n }\n if (xx >= 0x10) {\n xx >>= 4;\n r <<= 2;\n }\n if (xx >= 0x8) {\n r <<= 1;\n }\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1; // Seven iterations should be enough\n uint256 r1 = x / r;\n return (r < r1 ? r : r1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/BitMath.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nlibrary BitMath {\n // returns the 0 indexed position of the most significant bit of the input x\n // s.t. x >= 2**msb and x < 2**(msb+1)\n function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::mostSignificantBit: zero\");\n\n if (x >= 0x100000000000000000000000000000000) {\n x >>= 128;\n r += 128;\n }\n if (x >= 0x10000000000000000) {\n x >>= 64;\n r += 64;\n }\n if (x >= 0x100000000) {\n x >>= 32;\n r += 32;\n }\n if (x >= 0x10000) {\n x >>= 16;\n r += 16;\n }\n if (x >= 0x100) {\n x >>= 8;\n r += 8;\n }\n if (x >= 0x10) {\n x >>= 4;\n r += 4;\n }\n if (x >= 0x4) {\n x >>= 2;\n r += 2;\n }\n if (x >= 0x2) r += 1;\n }\n\n // returns the 0 indexed position of the least significant bit of the input x\n // s.t. (x & 2**lsb) != 0 and (x & (2**(lsb) - 1)) == 0)\n // i.e. the bit at the index is set and the mask of all lower bits is 0\n function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::leastSignificantBit: zero\");\n\n r = 255;\n if (x & type(uint128).max > 0) {\n r -= 128;\n } else {\n x >>= 128;\n }\n if (x & type(uint64).max > 0) {\n r -= 64;\n } else {\n x >>= 64;\n }\n if (x & type(uint32).max > 0) {\n r -= 32;\n } else {\n x >>= 32;\n }\n if (x & type(uint16).max > 0) {\n r -= 16;\n } else {\n x >>= 16;\n }\n if (x & type(uint8).max > 0) {\n r -= 8;\n } else {\n x >>= 8;\n }\n if (x & 0xf > 0) {\n r -= 4;\n } else {\n x >>= 4;\n }\n if (x & 0x3 > 0) {\n r -= 2;\n } else {\n x >>= 2;\n }\n if (x & 0x1 > 0) r -= 1;\n }\n}\n" + }, + "contracts/UniswapV2/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: CC-BY-4.0\npragma solidity 0.8.20;\n\n// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1\n// license is CC-BY-4.0\nlibrary FullMath {\n function inverse(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n\n return type(uint256).max - x + 1;\n }\n\n function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {\n uint256 mm = mulmod(x, y, type(uint256).max);\n l = x * y;\n h = mm - l;\n if (mm < l) h -= 1;\n }\n\n function fullDiv(uint256 l, uint256 h, uint256 d) private pure returns (uint256) {\n uint256 pow2 = d & inverse(d);\n d /= pow2;\n l /= pow2;\n l += h * ((inverse(pow2)) / pow2 + 1);\n uint256 r = 1;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n return l * r;\n }\n\n function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) {\n (uint256 l, uint256 h) = fullMul(x, y);\n\n uint256 mm = mulmod(x, y, d);\n if (mm > l) h -= 1;\n l -= mm;\n\n if (h == 0) return l / d;\n\n require(h < d, \"FullMath: FULLDIV_OVERFLOW\");\n return fullDiv(l, h, d);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false\nlibrary TransferHelper {\n function safeApprove(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('approve(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeApprove: approve failed\"\n );\n }\n\n function safeTransfer(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transfer(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeTransfer: transfer failed\"\n );\n }\n\n function safeTransferFrom(address token, address from, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))),\n \"TransferHelper::transferFrom: transferFrom failed\"\n );\n }\n\n function safeTransferETH(address to, uint256 value) internal {\n (bool success,) = to.call{value: value}(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n }\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Router01 {\n error UniswapV2RouterExpired();\n error UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n error UniswapV2RouterInsufficientBAmount();\n error UniswapV2RouterInsufficientAAmount();\n error UniswapV2RouterInsufficientOutputAmount();\n error UniswapV2RouterExcessiveInputAmount();\n error UniswapV2RouterInvalidPath();\n\n function factory() external view returns (address);\n function WETH() external view returns (address);\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountToken, uint256 amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountToken, uint256 amountETH);\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountOut);\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountIn);\n function getAmountsOut(uint256 amountIn, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n function getAmountsIn(uint256 amountOut, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IWETH {\n function deposit() external payable;\n function transfer(address to, uint256 value) external returns (bool);\n function withdraw(uint256) external;\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/OracleLibrary.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\n\n/// @title Oracle library\n/// @notice Provides functions to integrate with MagicswapV2 pool oracle\nlibrary OracleLibrary {\n /// @notice Fetches time-weighted average price using MagicswapV2 oracle\n /// @param pool Address of Uniswap V3 pool that we want to observe\n /// @param period Number of seconds in the past to start calculating time-weighted average\n /// @return timeWeightedAveragePrice The time-weighted average tick from (block.timestamp - period) to block.timestamp\n function consult(address pool, uint32 period) internal view returns (uint256 timeWeightedAveragePrice) {\n require(period != 0, \"BP\");\n\n uint32[] memory secondAgos = new uint32[](2);\n secondAgos[0] = period;\n secondAgos[1] = 0;\n\n uint256[] memory priceCumulatives = IUniswapV2Pair(pool).observe(secondAgos);\n uint256 priceCumulativesDelta = priceCumulatives[1] - priceCumulatives[0];\n\n timeWeightedAveragePrice = priceCumulativesDelta / period;\n }\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\nimport \"../../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../../core/libraries/SafeMath.sol\";\n\n/**\n * @notice Modified UniswapV2 to work with zksync stack based CREATE2\n *\n */\nlibrary UniswapV2Library {\n using SafeMath for uint256;\n\n bytes32 constant INIT_CODE_HASH = hex\"010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43\";\n\n /// @dev returns sorted token addresses, used to handle return values from pairs sorted in this order\n function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {\n require(tokenA != tokenB, \"UniswapV2Library: IDENTICAL_ADDRESSES\");\n (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"UniswapV2Library: ZERO_ADDRESS\");\n }\n\n // calculates the CREATE2 address for a pair without making any external calls\n function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {\n (address token0, address token1) = sortTokens(tokenA, tokenB);\n pair = address(\n uint160(\n uint256(\n keccak256(\n abi.encodePacked(\n bytes32(0x2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494), // keccak256(\"zksyncCreate2\")\n bytes32(uint256(uint160(factory))), // sender\n keccak256(abi.encodePacked(token0, token1)), // salt\n INIT_CODE_HASH,\n bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) // constructor input hash: keccak256(\"\")\n )\n )\n )\n )\n );\n }\n\n /// @dev fetches and sorts the reserves for a pair\n function getReserves(address factory, address tokenA, address tokenB)\n internal\n view\n returns (uint256 reserveA, uint256 reserveB)\n {\n (address token0,) = sortTokens(tokenA, tokenB);\n (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();\n (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);\n }\n\n /// @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) {\n require(amountA > 0, \"UniswapV2Library: INSUFFICIENT_AMOUNT\");\n require(reserveA > 0 && reserveB > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n amountB = amountA.mul(reserveB) / reserveA;\n }\n\n /// @dev given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountOut)\n {\n require(amountIn > 0, \"UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 amountInWithFee = amountIn.mul(10000 - totalFee);\n uint256 numerator = amountInWithFee.mul(reserveOut);\n uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);\n amountOut = numerator / denominator;\n }\n\n /// @dev given an output amount of an asset and pair reserves, returns a required input amount of the other asset\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountIn)\n {\n require(amountOut > 0, \"UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 numerator = reserveIn.mul(amountOut).mul(10000);\n uint256 denominator = reserveOut.sub(amountOut).mul(10000 - totalFee);\n amountIn = (numerator / denominator).add(1);\n }\n\n /// @dev performs chained getAmountOut calculations on any number of pairs\n function getAmountsOut(address factory, uint256 amountIn, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint256[](path.length);\n amounts[0] = amountIn;\n for (uint256 i; i < path.length - 1; i++) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);\n amounts[i + 1] =\n getAmountOut(amounts[i], reserveIn, reserveOut, pairFor(factory, path[i], path[i + 1]), factory);\n }\n }\n\n /// @dev performs chained getAmountIn calculations on any number of pairs\n function getAmountsIn(address factory, uint256 amountOut, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint256[](path.length);\n amounts[amounts.length - 1] = amountOut;\n for (uint256 i = path.length - 1; i > 0; i--) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);\n address pair = pairFor(factory, path[i - 1], path[i]);\n amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, pair, factory);\n }\n }\n}\n" + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../core/interfaces/IUniswapV2ERC20.sol\";\nimport \"../core/libraries/SafeMath.sol\";\nimport \"../libraries/TransferHelper.sol\";\n\nimport \"./interfaces/IUniswapV2Router01.sol\";\nimport \"./libraries/UniswapV2Library.sol\";\nimport \"./interfaces/IWETH.sol\";\n\ncontract UniswapV2Router02 is IUniswapV2Router01 {\n using SafeMath for uint256;\n\n address public immutable override factory;\n address public immutable override WETH;\n\n modifier ensure(uint256 deadline) {\n if (deadline < block.timestamp) revert UniswapV2RouterExpired();\n _;\n }\n\n constructor(address _factory, address _WETH) {\n factory = _factory;\n WETH = _WETH;\n }\n\n receive() external payable {\n if (msg.sender != WETH) revert UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n }\n\n // **** ADD LIQUIDITY ****\n function _addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin\n ) internal virtual returns (uint256 amountA, uint256 amountB) {\n // create the pair if it doesn't exist yet\n if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {\n IUniswapV2Factory(factory).createPair(tokenA, tokenB);\n }\n (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);\n if (reserveA == 0 && reserveB == 0) {\n (amountA, amountB) = (amountADesired, amountBDesired);\n } else {\n uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);\n if (amountBOptimal <= amountBDesired) {\n if (amountBOptimal < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n (amountA, amountB) = (amountADesired, amountBOptimal);\n } else {\n uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);\n assert(amountAOptimal <= amountADesired);\n if (amountAOptimal < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n (amountA, amountB) = (amountAOptimal, amountBDesired);\n }\n }\n }\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) {\n (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);\n TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);\n liquidity = IUniswapV2Pair(pair).mint(to);\n }\n\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable virtual override returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH, liquidity) =\n _addLiquidityETH(token, amountTokenDesired, amountTokenMin, amountETHMin, msg.sender, to, deadline);\n }\n\n function _addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH) =\n _addLiquidity(token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n TransferHelper.safeTransferFrom(token, from, pair, amountToken);\n IWETH(WETH).deposit{value: amountETH}();\n assert(IWETH(WETH).transfer(pair, amountETH));\n liquidity = IUniswapV2Pair(pair).mint(to);\n // refund dust eth, if any\n if (msg.value > amountETH) TransferHelper.safeTransferETH(to, msg.value - amountETH);\n }\n\n // **** REMOVE LIQUIDITY ****\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n IUniswapV2ERC20(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair\n (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);\n (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);\n (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);\n if (amountA < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n if (amountB < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n }\n\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);\n TransferHelper.safeTransfer(token, to, amountToken);\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(to, amountETH);\n }\n\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);\n }\n\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountToken, uint256 amountETH) {\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);\n }\n\n // **** SWAP ****\n // requires the initial amount to have already been sent to the first pair\n function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual {\n for (uint256 i; i < path.length - 1; i++) {\n (address input, address output) = (path[i], path[i + 1]);\n (address token0,) = UniswapV2Library.sortTokens(input, output);\n uint256 amountOut = amounts[i + 1];\n (uint256 amount0Out, uint256 amount1Out) =\n input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));\n address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;\n IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(\n amount0Out, amount1Out, to, new bytes(0)\n );\n }\n }\n\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address to,\n uint256 deadline\n ) public virtual override returns (uint256[] memory amounts) {\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, path, msg.sender, to, deadline);\n }\n\n function _swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if (amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override returns (uint256[] memory amounts) {\n amounts = _swapTokensForExactTokens(amountOut, amountInMax, path, msg.sender, to, deadline);\n }\n\n function _swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if (amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if (path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);\n if (amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if (path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if (amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if (path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if (amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n public\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if (path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if (amounts[0] > msg.value) revert UniswapV2RouterExcessiveInputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n // refund dust eth, if any\n if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);\n }\n\n // **** LIBRARY FUNCTIONS ****\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB)\n public\n pure\n virtual\n override\n returns (uint256 amountB)\n {\n return UniswapV2Library.quote(amountA, reserveA, reserveB);\n }\n\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountOut)\n {\n return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountIn)\n {\n return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountsOut(uint256 amountIn, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsOut(factory, amountIn, path);\n }\n\n function getAmountsIn(uint256 amountOut, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsIn(factory, amountOut, path);\n }\n}\n" + }, + "contracts/Vault/INftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVault {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Collection already added\n error DuplicateCollection();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice amount of token required for last NFT to be redeemed\n function LAST_NFT_AMOUNT() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n}\n" + }, + "contracts/Vault/INftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVault.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactory {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVault indexed vault,\n uint256 indexed vaultId,\n INftVault.CollectionData[] collections,\n address creator\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVault vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param index vaultId or index in NftVaultFactory.vaults array\n /// @return vault address\n function getVaultAt(uint256 index) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n /// @return true if vault is deployed by the factory\n function isVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVault.CollectionData[] memory collections) external view returns (INftVault vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVault.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVault.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function reverts\n /// @param collections vault's config\n /// @return vault address of deployed vault\n function createVault(INftVault.CollectionData[] memory collections) external returns (INftVault vault);\n}\n" + }, + "contracts/Vault/NftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVault.sol\";\nimport \"./INftVaultFactory.sol\";\n\ncontract NftVault is INftVault, ERC20, ERC721Holder, ERC1155Holder {\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice amount of token required for last NFT to be redeemed\n uint256 public immutable LAST_NFT_AMOUNT;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n /// @dev last NFT can be redeemed for 99.9%\n LAST_NFT_AMOUNT = ONE * 999 / 1000;\n }\n\n /// @inheritdoc INftVault\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n if (!allowedCollections.set(collection.addr, nftType)) revert DuplicateCollection();\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n emit CollectionAllowed(collection);\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n }\n }\n\n /// @inheritdoc INftVault\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVault\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVault\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVault\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVault\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n uint256 totalSupply_ = totalSupply();\n\n /// @dev If vault ERC20 supply is \"0 < totalSupply <= 0.01\" it means that vault has been emptied and there\n /// is leftover ERC20 token (most likely) locked in the univ2 pair. To prevent minting small amounts\n /// of unbacked ERC20 tokens in a loop, which can lead to unexpected behaviour, vault mints\n /// `ONE - totalSupply` amount of ERC20 token for the first NFT that is deposited after the vault was\n /// emptied. This allows for the vault and univ2 pair to be reused safely.\n if (totalSupply_ > 0 && totalSupply_ <= ONE - LAST_NFT_AMOUNT) {\n amountMinted -= totalSupply_;\n }\n\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVault\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow redeemeing for LAST_NFT_AMOUNT instead of ONE\n if (totalSupply() == amountBurned && balanceOf(address(this)) >= amountBurned - ONE + LAST_NFT_AMOUNT) {\n amountBurned = balanceOf(address(this));\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVault\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n}\n" + }, + "contracts/Vault/NftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactory.sol\";\nimport \"./NftVault.sol\";\n\ncontract NftVaultFactory is INftVaultFactory {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n\n mapping(bytes32 => INftVault) public vaultHashMap;\n mapping(INftVault => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactory\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultAt(uint256 _index) external view returns (address) {\n return vaults.at(_index);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactory\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVault(INftVault.CollectionData[] memory _collections) public view returns (INftVault vault) {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactory\n function exists(INftVault.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactory\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactory\n function createVault(INftVault.CollectionData[] memory _collections) external returns (INftVault vault) {\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVault(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists, revert\n if (address(vault) != address(0)) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n\n vault = INftVault(address(new NftVault(name, symbol)));\n vault.init(_collections);\n\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender);\n }\n}\n" + }, + "contracts/Vault/NftVaultManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\nimport \"./INftVault.sol\";\n\ncontract NftVaultManager {\n function withdrawBatch(\n address _vault,\n address[] memory _collections,\n uint256[] memory _tokenIds,\n uint256[] memory _amounts\n ) external returns (uint256) {\n INftVault vault = INftVault(_vault);\n\n uint256 totalAmount;\n for (uint256 i = 0; i < _amounts.length; i++) {\n totalAmount += _amounts[i];\n }\n\n IERC20(_vault).transferFrom(msg.sender, _vault, totalAmount * vault.ONE());\n return vault.withdrawBatch(msg.sender, _collections, _tokenIds, _amounts);\n }\n\n function depositBatch(\n address _vault,\n address[] memory _collections,\n uint256[] memory _tokenIds,\n uint256[] memory _amounts\n ) external returns (uint256) {\n INftVault vault = INftVault(_vault);\n address collectionAddress;\n\n for (uint256 i = 0; i < _collections.length; i++) {\n collectionAddress = _collections[i];\n INftVault.CollectionData memory collectionData = vault.getAllowedCollectionData(collectionAddress);\n if (collectionData.nftType == INftVault.NftType.ERC1155) {\n IERC1155(collectionAddress).safeTransferFrom(msg.sender, _vault, _tokenIds[i], _amounts[i], \"\");\n } else if (collectionData.nftType == INftVault.NftType.ERC721) {\n IERC721(collectionAddress).safeTransferFrom(msg.sender, _vault, _tokenIds[i]);\n } else {\n revert(\"NftVaultManager: Invalid NFT type\");\n }\n }\n return vault.depositBatch(msg.sender, _collections, _tokenIds, _amounts);\n }\n}\n" + }, + "contracts/Vault/test/NftVault.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultTest is Test {\n NftVaultFactory public nftVaultFactory;\n\n address user1 = address(1001);\n address user2 = address(1002);\n address owner = address(1003);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n nftVaultFactory = new NftVaultFactory();\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else if (configId == 8) {\n collections.push(collectionERC721all);\n collections.push(collectionERC721all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function _deployTestVault(uint256 configId)\n public\n returns (NftVault vault, INftVault.CollectionData[] memory _collections)\n {\n _collections = _getConfig(configId);\n vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n }\n\n function _getAddressesFromCollections(INftVault.CollectionData[] memory _collections)\n public\n view\n returns (address[] memory addresses)\n {\n addresses = new address[](_collections.length);\n\n for (uint256 i = 0; i < collections.length; i++) {\n addresses[i] = _collections[i].addr;\n }\n }\n\n function testInitReverts() public {\n NftVault nftVault;\n\n delete collections;\n vm.expectRevert(INftVault.InvalidCollections.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionAllWithTokenIds);\n vm.expectRevert(INftVault.TokenIdsMustBeEmpty.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC1155allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedMissingTokens);\n vm.expectRevert(INftVault.MissingTokenIds.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedUnsortedTokens);\n vm.expectRevert(INftVault.TokenIdsMustBeSorted.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedDuplicatedTokens);\n vm.expectRevert(INftVault.TokenIdAlreadySet.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n INftVault.CollectionData[] memory _collections = _getConfig(8);\n vm.expectRevert(INftVault.DuplicateCollection.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(nftVault.VAULT_HASH(), bytes32(0));\n assertEq(nftVault.getAllowedCollections(), new address[](0));\n assertEq(nftVault.getAllowedCollectionsLength(), 0);\n assertEq(nftVault.ONE(), 10 ** nftVault.decimals());\n assertEq(nftVault.ONE(), 1e18);\n assertEq(nftVault.name(), \"name\");\n assertEq(nftVault.symbol(), \"symbol\");\n }\n\n function testInitStorage() public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n assertEq(vault.hashVault(_collections), vault.VAULT_HASH());\n assertEq(vault.getAllowedCollections(), _getAddressesFromCollections(_collections));\n assertEq(vault.getAllowedCollectionsLength(), _collections.length);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n INftVault.CollectionData memory c = vault.getAllowedCollectionData(_collections[i].addr);\n assertEq(c.addr, _collections[i].addr);\n assertEq(uint256(c.nftType), uint256(_collections[i].nftType));\n assertEq(c.allowAllIds, _collections[i].allowAllIds);\n assertEq(c.tokenIds, _collections[i].tokenIds);\n\n for (uint256 j = 0; j < _collections[i].tokenIds.length; j++) {\n assertTrue(vault.isTokenAllowed(_collections[i].addr, _collections[i].tokenIds[j]));\n }\n }\n\n vm.expectRevert(INftVault.Initialized.selector);\n vault.init(_collections);\n }\n }\n\n function testValidateNftType() public {\n NftVault nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721all.addr, collectionERC721all.nftType)),\n uint256(collectionERC721all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155all.addr, collectionERC1155all.nftType)),\n uint256(collectionERC1155all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721allowed.addr, collectionERC721allowed.nftType)),\n uint256(collectionERC721allowed.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155allowed.addr, collectionERC1155allowed.nftType)),\n uint256(collectionERC1155allowed.nftType)\n );\n\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault.validateNftType(collectionERC721allWrongNftType.addr, collectionERC721allWrongNftType.nftType);\n\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault.validateNftType(collectionERC1155allWrongNftType.addr, collectionERC1155allWrongNftType.nftType);\n\n // test hypothetical contract that supports ERC721 and ERC1155\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC721).interfaceId)), abi.encode(true)\n );\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC1155).interfaceId)), abi.encode(true)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC721)),\n uint256(INftVault.NftType.ERC721)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC1155)),\n uint256(INftVault.NftType.ERC1155)\n );\n vm.clearMockedCalls();\n }\n\n function testIsTokenAllowed(address collectionAddr, uint256 tokenId) public {\n delete collections;\n INftVault.CollectionData memory config = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n collections.push(config);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(collectionAddr != config.addr);\n\n for (uint256 i = 0; i < erc721tokenIds.length; i++) {\n vm.assume(tokenId != erc721tokenIds[i]);\n }\n\n assertFalse(nftVault.isTokenAllowed(collectionAddr, tokenId));\n }\n\n function testGetSentTokenBalance(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n assertEq(nftVault.getSentTokenBalance(address(erc721), tokenId), 1);\n\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n assertEq(nftVault.getSentTokenBalance(address(erc1155), tokenId), amount);\n }\n\n function testDepositRevert(uint256 _tokenId, uint256 _amount) public {\n uint256 otherTokenId = 56464987645;\n vm.assume(_tokenId != otherTokenId);\n vm.assume(_amount < type(uint256).max);\n\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.expectRevert(INftVault.DisallowedToken.selector);\n nftVault.deposit(user1, address(5566), _tokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(user2, otherTokenId);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, otherTokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n assertEq(nftVault.getSentTokenBalance(collections[0].addr, _tokenId), 1);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, _tokenId, 0);\n\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n assertEq(nftVault.getSentTokenBalance(collections[1].addr, _tokenId), _amount);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[1].addr, _tokenId, _amount + 1);\n }\n\n function testNoDepositGriefing() public {\n delete collections;\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n // User deposited 1 token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n\n // Malicious user manually transferred 1 token to the vault\n vm.startPrank(user2);\n ERC1155Mintable(collections[0].addr).mint(user2, 1, 1);\n ERC1155Mintable(collections[0].addr).safeTransferFrom(user2, address(nftVault), 1, 1, bytes(\"\"));\n vm.stopPrank();\n\n // User deposited 1 more token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n }\n\n function testDepositAllConfigs(uint256 _tokenId, uint256 _amount) public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n for (uint256 i = 0; i < _collections.length; i++) {\n if (!collections[i].allowAllIds) {\n // if not all allowed, take random tokenId that is allowed with fuzzing for randomness\n _tokenId = collections[i].tokenIds[_tokenId % collections[i].tokenIds.length];\n }\n\n if (collections[i].nftType == INftVault.NftType.ERC721) {\n _amount = 1;\n ERC721Mintable(collections[i].addr).mint(address(vault), _tokenId);\n } else {\n ERC1155Mintable(collections[i].addr).mint(address(vault), _tokenId, _amount);\n }\n\n uint256 balancesBefore = vault.balances(collections[i].addr, _tokenId);\n uint256 erc20balanceBefore = vault.balanceOf(user1);\n\n vm.expectEmit(true, true, true, true);\n emit Deposit(user1, collections[i].addr, _tokenId, _amount);\n uint256 amountMinted = vault.deposit(user1, collections[i].addr, _tokenId, _amount);\n\n assertEq(amountMinted / vault.ONE(), _amount);\n assertEq(vault.balanceOf(user1), erc20balanceBefore + amountMinted);\n assertEq(vault.balances(collections[i].addr, _tokenId), balancesBefore + _amount);\n }\n }\n }\n\n function testDepositBatchWithdrawBatch(uint256 _tokenId, uint256[] memory _amounts) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(_amounts.length > 10);\n\n assertEq(nftVault.balanceOf(user1), 0);\n\n address[] memory collectionBatch = new address[](10);\n uint256[] memory tokenIdBatch = new uint256[](10);\n uint256[] memory amountBatch = new uint256[](10);\n uint256 expectedAmountMinted = 0;\n\n for (uint256 i = 0; i < 10; i++) {\n vm.assume(_tokenId < type(uint64).max);\n uint256 tokenId = _tokenId + i;\n\n vm.assume(_amounts[i] > 0);\n vm.assume(_amounts[i] < type(uint64).max);\n uint256 amount = _amounts[i];\n\n if (i % 2 == 0) {\n ERC721Mintable(collections[0].addr).mint(address(nftVault), tokenId);\n collectionBatch[i] = collections[0].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = 1;\n } else {\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), tokenId, amount);\n collectionBatch[i] = collections[1].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = amount;\n }\n\n expectedAmountMinted += amountBatch[i];\n }\n\n uint256 amountMinted = nftVault.depositBatch(user1, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountMinted / nftVault.ONE(), expectedAmountMinted);\n assertEq(nftVault.balanceOf(user1), expectedAmountMinted * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n for (uint256 i = 0; i < 10; i++) {\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), amountBatch[i]);\n }\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted);\n\n uint256 amountBurned = nftVault.withdrawBatch(user2, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountBurned, amountMinted);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(user2), 0);\n\n for (uint256 i = 0; i < 10; i++) {\n if (i % 2 == 0) {\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(tokenIdBatch[i]), user2);\n } else {\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user2, tokenIdBatch[i]), amountBatch[i]);\n }\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), 0);\n }\n }\n\n function testWithdrawRevert(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user1, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 2);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount);\n }\n\n function testWithdraw(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user2, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted721);\n\n uint256 amountBurned = nftVault.withdraw(user1, collections[1].addr, _tokenId, 1);\n\n assertEq(amountBurned, amountMinted721);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), _amount - 1);\n\n uint256 transferAmount = amountMinted1155 - nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[1].addr, _tokenId, _amount - 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), nftVault.ONE());\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n\n transferAmount = nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[0].addr, _tokenId, 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), user2);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n }\n\n function testWithdrawLast(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n address[] memory lastCollections = new address[](2);\n uint256[] memory lastTokenIds = new uint256[](2);\n uint256[] memory lastAmounts = new uint256[](2);\n\n lastCollections[0] = collections[0].addr;\n lastCollections[1] = collections[1].addr;\n\n lastTokenIds[0] = _tokenId;\n lastTokenIds[1] = _tokenId;\n\n lastAmounts[0] = 1;\n lastAmounts[1] = _amount;\n\n uint256 amountMinted = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(amountMinted, (_amount + 1) * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n vm.startPrank(user1);\n nftVault.transfer(owner, nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n nftVault.transfer(address(nftVault), nftVault.balanceOf(user1));\n vm.stopPrank();\n\n nftVault.withdrawBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(_tokenId), user1);\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user1, _tokenId), _amount);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(address(nftVault)), 0);\n assertEq(nftVault.totalSupply(), nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n\n vm.startPrank(user1);\n ERC721Mintable(collections[0].addr).transferFrom(user1, address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).safeTransferFrom(user1, address(nftVault), _tokenId, _amount, bytes(\"\"));\n vm.stopPrank();\n\n uint256 amountMinted2 = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n assertEq(amountMinted2, (_amount + 1) * nftVault.ONE() - nftVault.ONE() + nftVault.LAST_NFT_AMOUNT());\n }\n\n function testSkim(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n assertTrue(nftVault.isTokenAllowed(address(erc721), tokenId));\n assertEq(erc721.balanceOf(user2), 0);\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(erc721), tokenId, 1);\n\n assertTrue(nftVault.isTokenAllowed(address(erc1155), tokenId));\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(erc1155), tokenId, amount);\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n\n ERC721Mintable newErc721 = new ERC721Mintable();\n\n newErc721.mint(address(nftVault), tokenId);\n assertFalse(nftVault.isTokenAllowed(address(newErc721), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(newErc721), tokenId, amount);\n assertEq(newErc721.balanceOf(user2), 1);\n\n ERC1155Mintable newErc1155 = new ERC1155Mintable();\n\n newErc1155.mint(address(nftVault), tokenId, amount);\n assertFalse(nftVault.isTokenAllowed(address(newErc1155), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(newErc1155), tokenId, amount);\n assertEq(newErc1155.balanceOf(user2, tokenId), amount);\n }\n}\n" + }, + "contracts/Vault/test/NftVaultFactory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultFactoryTest is Test {\n address user1 = address(1001);\n address user2 = address(1002);\n address owner1 = address(1003);\n address owner2 = address(1004);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function testVaultAlreadyDeployed() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n INftVault.CollectionData[] memory _collections = _getConfig(0);\n\n vaultFactory.createVault(_collections);\n\n vm.expectRevert(INftVaultFactory.VaultAlreadyDeployed.selector);\n vaultFactory.createVault(_collections);\n }\n\n function testAllGetters() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n address[] memory vaults = new address[](8);\n\n for (uint256 configId = 0; configId < 8; configId++) {\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n\n INftVault vault = vaultFactory.createVault(_collections);\n\n vaults[configId] = address(vault);\n\n address[] memory getAllVaults = new address[](configId + 1);\n for (uint256 i = 0; i < getAllVaults.length; i++) {\n if (vaults[i] != address(0)) {\n getAllVaults[i] = vaults[i];\n }\n }\n\n assertEq(vaultFactory.getAllVaults(), getAllVaults);\n assertEq(vaultFactory.getVaultAt(configId), vaults[configId]);\n assertEq(vaultFactory.getVaultLength(), configId + 1);\n assertEq(vaultFactory.isVault(vaults[configId]), true);\n assertEq(vaultFactory.isVault(address(uint160(vaults[configId]) + 1)), false);\n assertEq(address(vaultFactory.getVault(_collections)), vaults[configId]);\n assertEq(vaultFactory.exists(_collections), true);\n assertEq(address(vaultFactory.vaultHashMap(vaultFactory.hashVault(_collections))), vaults[configId]);\n assertEq(vaultFactory.getVaultAt(vaultFactory.vaultIdMap(INftVault(vaults[configId]))), vaults[configId]);\n }\n }\n}\n" + }, + "contracts/VaultPermissioned/INftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVaultPermissioned.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactoryPermissioned {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVaultPermissioned vault,\n uint256 vaultId,\n INftVaultPermissioned.CollectionData[] collections,\n address creator,\n address owner\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVaultPermissioned vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getVaultAt(uint256 i) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n function isVault(address vault) external view returns (bool);\n\n /// @return all deployed permissioned vaults\n function getAllPermissionedVaults() external view returns (address[] memory);\n\n /// @notice Get permissioned vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getPermissionedVaultAt(uint256 i) external view returns (address);\n\n /// @return length of permissioned vault's EnumerableSet\n function getPermissionedVaultLength() external view returns (uint256);\n\n /// @notice Returns true if permissioned vault has been deployed by factory\n /// @param vault address\n function isPermissionedVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVaultPermissioned.CollectionData[] memory collections)\n external\n view\n returns (INftVaultPermissioned vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVaultPermissioned.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVaultPermissioned.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function returned already deployed vault\n /// @param collections vault's config\n /// @param owner address of owner if vault is permissioned, otherwise address(0) and vault is permissionless\n /// @param isSoulbound if true, Vault is soulbound and its ERC20 token can only be transfered\n /// to `allowedContracts` managed by `owner`\n /// @return vault address of (newly) deployed vault\n function createVault(INftVaultPermissioned.CollectionData[] memory collections, address owner, bool isSoulbound)\n external\n returns (INftVaultPermissioned vault);\n}\n" + }, + "contracts/VaultPermissioned/INftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVaultPermissioned {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted when adding a wallet to deposit/withdraw allow list\n /// @param wallet address that is allowed to deposit/withdraw\n event AllowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when removing a wallet from deposit/withdraw allow list\n /// @param wallet address that is disallowed to deposit/withdraw\n event DisallowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when `contractAddress` is allowed to receive Vault ERC20 token\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n event AllowedContract(address contractAddress);\n\n /// @notice Emitted when `contractAddress` address that is disallowed to receive Vault ERC20 token\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n event DisallowedContract(address contractAddress);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n /// @dev User is not allowed to deposit or withdraw\n error NotAllowed();\n /// @dev Owner is required to manage `allowedContracts` when Vault is deployed as soulbound\n error OwnerRequiredForSoulbound();\n /// @dev Transfer of Vault ERC20 token to disallowed receiver\n error SoulboundTransferDisallowed();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n function UNIV2_MINIMUM_LIQUIDITY() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to `allowedContracts`\n /// @return true if Vault is soulbound, false otherwise\n function isSoulbound() external view returns (bool);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns true if wallet is allowed to deposit/withdraw. Only applicable to permissioned vault.\n /// @dev Call `isPermissioned()` first to make sure vault is permissioned. Otherwise this function is irrelevant.\n /// @param wallet address that is checked\n /// @return true if wallet is allowed, false otherwise. For permissionless vault always returns false.\n function allowedWallets(address wallet) external view returns (bool);\n\n /// @notice Is vault permissioned\n /// @return true if vault has an owner and is permissioned. False otherwise.\n function isPermissioned() external view returns (bool);\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n\n /// @notice Allow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is allowed to deposit/withdraw\n function allowDepositWithdraw(address wallet) external;\n\n /// @notice Disallow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is disallowed to deposit/withdraw\n function disallowDepositWithdraw(address wallet) external;\n\n /// @notice Allow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n function allowVaultTokenTransfersTo(address contractAddress) external;\n\n /// @notice Disallow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n function disallowVaultTokenTransfersTo(address contractAddress) external;\n}\n" + }, + "contracts/VaultPermissioned/NftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Counters.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactoryPermissioned.sol\";\nimport \"./NftVaultPermissioned.sol\";\n\ncontract NftVaultFactoryPermissioned is INftVaultFactoryPermissioned {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n EnumerableSet.AddressSet private permissionedVaults;\n\n mapping(bytes32 => INftVaultPermissioned) public vaultHashMap;\n mapping(INftVaultPermissioned => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultAt(uint256 _i) external view returns (address) {\n return vaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllPermissionedVaults() external view returns (address[] memory) {\n return permissionedVaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultAt(uint256 _i) external view returns (address) {\n return permissionedVaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultLength() external view returns (uint256) {\n return permissionedVaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isPermissionedVault(address _vault) external view returns (bool) {\n return permissionedVaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVault(INftVaultPermissioned.CollectionData[] memory _collections)\n public\n view\n returns (INftVaultPermissioned vault)\n {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function exists(INftVaultPermissioned.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function createVault(INftVaultPermissioned.CollectionData[] memory _collections, address _owner, bool _isSoulbound)\n external\n returns (INftVaultPermissioned vault)\n {\n bool isPermissionless = _owner == address(0) && !_isSoulbound;\n\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVaultPermissioned(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists and is permissionless, revert\n if (address(vault) != address(0) && isPermissionless) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n if (isPermissionless) {\n // permissionless\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n } else {\n // permissioned\n vaultId = permissionedVaults.length();\n name = string.concat(\"Magic Permissioned Vault \", vaultId.toString());\n symbol = string.concat(\"MagicPermissionedVault\", vaultId.toString());\n }\n\n vault = INftVaultPermissioned(address(new NftVaultPermissioned(name, symbol, _owner, _isSoulbound)));\n vault.init(_collections);\n\n if (isPermissionless) {\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n } else {\n permissionedVaults.add(address(vault));\n }\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender, _owner);\n }\n}\n" + }, + "contracts/VaultPermissioned/NftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVaultPermissioned.sol\";\nimport \"./INftVaultFactoryPermissioned.sol\";\n\ncontract NftVaultPermissioned is INftVaultPermissioned, ERC20, ERC721Holder, ERC1155Holder, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n uint256 public constant UNIV2_MINIMUM_LIQUIDITY = 1e3;\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to\n /// EOA, vault itself and `allowedContracts`\n bool public immutable isSoulbound;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @notice deposit/withdraw allow list. Maps wallet address to bool, if true, wallet is allowed to deposit/withdraw\n mapping(address => bool) public allowedWallets;\n\n /// @notice Vault ERC20 receive allow list. Maps contract address to bool, if true, contract is allowed to receive\n /// Vault ERC20 token.\n mapping(address => bool) public allowedContracts;\n\n modifier onlyAllowed() {\n if (isPermissioned() && !allowedWallets[msg.sender]) {\n revert NotAllowed();\n }\n\n _;\n }\n\n /// @dev if _owner == address(0), NftVault is deployed as permissionless\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n /// @param _owner should be address(0) for permissionless vaults. Otherwise, address of the owner.\n /// @param _isSoulbound if true, Vault is soulbound, false otherwise\n constructor(string memory _name, string memory _symbol, address _owner, bool _isSoulbound) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n\n isSoulbound = _isSoulbound;\n _transferOwnership(_owner);\n\n if (_isSoulbound && _owner == address(0)) revert OwnerRequiredForSoulbound();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n allowedCollections.set(collection.addr, nftType);\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n\n emit CollectionAllowed(collection);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isPermissioned() public view returns (bool) {\n return owner() != address(0);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVaultPermissioned\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow being UNIV2_MINIMUM_LIQUIDITY shy\n if (totalSupply() == amountBurned && balanceOf(address(this)) == amountBurned - UNIV2_MINIMUM_LIQUIDITY) {\n amountBurned -= UNIV2_MINIMUM_LIQUIDITY;\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n\n function _beforeTokenTransfer(address, /*from*/ address to, uint256 /*amount*/ ) internal view override {\n /// @dev Soulbound Vault ERC20 token can be transfered to any EOA, this Vault or `allowedContracts`\n if (isSoulbound && to != address(this) && Address.isContract(to) && !allowedContracts[to]) {\n revert SoulboundTransferDisallowed();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = true;\n\n emit AllowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = false;\n\n emit DisallowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = true;\n\n emit AllowedContract(_contractAddress);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = false;\n\n emit DisallowedContract(_contractAddress);\n }\n}\n" + }, + "forge-std/Base.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {StdStorage} from \"./StdStorage.sol\";\nimport {Vm, VmSafe} from \"./Vm.sol\";\n\nabstract contract CommonBase {\n // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.\n address internal constant VM_ADDRESS = address(uint160(uint256(keccak256(\"hevm cheat code\"))));\n // console.sol and console2.sol work by executing a staticcall to this address.\n address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;\n // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.\n address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256(\"foundry default caller\"))));\n // Address of the test contract, deployed by the DEFAULT_SENDER.\n address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;\n // Deterministic deployment address of the Multicall3 contract.\n address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;\n // The order of the secp256k1 curve.\n uint256 internal constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n\n uint256 internal constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n Vm internal constant vm = Vm(VM_ADDRESS);\n StdStorage internal stdstore;\n}\n\nabstract contract TestBase is CommonBase {}\n\nabstract contract ScriptBase is CommonBase {\n VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);\n}\n" + }, + "forge-std/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\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(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", 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, int256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,int256)\", 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" + }, + "forge-std/console2.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {console as console2} from \"./console.sol\";\n" + }, + "forge-std/interfaces/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\ninterface IERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n" + }, + "forge-std/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\n/// @dev Interface of the ERC20 standard as defined in the EIP.\n/// @dev This includes the optional name, symbol, and decimals metadata.\ninterface IERC20 {\n /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`\n /// is the new allowance.\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /// @notice Returns the amount of tokens in existence.\n function totalSupply() external view returns (uint256);\n\n /// @notice Returns the amount of tokens owned by `account`.\n function balanceOf(address account) external view returns (uint256);\n\n /// @notice Moves `amount` tokens from the caller's account to `to`.\n function transfer(address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the remaining number of tokens that `spender` is allowed\n /// to spend on behalf of `owner`\n function allowance(address owner, address spender) external view returns (uint256);\n\n /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.\n /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n function approve(address spender, uint256 amount) external returns (bool);\n\n /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.\n /// `amount` is then deducted from the caller's allowance.\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the name of the token.\n function name() external view returns (string memory);\n\n /// @notice Returns the symbol of the token.\n function symbol() external view returns (string memory);\n\n /// @notice Returns the decimals places of the token.\n function decimals() external view returns (uint8);\n}\n" + }, + "forge-std/interfaces/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\nimport \"./IERC165.sol\";\n\n/// @title ERC-721 Non-Fungible Token Standard\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.\ninterface IERC721 is IERC165 {\n /// @dev This emits when ownership of any NFT changes by any mechanism.\n /// This event emits when NFTs are created (`from` == 0) and destroyed\n /// (`to` == 0). Exception: during contract creation, any number of NFTs\n /// may be created and assigned without emitting Transfer. At the time of\n /// any transfer, the approved address for that NFT (if any) is reset to none.\n event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);\n\n /// @dev This emits when the approved address for an NFT is changed or\n /// reaffirmed. The zero address indicates there is no approved address.\n /// When a Transfer event emits, this also indicates that the approved\n /// address for that NFT (if any) is reset to none.\n event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);\n\n /// @dev This emits when an operator is enabled or disabled for an owner.\n /// The operator can manage all NFTs of the owner.\n event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n /// @notice Count all NFTs assigned to an owner\n /// @dev NFTs assigned to the zero address are considered invalid, and this\n /// function throws for queries about the zero address.\n /// @param _owner An address for whom to query the balance\n /// @return The number of NFTs owned by `_owner`, possibly zero\n function balanceOf(address _owner) external view returns (uint256);\n\n /// @notice Find the owner of an NFT\n /// @dev NFTs assigned to zero address are considered invalid, and queries\n /// about them do throw.\n /// @param _tokenId The identifier for an NFT\n /// @return The address of the owner of the NFT\n function ownerOf(uint256 _tokenId) external view returns (address);\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT. When transfer is complete, this function\n /// checks if `_to` is a smart contract (code size > 0). If so, it calls\n /// `onERC721Received` on `_to` and throws if the return value is not\n /// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n /// @param data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev This works identically to the other function with an extra data parameter,\n /// except this function just sets data to \"\".\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n /// THEY MAY BE PERMANENTLY LOST\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function transferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Change or reaffirm the approved address for an NFT\n /// @dev The zero address indicates there is no approved address.\n /// Throws unless `msg.sender` is the current NFT owner, or an authorized\n /// operator of the current owner.\n /// @param _approved The new approved NFT controller\n /// @param _tokenId The NFT to approve\n function approve(address _approved, uint256 _tokenId) external payable;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage\n /// all of `msg.sender`'s assets\n /// @dev Emits the ApprovalForAll event. The contract MUST allow\n /// multiple operators per owner.\n /// @param _operator Address to add to the set of authorized operators\n /// @param _approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address _operator, bool _approved) external;\n\n /// @notice Get the approved address for a single NFT\n /// @dev Throws if `_tokenId` is not a valid NFT.\n /// @param _tokenId The NFT to find the approved address for\n /// @return The approved address for this NFT, or the zero address if there is none\n function getApproved(uint256 _tokenId) external view returns (address);\n\n /// @notice Query if an address is an authorized operator for another address\n /// @param _owner The address that owns the NFTs\n /// @param _operator The address that acts on behalf of the owner\n /// @return True if `_operator` is an approved operator for `_owner`, false otherwise\n function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n}\n\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\ninterface IERC721TokenReceiver {\n /// @notice Handle the receipt of an NFT\n /// @dev The ERC721 smart contract calls this function on the recipient\n /// after a `transfer`. This function MAY throw to revert and reject the\n /// transfer. Return of other than the magic value MUST result in the\n /// transaction being reverted.\n /// Note: the contract address is always the message sender.\n /// @param _operator The address which called `safeTransferFrom` function\n /// @param _from The address which previously owned the token\n /// @param _tokenId The NFT identifier which is being transferred\n /// @param _data Additional data with no specified format\n /// @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n /// unless throwing\n function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)\n external\n returns (bytes4);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.\ninterface IERC721Metadata is IERC721 {\n /// @notice A descriptive name for a collection of NFTs in this contract\n function name() external view returns (string memory _name);\n\n /// @notice An abbreviated name for NFTs in this contract\n function symbol() external view returns (string memory _symbol);\n\n /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\n /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC\n /// 3986. The URI may point to a JSON file that conforms to the \"ERC721\n /// Metadata JSON Schema\".\n function tokenURI(uint256 _tokenId) external view returns (string memory);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x780e9d63.\ninterface IERC721Enumerable is IERC721 {\n /// @notice Count NFTs tracked by this contract\n /// @return A count of valid NFTs tracked by this contract, where each one of\n /// them has an assigned and queryable owner not equal to the zero address\n function totalSupply() external view returns (uint256);\n\n /// @notice Enumerate valid NFTs\n /// @dev Throws if `_index` >= `totalSupply()`.\n /// @param _index A counter less than `totalSupply()`\n /// @return The token identifier for the `_index`th NFT,\n /// (sort order not specified)\n function tokenByIndex(uint256 _index) external view returns (uint256);\n\n /// @notice Enumerate NFTs assigned to an owner\n /// @dev Throws if `_index` >= `balanceOf(_owner)` or if\n /// `_owner` is the zero address, representing invalid NFTs.\n /// @param _owner An address where we are interested in NFTs owned by them\n /// @param _index A counter less than `balanceOf(_owner)`\n /// @return The token identifier for the `_index`th NFT assigned to `_owner`,\n /// (sort order not specified)\n function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);\n}\n" + }, + "forge-std/interfaces/IMulticall3.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\ninterface IMulticall3 {\n struct Call {\n address target;\n bytes callData;\n }\n\n struct Call3 {\n address target;\n bool allowFailure;\n bytes callData;\n }\n\n struct Call3Value {\n address target;\n bool allowFailure;\n uint256 value;\n bytes callData;\n }\n\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes[] memory returnData);\n\n function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);\n\n function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);\n\n function blockAndAggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n\n function getBasefee() external view returns (uint256 basefee);\n\n function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);\n\n function getBlockNumber() external view returns (uint256 blockNumber);\n\n function getChainId() external view returns (uint256 chainid);\n\n function getCurrentBlockCoinbase() external view returns (address coinbase);\n\n function getCurrentBlockDifficulty() external view returns (uint256 difficulty);\n\n function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);\n\n function getCurrentBlockTimestamp() external view returns (uint256 timestamp);\n\n function getEthBalance(address addr) external view returns (uint256 balance);\n\n function getLastBlockHash() external view returns (bytes32 blockHash);\n\n function tryAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (Result[] memory returnData);\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n}\n" + }, + "forge-std/mocks/MockERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC20} from \"../interfaces/IERC20.sol\";\n\n/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol\ncontract MockERC20 is IERC20 {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n uint8 internal _decimals;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function decimals() external view override returns (uint8) {\n return _decimals;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal _totalSupply;\n\n mapping(address => uint256) internal _balanceOf;\n\n mapping(address => mapping(address => uint256)) internal _allowance;\n\n function totalSupply() external view override returns (uint256) {\n return _totalSupply;\n }\n\n function balanceOf(address owner) external view override returns (uint256) {\n return _balanceOf[owner];\n }\n\n function allowance(address owner, address spender) external view override returns (uint256) {\n return _allowance[owner][spender];\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal INITIAL_CHAIN_ID;\n\n bytes32 internal INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_, uint8 decimals_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n _decimals = decimals_;\n\n INITIAL_CHAIN_ID = _pureChainId();\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount);\n\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n public\n virtual\n {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n _allowance[recoveredAddress][spender] = value;\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(_name)),\n keccak256(\"1\"),\n _pureChainId(),\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n _totalSupply = _add(_totalSupply, amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _totalSupply = _sub(_totalSupply, amount);\n\n emit Transfer(from, address(0), amount);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MATH LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"ERC20: addition overflow\");\n return c;\n }\n\n function _sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(a >= b, \"ERC20: subtraction underflow\");\n return a - b;\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n" + }, + "forge-std/mocks/MockERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC721Metadata, IERC721TokenReceiver} from \"../interfaces/IERC721.sol\";\n\n/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol\ncontract MockERC721 is IERC721Metadata {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE/LOGIC\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function tokenURI(uint256 id) public view virtual override returns (string memory) {}\n\n /*//////////////////////////////////////////////////////////////\n ERC721 BALANCE/OWNER STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _ownerOf;\n\n mapping(address => uint256) internal _balanceOf;\n\n function ownerOf(uint256 id) public view virtual override returns (address owner) {\n require((owner = _ownerOf[id]) != address(0), \"NOT_MINTED\");\n }\n\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ZERO_ADDRESS\");\n\n return _balanceOf[owner];\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 APPROVAL STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _getApproved;\n\n mapping(address => mapping(address => bool)) internal _isApprovedForAll;\n\n function getApproved(uint256 id) public view virtual override returns (address) {\n return _getApproved[id];\n }\n\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _isApprovedForAll[owner][operator];\n }\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 id) public payable virtual override {\n address owner = _ownerOf[id];\n\n require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], \"NOT_AUTHORIZED\");\n\n _getApproved[id] = spender;\n\n emit Approval(owner, spender, id);\n }\n\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _isApprovedForAll[msg.sender][operator] = approved;\n\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function transferFrom(address from, address to, uint256 id) public payable virtual override {\n require(from == _ownerOf[id], \"WRONG_FROM\");\n\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(\n msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id],\n \"NOT_AUTHORIZED\"\n );\n\n // Underflow of the sender's balance is impossible because we check for\n // ownership above and the recipient's balance can't realistically overflow.\n _balanceOf[from]--;\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n delete _getApproved[id];\n\n emit Transfer(from, to, id);\n }\n\n function safeTransferFrom(address from, address to, uint256 id) public payable virtual override {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function safeTransferFrom(address from, address to, uint256 id, bytes memory data)\n public\n payable\n virtual\n override\n {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC165 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721\n || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 id) internal virtual {\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(_ownerOf[id] == address(0), \"ALREADY_MINTED\");\n\n // Counter overflow is incredibly unrealistic.\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n emit Transfer(address(0), to, id);\n }\n\n function _burn(uint256 id) internal virtual {\n address owner = _ownerOf[id];\n\n require(owner != address(0), \"NOT_MINTED\");\n\n _balanceOf[owner]--;\n\n delete _ownerOf[id];\n\n delete _getApproved[id];\n\n emit Transfer(owner, address(0), id);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MINT LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _safeMint(address to, uint256 id) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function _safeMint(address to, uint256 id, bytes memory data) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n function _isContract(address _addr) private view returns (bool) {\n uint256 codeLength;\n\n // Assembly required for versions < 0.8.0 to check extcodesize.\n assembly {\n codeLength := extcodesize(_addr)\n }\n\n return codeLength > 0;\n }\n}\n" + }, + "forge-std/safeconsole.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\n/// @author philogy \n/// @dev Code generated automatically by script.\nlibrary safeconsole {\n uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;\n\n // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)\n // for the view-to-pure log trick.\n function _sendLogPayload(uint256 offset, uint256 size) private pure {\n function(uint256, uint256) internal view fnIn = _sendLogPayloadView;\n function(uint256, uint256) internal pure pureSendLogPayload;\n /// @solidity memory-safe-assembly\n assembly {\n pureSendLogPayload := fnIn\n }\n pureSendLogPayload(offset, size);\n }\n\n function _sendLogPayloadView(uint256 offset, uint256 size) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))\n }\n }\n\n function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {\n function(uint256, uint256, uint256) internal view fnIn = _memcopyView;\n function(uint256, uint256, uint256) internal pure pureMemcopy;\n /// @solidity memory-safe-assembly\n assembly {\n pureMemcopy := fnIn\n }\n pureMemcopy(fromOffset, toOffset, length);\n }\n\n function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))\n }\n }\n\n function logMemory(uint256 offset, uint256 length) internal pure {\n if (offset >= 0x60) {\n // Sufficient memory before slice to prepare call header.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(sub(offset, 0x60))\n m1 := mload(sub(offset, 0x40))\n m2 := mload(sub(offset, 0x20))\n // Selector of `log(bytes)`.\n mstore(sub(offset, 0x60), 0x0be77f56)\n mstore(sub(offset, 0x40), 0x20)\n mstore(sub(offset, 0x20), length)\n }\n _sendLogPayload(offset - 0x44, length + 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(sub(offset, 0x60), m0)\n mstore(sub(offset, 0x40), m1)\n mstore(sub(offset, 0x20), m2)\n }\n } else {\n // Insufficient space, so copy slice forward, add header and reverse.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n uint256 endOffset = offset + length;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(add(endOffset, 0x00))\n m1 := mload(add(endOffset, 0x20))\n m2 := mload(add(endOffset, 0x40))\n }\n _memcopy(offset, offset + 0x60, length);\n /// @solidity memory-safe-assembly\n assembly {\n // Selector of `log(bytes)`.\n mstore(add(offset, 0x00), 0x0be77f56)\n mstore(add(offset, 0x20), 0x20)\n mstore(add(offset, 0x40), length)\n }\n _sendLogPayload(offset + 0x1c, length + 0x44);\n _memcopy(offset + 0x60, offset, length);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(endOffset, 0x00), m0)\n mstore(add(endOffset, 0x20), m1)\n mstore(add(endOffset, 0x40), m2)\n }\n }\n }\n\n function log(address p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(address)`.\n mstore(0x00, 0x2c2ecbc2)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bool p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(bool)`.\n mstore(0x00, 0x32458eed)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(uint256 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(uint256)`.\n mstore(0x00, 0xf82c50f1)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bytes32 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(string)`.\n mstore(0x00, 0x41304fac)\n mstore(0x20, 0x20)\n writeString(0x40, p0)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,address)`.\n mstore(0x00, 0xdaf0d4aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,bool)`.\n mstore(0x00, 0x75b605d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,uint256)`.\n mstore(0x00, 0x8309e8a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,string)`.\n mstore(0x00, 0x759f86bb)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,address)`.\n mstore(0x00, 0x853c4849)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,bool)`.\n mstore(0x00, 0x2a110e83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,uint256)`.\n mstore(0x00, 0x399174d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,string)`.\n mstore(0x00, 0x8feac525)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,address)`.\n mstore(0x00, 0x69276c86)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,bool)`.\n mstore(0x00, 0x1c9d7eb3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,uint256)`.\n mstore(0x00, 0xf666715a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,string)`.\n mstore(0x00, 0x643fd0df)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,address)`.\n mstore(0x00, 0x319af333)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,bool)`.\n mstore(0x00, 0xc3b55635)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,uint256)`.\n mstore(0x00, 0xb60e72cc)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,string)`.\n mstore(0x00, 0x4b5c4277)\n mstore(0x20, 0x40)\n mstore(0x40, 0x80)\n writeString(0x60, p0)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,address)`.\n mstore(0x00, 0x018c84c2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,bool)`.\n mstore(0x00, 0xf2a66286)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,uint256)`.\n mstore(0x00, 0x17fe6185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,address,string)`.\n mstore(0x00, 0x007150be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,address)`.\n mstore(0x00, 0xf11699ed)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,bool)`.\n mstore(0x00, 0xeb830c92)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,uint256)`.\n mstore(0x00, 0x9c4f99fb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,bool,string)`.\n mstore(0x00, 0x212255cc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,address)`.\n mstore(0x00, 0x7bc0d848)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,bool)`.\n mstore(0x00, 0x678209a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,uint256)`.\n mstore(0x00, 0xb69bcaf6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,uint256,string)`.\n mstore(0x00, 0xa1f2e8aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,address)`.\n mstore(0x00, 0xf08744e8)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,bool)`.\n mstore(0x00, 0xcf020fb1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,uint256)`.\n mstore(0x00, 0x67dd6ff1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(address,string,string)`.\n mstore(0x00, 0xfb772265)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,address)`.\n mstore(0x00, 0xd2763667)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,bool)`.\n mstore(0x00, 0x18c9c746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,uint256)`.\n mstore(0x00, 0x5f7b9afb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,address,string)`.\n mstore(0x00, 0xde9a9270)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,address)`.\n mstore(0x00, 0x1078f68d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,bool)`.\n mstore(0x00, 0x50709698)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,uint256)`.\n mstore(0x00, 0x12f21602)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,bool,string)`.\n mstore(0x00, 0x2555fa46)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,address)`.\n mstore(0x00, 0x088ef9d2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,bool)`.\n mstore(0x00, 0xe8defba9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,uint256)`.\n mstore(0x00, 0x37103367)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,uint256,string)`.\n mstore(0x00, 0xc3fc3970)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,address)`.\n mstore(0x00, 0x9591b953)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,bool)`.\n mstore(0x00, 0xdbb4c247)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,uint256)`.\n mstore(0x00, 0x1093ee11)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(bool,string,string)`.\n mstore(0x00, 0xb076847f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,address)`.\n mstore(0x00, 0xbcfd9be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,bool)`.\n mstore(0x00, 0x9b6ec042)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,uint256)`.\n mstore(0x00, 0x5a9b5ed5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,address,string)`.\n mstore(0x00, 0x63cb41f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,address)`.\n mstore(0x00, 0x35085f7b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,bool)`.\n mstore(0x00, 0x20718650)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,uint256)`.\n mstore(0x00, 0x20098014)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,bool,string)`.\n mstore(0x00, 0x85775021)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,address)`.\n mstore(0x00, 0x5c96b331)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,bool)`.\n mstore(0x00, 0x4766da72)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,uint256)`.\n mstore(0x00, 0xd1ed7a3c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,uint256,string)`.\n mstore(0x00, 0x71d04af2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,address)`.\n mstore(0x00, 0x7afac959)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,bool)`.\n mstore(0x00, 0x4ceda75a)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,uint256)`.\n mstore(0x00, 0x37aa7d4c)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(uint256,string,string)`.\n mstore(0x00, 0xb115611f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,address)`.\n mstore(0x00, 0xfcec75e0)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,bool)`.\n mstore(0x00, 0xc91d5ed4)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,uint256)`.\n mstore(0x00, 0x0d26b925)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,address,string)`.\n mstore(0x00, 0xe0e9ad4f)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,address)`.\n mstore(0x00, 0x932bbb38)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,bool)`.\n mstore(0x00, 0x850b7ad6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,uint256)`.\n mstore(0x00, 0xc95958d6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,bool,string)`.\n mstore(0x00, 0xe298f47d)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,address)`.\n mstore(0x00, 0x1c7ec448)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,bool)`.\n mstore(0x00, 0xca7733b1)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,uint256)`.\n mstore(0x00, 0xca47c4eb)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,uint256,string)`.\n mstore(0x00, 0x5970e089)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,address)`.\n mstore(0x00, 0x95ed0195)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,bool)`.\n mstore(0x00, 0xb0e0f9b5)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,uint256)`.\n mstore(0x00, 0x5821efa1)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n // Selector of `log(string,string,string)`.\n mstore(0x00, 0x2ced7cef)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, 0xe0)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n writeString(0x100, p2)\n }\n _sendLogPayload(0x1c, 0x124);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n }\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,address)`.\n mstore(0x00, 0x665bf134)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,bool)`.\n mstore(0x00, 0x0e378994)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,uint256)`.\n mstore(0x00, 0x94250d77)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,address,string)`.\n mstore(0x00, 0xf808da20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,address)`.\n mstore(0x00, 0x9f1bc36e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,bool)`.\n mstore(0x00, 0x2cd4134a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,uint256)`.\n mstore(0x00, 0x3971e78c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,bool,string)`.\n mstore(0x00, 0xaa6540c8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,address)`.\n mstore(0x00, 0x8da6def5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,bool)`.\n mstore(0x00, 0x9b4254e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,uint256)`.\n mstore(0x00, 0xbe553481)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,uint256,string)`.\n mstore(0x00, 0xfdb4f990)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,address)`.\n mstore(0x00, 0x8f736d16)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,bool)`.\n mstore(0x00, 0x6f1a594e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,uint256)`.\n mstore(0x00, 0xef1cefe7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,address,string,string)`.\n mstore(0x00, 0x21bdaf25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,address)`.\n mstore(0x00, 0x660375dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,bool)`.\n mstore(0x00, 0xa6f50b0f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,uint256)`.\n mstore(0x00, 0xa75c59de)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,address,string)`.\n mstore(0x00, 0x2dd778e6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,address)`.\n mstore(0x00, 0xcf394485)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,bool)`.\n mstore(0x00, 0xcac43479)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,uint256)`.\n mstore(0x00, 0x8c4e5de6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,bool,string)`.\n mstore(0x00, 0xdfc4a2e8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,address)`.\n mstore(0x00, 0xccf790a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,bool)`.\n mstore(0x00, 0xc4643e20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,uint256)`.\n mstore(0x00, 0x386ff5f4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,uint256,string)`.\n mstore(0x00, 0x0aa6cfad)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,address)`.\n mstore(0x00, 0x19fd4956)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,bool)`.\n mstore(0x00, 0x50ad461d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,uint256)`.\n mstore(0x00, 0x80e6a20b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,bool,string,string)`.\n mstore(0x00, 0x475c5c33)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,address)`.\n mstore(0x00, 0x478d1c62)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,bool)`.\n mstore(0x00, 0xa1bcc9b3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,uint256)`.\n mstore(0x00, 0x100f650e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,address,string)`.\n mstore(0x00, 0x1da986ea)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,address)`.\n mstore(0x00, 0xa31bfdcc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,bool)`.\n mstore(0x00, 0x3bf5e537)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,uint256)`.\n mstore(0x00, 0x22f6b999)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,bool,string)`.\n mstore(0x00, 0xc5ad85f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,address)`.\n mstore(0x00, 0x20e3984d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,bool)`.\n mstore(0x00, 0x66f1bc67)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,uint256)`.\n mstore(0x00, 0x34f0e636)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,uint256,string)`.\n mstore(0x00, 0x4a28c017)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,address)`.\n mstore(0x00, 0x5c430d47)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,bool)`.\n mstore(0x00, 0xcf18105c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,uint256)`.\n mstore(0x00, 0xbf01f891)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,uint256,string,string)`.\n mstore(0x00, 0x88a8c406)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,address)`.\n mstore(0x00, 0x0d36fa20)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,bool)`.\n mstore(0x00, 0x0df12b76)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,uint256)`.\n mstore(0x00, 0x457fe3cf)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,address,string)`.\n mstore(0x00, 0xf7e36245)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,address)`.\n mstore(0x00, 0x205871c2)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,bool)`.\n mstore(0x00, 0x5f1d5c9f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,uint256)`.\n mstore(0x00, 0x515e38b6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,bool,string)`.\n mstore(0x00, 0xbc0b61fe)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,address)`.\n mstore(0x00, 0x63183678)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,bool)`.\n mstore(0x00, 0x0ef7e050)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,uint256)`.\n mstore(0x00, 0x1dc8e1b8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,uint256,string)`.\n mstore(0x00, 0x448830a8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,address)`.\n mstore(0x00, 0xa04e2f87)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,bool)`.\n mstore(0x00, 0x35a5071f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,uint256)`.\n mstore(0x00, 0x159f8927)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(address,string,string,string)`.\n mstore(0x00, 0x5d02c50b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,address)`.\n mstore(0x00, 0x1d14d001)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,bool)`.\n mstore(0x00, 0x46600be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,uint256)`.\n mstore(0x00, 0x0c66d1be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,address,string)`.\n mstore(0x00, 0xd812a167)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,address)`.\n mstore(0x00, 0x1c41a336)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,bool)`.\n mstore(0x00, 0x6a9c478b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,uint256)`.\n mstore(0x00, 0x07831502)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,bool,string)`.\n mstore(0x00, 0x4a66cb34)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,address)`.\n mstore(0x00, 0x136b05dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,bool)`.\n mstore(0x00, 0xd6019f1c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,uint256)`.\n mstore(0x00, 0x7bf181a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,uint256,string)`.\n mstore(0x00, 0x51f09ff8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,address)`.\n mstore(0x00, 0x6f7c603e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,bool)`.\n mstore(0x00, 0xe2bfd60b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,uint256)`.\n mstore(0x00, 0xc21f64c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,address,string,string)`.\n mstore(0x00, 0xa73c1db6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,address)`.\n mstore(0x00, 0xf4880ea4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,bool)`.\n mstore(0x00, 0xc0a302d8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,uint256)`.\n mstore(0x00, 0x4c123d57)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,address,string)`.\n mstore(0x00, 0xa0a47963)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,address)`.\n mstore(0x00, 0x8c329b1a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,bool)`.\n mstore(0x00, 0x3b2a5ce0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,uint256)`.\n mstore(0x00, 0x6d7045c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,bool,string)`.\n mstore(0x00, 0x2ae408d4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,address)`.\n mstore(0x00, 0x54a7a9a0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,bool)`.\n mstore(0x00, 0x619e4d0e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,uint256)`.\n mstore(0x00, 0x0bb00eab)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,uint256,string)`.\n mstore(0x00, 0x7dd4d0e0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,address)`.\n mstore(0x00, 0xf9ad2b89)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,bool)`.\n mstore(0x00, 0xb857163a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,uint256)`.\n mstore(0x00, 0xe3a9ca2f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,bool,string,string)`.\n mstore(0x00, 0x6d1e8751)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,address)`.\n mstore(0x00, 0x26f560a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,bool)`.\n mstore(0x00, 0xb4c314ff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,uint256)`.\n mstore(0x00, 0x1537dc87)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,address,string)`.\n mstore(0x00, 0x1bb3b09a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,address)`.\n mstore(0x00, 0x9acd3616)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,bool)`.\n mstore(0x00, 0xceb5f4d7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,uint256)`.\n mstore(0x00, 0x7f9bbca2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,bool,string)`.\n mstore(0x00, 0x9143dbb1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,address)`.\n mstore(0x00, 0x00dd87b9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,bool)`.\n mstore(0x00, 0xbe984353)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,uint256)`.\n mstore(0x00, 0x374bb4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,uint256,string)`.\n mstore(0x00, 0x8e69fb5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,address)`.\n mstore(0x00, 0xfedd1fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,bool)`.\n mstore(0x00, 0xe5e70b2b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,uint256)`.\n mstore(0x00, 0x6a1199e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,uint256,string,string)`.\n mstore(0x00, 0xf5bc2249)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,address)`.\n mstore(0x00, 0x2b2b18dc)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,bool)`.\n mstore(0x00, 0x6dd434ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,uint256)`.\n mstore(0x00, 0xa5cada94)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,address,string)`.\n mstore(0x00, 0x12d6c788)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,address)`.\n mstore(0x00, 0x538e06ab)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,bool)`.\n mstore(0x00, 0xdc5e935b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,uint256)`.\n mstore(0x00, 0x1606a393)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,bool,string)`.\n mstore(0x00, 0x483d0416)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,address)`.\n mstore(0x00, 0x1596a1ce)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,bool)`.\n mstore(0x00, 0x6b0e5d53)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,uint256)`.\n mstore(0x00, 0x28863fcb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,uint256,string)`.\n mstore(0x00, 0x1ad96de6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,address)`.\n mstore(0x00, 0x97d394d8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,bool)`.\n mstore(0x00, 0x1e4b87e5)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,uint256)`.\n mstore(0x00, 0x7be0c3eb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(bool,string,string,string)`.\n mstore(0x00, 0x1762e32a)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,address)`.\n mstore(0x00, 0x2488b414)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,bool)`.\n mstore(0x00, 0x091ffaf5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,uint256)`.\n mstore(0x00, 0x736efbb6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,address,string)`.\n mstore(0x00, 0x031c6f73)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,address)`.\n mstore(0x00, 0xef72c513)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,bool)`.\n mstore(0x00, 0xe351140f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,uint256)`.\n mstore(0x00, 0x5abd992a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,bool,string)`.\n mstore(0x00, 0x90fb06aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,address)`.\n mstore(0x00, 0x15c127b5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,bool)`.\n mstore(0x00, 0x5f743a7c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,uint256)`.\n mstore(0x00, 0x0c9cd9c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,uint256,string)`.\n mstore(0x00, 0xddb06521)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,address)`.\n mstore(0x00, 0x9cba8fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,bool)`.\n mstore(0x00, 0xcc32ab07)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,uint256)`.\n mstore(0x00, 0x46826b5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,address,string,string)`.\n mstore(0x00, 0x3e128ca3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,address)`.\n mstore(0x00, 0xa1ef4cbb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,bool)`.\n mstore(0x00, 0x454d54a5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,uint256)`.\n mstore(0x00, 0x078287f5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,address,string)`.\n mstore(0x00, 0xade052c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,address)`.\n mstore(0x00, 0x69640b59)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,bool)`.\n mstore(0x00, 0xb6f577a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,uint256)`.\n mstore(0x00, 0x7464ce23)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,bool,string)`.\n mstore(0x00, 0xdddb9561)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,address)`.\n mstore(0x00, 0x88cb6041)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,bool)`.\n mstore(0x00, 0x91a02e2a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,uint256)`.\n mstore(0x00, 0xc6acc7a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,uint256,string)`.\n mstore(0x00, 0xde03e774)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,address)`.\n mstore(0x00, 0xef529018)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,bool)`.\n mstore(0x00, 0xeb928d7f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,uint256)`.\n mstore(0x00, 0x2c1d0746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,bool,string,string)`.\n mstore(0x00, 0x68c8b8bd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,address)`.\n mstore(0x00, 0x56a5d1b1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,bool)`.\n mstore(0x00, 0x15cac476)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,uint256)`.\n mstore(0x00, 0x88f6e4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,address,string)`.\n mstore(0x00, 0x6cde40b8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,address)`.\n mstore(0x00, 0x9a816a83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,bool)`.\n mstore(0x00, 0xab085ae6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,uint256)`.\n mstore(0x00, 0xeb7f6fd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,bool,string)`.\n mstore(0x00, 0xa5b4fc99)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,address)`.\n mstore(0x00, 0xfa8185af)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,bool)`.\n mstore(0x00, 0xc598d185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,uint256)`.\n mstore(0x00, 0x193fb800)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,uint256,string)`.\n mstore(0x00, 0x59cfcbe3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,address)`.\n mstore(0x00, 0x42d21db7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,bool)`.\n mstore(0x00, 0x7af6ab25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,uint256)`.\n mstore(0x00, 0x5da297eb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,uint256,string,string)`.\n mstore(0x00, 0x27d8afd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,address)`.\n mstore(0x00, 0x6168ed61)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,bool)`.\n mstore(0x00, 0x90c30a56)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,uint256)`.\n mstore(0x00, 0xe8d3018d)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,address,string)`.\n mstore(0x00, 0x9c3adfa1)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,address)`.\n mstore(0x00, 0xae2ec581)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,bool)`.\n mstore(0x00, 0xba535d9c)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,uint256)`.\n mstore(0x00, 0xcf009880)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,bool,string)`.\n mstore(0x00, 0xd2d423cd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,address)`.\n mstore(0x00, 0x3b2279b4)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,bool)`.\n mstore(0x00, 0x691a8f74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,uint256)`.\n mstore(0x00, 0x82c25b74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,uint256,string)`.\n mstore(0x00, 0xb7b914ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,address)`.\n mstore(0x00, 0xd583c602)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,bool)`.\n mstore(0x00, 0xb3a6b6bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,uint256)`.\n mstore(0x00, 0xb028c9bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(uint256,string,string,string)`.\n mstore(0x00, 0x21ad0683)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,address)`.\n mstore(0x00, 0xed8f28f6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,bool)`.\n mstore(0x00, 0xb59dbd60)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,uint256)`.\n mstore(0x00, 0x8ef3f399)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,address,string)`.\n mstore(0x00, 0x800a1c67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,address)`.\n mstore(0x00, 0x223603bd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,bool)`.\n mstore(0x00, 0x79884c2b)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,uint256)`.\n mstore(0x00, 0x3e9f866a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,bool,string)`.\n mstore(0x00, 0x0454c079)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,address)`.\n mstore(0x00, 0x63fb8bc5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,bool)`.\n mstore(0x00, 0xfc4845f0)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,uint256)`.\n mstore(0x00, 0xf8f51b1e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,uint256,string)`.\n mstore(0x00, 0x5a477632)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,address)`.\n mstore(0x00, 0xaabc9a31)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,bool)`.\n mstore(0x00, 0x5f15d28c)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,uint256)`.\n mstore(0x00, 0x91d1112e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,address,string,string)`.\n mstore(0x00, 0x245986f2)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,address)`.\n mstore(0x00, 0x33e9dd1d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,bool)`.\n mstore(0x00, 0x958c28c6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,uint256)`.\n mstore(0x00, 0x5d08bb05)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,address,string)`.\n mstore(0x00, 0x2d8e33a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,address)`.\n mstore(0x00, 0x7190a529)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,bool)`.\n mstore(0x00, 0x895af8c5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,uint256)`.\n mstore(0x00, 0x8e3f78a9)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,bool,string)`.\n mstore(0x00, 0x9d22d5dd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,address)`.\n mstore(0x00, 0x935e09bf)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,bool)`.\n mstore(0x00, 0x8af7cf8a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,uint256)`.\n mstore(0x00, 0x64b5bb67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,uint256,string)`.\n mstore(0x00, 0x742d6ee7)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,address)`.\n mstore(0x00, 0xe0625b29)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,bool)`.\n mstore(0x00, 0x3f8a701d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,uint256)`.\n mstore(0x00, 0x24f91465)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,bool,string,string)`.\n mstore(0x00, 0xa826caeb)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,address)`.\n mstore(0x00, 0x5ea2b7ae)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,bool)`.\n mstore(0x00, 0x82112a42)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,uint256)`.\n mstore(0x00, 0x4f04fdc6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,address,string)`.\n mstore(0x00, 0x9ffb2f93)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,address)`.\n mstore(0x00, 0xe0e95b98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,bool)`.\n mstore(0x00, 0x354c36d6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,uint256)`.\n mstore(0x00, 0xe41b6f6f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,bool,string)`.\n mstore(0x00, 0xabf73a98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,address)`.\n mstore(0x00, 0xe21de278)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,bool)`.\n mstore(0x00, 0x7626db92)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,uint256)`.\n mstore(0x00, 0xa7a87853)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,uint256,string)`.\n mstore(0x00, 0x854b3496)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,address)`.\n mstore(0x00, 0x7c4632a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,bool)`.\n mstore(0x00, 0x7d24491d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,uint256)`.\n mstore(0x00, 0xc67ea9d1)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,uint256,string,string)`.\n mstore(0x00, 0x5ab84e1f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,address)`.\n mstore(0x00, 0x439c7bef)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,bool)`.\n mstore(0x00, 0x5ccd4e37)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,uint256)`.\n mstore(0x00, 0x7cc3c607)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,address,string)`.\n mstore(0x00, 0xeb1bff80)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,address)`.\n mstore(0x00, 0xc371c7db)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,bool)`.\n mstore(0x00, 0x40785869)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,uint256)`.\n mstore(0x00, 0xd6aefad2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,bool,string)`.\n mstore(0x00, 0x5e84b0ea)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,address)`.\n mstore(0x00, 0x1023f7b2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,bool)`.\n mstore(0x00, 0xc3a8a654)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,uint256)`.\n mstore(0x00, 0xf45d7d2c)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,uint256,string)`.\n mstore(0x00, 0x5d1a971a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,address)`.\n mstore(0x00, 0x6d572f44)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,bool)`.\n mstore(0x00, 0x2c1754ed)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,uint256)`.\n mstore(0x00, 0x8eafb02b)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n bytes32 m11;\n bytes32 m12;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n m11 := mload(0x160)\n m12 := mload(0x180)\n // Selector of `log(string,string,string,string)`.\n mstore(0x00, 0xde68f20a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, 0x140)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n writeString(0x160, p3)\n }\n _sendLogPayload(0x1c, 0x184);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n mstore(0x160, m11)\n mstore(0x180, m12)\n }\n }\n}\n" + }, + "forge-std/StdAssertions.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdAssertions {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n event log(string);\n event logs(bytes);\n\n event log_address(address);\n event log_bytes32(bytes32);\n event log_int(int256);\n event log_uint(uint256);\n event log_bytes(bytes);\n event log_string(string);\n\n event log_named_address(string key, address val);\n event log_named_bytes32(string key, bytes32 val);\n event log_named_decimal_int(string key, int256 val, uint256 decimals);\n event log_named_decimal_uint(string key, uint256 val, uint256 decimals);\n event log_named_int(string key, int256 val);\n event log_named_uint(string key, uint256 val);\n event log_named_bytes(string key, bytes val);\n event log_named_string(string key, string val);\n\n event log_array(uint256[] val);\n event log_array(int256[] val);\n event log_array(address[] val);\n event log_named_array(string key, uint256[] val);\n event log_named_array(string key, int256[] val);\n event log_named_array(string key, address[] val);\n\n bool private _failed;\n\n function failed() public view returns (bool) {\n if (_failed) {\n return _failed;\n } else {\n return vm.load(address(vm), bytes32(\"failed\")) != bytes32(0);\n }\n }\n\n function fail() internal virtual {\n vm.store(address(vm), bytes32(\"failed\"), bytes32(uint256(1)));\n _failed = true;\n }\n\n function assertTrue(bool data) internal pure virtual {\n vm.assertTrue(data);\n }\n\n function assertTrue(bool data, string memory err) internal pure virtual {\n vm.assertTrue(data, err);\n }\n\n function assertFalse(bool data) internal pure virtual {\n vm.assertFalse(data);\n }\n\n function assertFalse(bool data, string memory err) internal pure virtual {\n vm.assertFalse(data, err);\n }\n\n function assertEq(bool left, bool right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(int256 left, int256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(address left, address right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address left, address right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertEq(string memory left, string memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n // Legacy helper\n function assertEqUint(uint256 left, uint256 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertNotEq(bool left, bool right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(int256 left, int256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(address left, address right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address left, address right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertNotEq(string memory left, string memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertLt(uint256 left, uint256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertLt(int256 left, int256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertGt(uint256 left, uint256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertGt(int256 left, int256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertLe(uint256 left, uint256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertLe(int256 left, int256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertGe(uint256 left, uint256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertGe(int256 left, int256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n // Inherited from DSTest, not used but kept for backwards-compatibility\n function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {\n return keccak256(left) == keccak256(right);\n }\n\n function assertEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {\n assertEqCall(target, callDataA, target, callDataB, true);\n }\n\n function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)\n internal\n virtual\n {\n assertEqCall(targetA, callDataA, targetB, callDataB, true);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)\n internal\n virtual\n {\n assertEqCall(target, callDataA, target, callDataB, strictRevertData);\n }\n\n function assertEqCall(\n address targetA,\n bytes memory callDataA,\n address targetB,\n bytes memory callDataB,\n bool strictRevertData\n ) internal virtual {\n (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);\n (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);\n\n if (successA && successB) {\n assertEq(returnDataA, returnDataB, \"Call return data does not match\");\n }\n\n if (!successA && !successB && strictRevertData) {\n assertEq(returnDataA, returnDataB, \"Call revert data does not match\");\n }\n\n if (!successA && successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call revert data\", returnDataA);\n emit log_named_bytes(\" Right call return data\", returnDataB);\n revert(\"assertion failed\");\n }\n\n if (successA && !successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call return data\", returnDataA);\n emit log_named_bytes(\" Right call revert data\", returnDataB);\n revert(\"assertion failed\");\n }\n }\n}\n" + }, + "forge-std/StdChains.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n/**\n * StdChains provides information about EVM compatible chains that can be used in scripts/tests.\n * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are\n * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of\n * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the\n * alias used in this contract, which can be found as the first argument to the\n * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.\n *\n * There are two main ways to use this contract:\n * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or\n * `setChain(string memory chainAlias, Chain memory chain)`\n * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.\n *\n * The first time either of those are used, chains are initialized with the default set of RPC URLs.\n * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in\n * `defaultRpcUrls`.\n *\n * The `setChain` function is straightforward, and it simply saves off the given chain data.\n *\n * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say\n * we want to retrieve the RPC URL for `mainnet`:\n * - If you have specified data with `setChain`, it will return that.\n * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it\n * is valid (e.g. a URL is specified, or an environment variable is given and exists).\n * - If neither of the above conditions is met, the default data is returned.\n *\n * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.\n */\nabstract contract StdChains {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n bool private stdChainsInitialized;\n\n struct ChainData {\n string name;\n uint256 chainId;\n string rpcUrl;\n }\n\n struct Chain {\n // The chain name.\n string name;\n // The chain's Chain ID.\n uint256 chainId;\n // The chain's alias. (i.e. what gets specified in `foundry.toml`).\n string chainAlias;\n // A default RPC endpoint for this chain.\n // NOTE: This default RPC URL is included for convenience to facilitate quick tests and\n // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy\n // usage as you will be throttled and this is a disservice to others who need this endpoint.\n string rpcUrl;\n }\n\n // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.\n mapping(string => Chain) private chains;\n // Maps from the chain's alias to it's default RPC URL.\n mapping(string => string) private defaultRpcUrls;\n // Maps from a chain ID to it's alias.\n mapping(uint256 => string) private idToAlias;\n\n bool private fallbackToDefaultRpcUrls = true;\n\n // The RPC URL will be fetched from config or defaultRpcUrls if possible.\n function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {\n require(bytes(chainAlias).length != 0, \"StdChains getChain(string): Chain alias cannot be the empty string.\");\n\n initializeStdChains();\n chain = chains[chainAlias];\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(string): Chain with alias \\\"\", chainAlias, \"\\\" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {\n require(chainId != 0, \"StdChains getChain(uint256): Chain ID cannot be 0.\");\n initializeStdChains();\n string memory chainAlias = idToAlias[chainId];\n\n chain = chains[chainAlias];\n\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(uint256): Chain with ID \", vm.toString(chainId), \" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, ChainData memory chain) internal virtual {\n require(\n bytes(chainAlias).length != 0,\n \"StdChains setChain(string,ChainData): Chain alias cannot be the empty string.\"\n );\n\n require(chain.chainId != 0, \"StdChains setChain(string,ChainData): Chain ID cannot be 0.\");\n\n initializeStdChains();\n string memory foundAlias = idToAlias[chain.chainId];\n\n require(\n bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),\n string(\n abi.encodePacked(\n \"StdChains setChain(string,ChainData): Chain ID \",\n vm.toString(chain.chainId),\n \" already used by \\\"\",\n foundAlias,\n \"\\\".\"\n )\n )\n );\n\n uint256 oldChainId = chains[chainAlias].chainId;\n delete idToAlias[oldChainId];\n\n chains[chainAlias] =\n Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});\n idToAlias[chain.chainId] = chainAlias;\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, Chain memory chain) internal virtual {\n setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));\n }\n\n function _toUpper(string memory str) private pure returns (string memory) {\n bytes memory strb = bytes(str);\n bytes memory copy = new bytes(strb.length);\n for (uint256 i = 0; i < strb.length; i++) {\n bytes1 b = strb[i];\n if (b >= 0x61 && b <= 0x7A) {\n copy[i] = bytes1(uint8(b) - 32);\n } else {\n copy[i] = b;\n }\n }\n return string(copy);\n }\n\n // lookup rpcUrl, in descending order of priority:\n // current -> config (foundry.toml) -> environment variable -> default\n function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)\n private\n view\n returns (Chain memory)\n {\n if (bytes(chain.rpcUrl).length == 0) {\n try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {\n chain.rpcUrl = configRpcUrl;\n } catch (bytes memory err) {\n string memory envName = string(abi.encodePacked(_toUpper(chainAlias), \"_RPC_URL\"));\n if (fallbackToDefaultRpcUrls) {\n chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);\n } else {\n chain.rpcUrl = vm.envString(envName);\n }\n // Distinguish 'not found' from 'cannot read'\n // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions\n bytes memory oldNotFoundError =\n abi.encodeWithSignature(\"CheatCodeError\", string(abi.encodePacked(\"invalid rpc url \", chainAlias)));\n bytes memory newNotFoundError = abi.encodeWithSignature(\n \"CheatcodeError(string)\", string(abi.encodePacked(\"invalid rpc url: \", chainAlias))\n );\n bytes32 errHash = keccak256(err);\n if (\n (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))\n || bytes(chain.rpcUrl).length == 0\n ) {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, err), mload(err))\n }\n }\n }\n }\n return chain;\n }\n\n function setFallbackToDefaultRpcUrls(bool useDefault) internal {\n fallbackToDefaultRpcUrls = useDefault;\n }\n\n function initializeStdChains() private {\n if (stdChainsInitialized) return;\n\n stdChainsInitialized = true;\n\n // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`\n setChainWithDefaultRpcUrl(\"anvil\", ChainData(\"Anvil\", 31337, \"http://127.0.0.1:8545\"));\n setChainWithDefaultRpcUrl(\n \"mainnet\", ChainData(\"Mainnet\", 1, \"https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP\")\n );\n setChainWithDefaultRpcUrl(\n \"sepolia\", ChainData(\"Sepolia\", 11155111, \"https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001\")\n );\n setChainWithDefaultRpcUrl(\"holesky\", ChainData(\"Holesky\", 17000, \"https://rpc.holesky.ethpandaops.io\"));\n setChainWithDefaultRpcUrl(\"optimism\", ChainData(\"Optimism\", 10, \"https://mainnet.optimism.io\"));\n setChainWithDefaultRpcUrl(\n \"optimism_sepolia\", ChainData(\"Optimism Sepolia\", 11155420, \"https://sepolia.optimism.io\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_one\", ChainData(\"Arbitrum One\", 42161, \"https://arb1.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\n \"arbitrum_one_sepolia\", ChainData(\"Arbitrum One Sepolia\", 421614, \"https://sepolia-rollup.arbitrum.io/rpc\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_nova\", ChainData(\"Arbitrum Nova\", 42170, \"https://nova.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\"polygon\", ChainData(\"Polygon\", 137, \"https://polygon-rpc.com\"));\n setChainWithDefaultRpcUrl(\n \"polygon_amoy\", ChainData(\"Polygon Amoy\", 80002, \"https://rpc-amoy.polygon.technology\")\n );\n setChainWithDefaultRpcUrl(\"avalanche\", ChainData(\"Avalanche\", 43114, \"https://api.avax.network/ext/bc/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"avalanche_fuji\", ChainData(\"Avalanche Fuji\", 43113, \"https://api.avax-test.network/ext/bc/C/rpc\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain\", ChainData(\"BNB Smart Chain\", 56, \"https://bsc-dataseed1.binance.org\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain_testnet\",\n ChainData(\"BNB Smart Chain Testnet\", 97, \"https://rpc.ankr.com/bsc_testnet_chapel\")\n );\n setChainWithDefaultRpcUrl(\"gnosis_chain\", ChainData(\"Gnosis Chain\", 100, \"https://rpc.gnosischain.com\"));\n setChainWithDefaultRpcUrl(\"moonbeam\", ChainData(\"Moonbeam\", 1284, \"https://rpc.api.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\n \"moonriver\", ChainData(\"Moonriver\", 1285, \"https://rpc.api.moonriver.moonbeam.network\")\n );\n setChainWithDefaultRpcUrl(\"moonbase\", ChainData(\"Moonbase\", 1287, \"https://rpc.testnet.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\"base_sepolia\", ChainData(\"Base Sepolia\", 84532, \"https://sepolia.base.org\"));\n setChainWithDefaultRpcUrl(\"base\", ChainData(\"Base\", 8453, \"https://mainnet.base.org\"));\n setChainWithDefaultRpcUrl(\"blast_sepolia\", ChainData(\"Blast Sepolia\", 168587773, \"https://sepolia.blast.io\"));\n setChainWithDefaultRpcUrl(\"blast\", ChainData(\"Blast\", 81457, \"https://rpc.blast.io\"));\n setChainWithDefaultRpcUrl(\"fantom_opera\", ChainData(\"Fantom Opera\", 250, \"https://rpc.ankr.com/fantom/\"));\n setChainWithDefaultRpcUrl(\n \"fantom_opera_testnet\", ChainData(\"Fantom Opera Testnet\", 4002, \"https://rpc.ankr.com/fantom_testnet/\")\n );\n setChainWithDefaultRpcUrl(\"fraxtal\", ChainData(\"Fraxtal\", 252, \"https://rpc.frax.com\"));\n setChainWithDefaultRpcUrl(\"fraxtal_testnet\", ChainData(\"Fraxtal Testnet\", 2522, \"https://rpc.testnet.frax.com\"));\n setChainWithDefaultRpcUrl(\n \"berachain_bartio_testnet\", ChainData(\"Berachain bArtio Testnet\", 80084, \"https://bartio.rpc.berachain.com\")\n );\n setChainWithDefaultRpcUrl(\"flare\", ChainData(\"Flare\", 14, \"https://flare-api.flare.network/ext/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"flare_coston2\", ChainData(\"Flare Coston2\", 114, \"https://coston2-api.flare.network/ext/C/rpc\")\n );\n }\n\n // set chain info, with priority to chainAlias' rpc url in foundry.toml\n function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {\n string memory rpcUrl = chain.rpcUrl;\n defaultRpcUrls[chainAlias] = rpcUrl;\n chain.rpcUrl = \"\";\n setChain(chainAlias, chain);\n chain.rpcUrl = rpcUrl; // restore argument\n }\n}\n" + }, + "forge-std/StdCheats.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {console2} from \"./console2.sol\";\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdCheatsSafe {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n bool private gasMeteringOff;\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawTx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n // json value name = function\n string functionSig;\n bytes32 hash;\n // json value name = tx\n RawTx1559Detail txDetail;\n // json value name = type\n string opcode;\n }\n\n struct RawTx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n bytes gas;\n bytes nonce;\n address to;\n bytes txType;\n bytes value;\n }\n\n struct Tx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n bytes32 hash;\n Tx1559Detail txDetail;\n string opcode;\n }\n\n struct Tx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n uint256 gas;\n uint256 nonce;\n address to;\n uint256 txType;\n uint256 value;\n }\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct TxLegacy {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n string hash;\n string opcode;\n TxDetailLegacy transaction;\n }\n\n struct TxDetailLegacy {\n AccessList[] accessList;\n uint256 chainId;\n bytes data;\n address from;\n uint256 gas;\n uint256 gasPrice;\n bytes32 hash;\n uint256 nonce;\n bytes1 opcode;\n bytes32 r;\n bytes32 s;\n uint256 txType;\n address to;\n uint8 v;\n uint256 value;\n }\n\n struct AccessList {\n address accessAddress;\n bytes32[] storageKeys;\n }\n\n // Data structures to parse Receipt objects from the broadcast artifact.\n // The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawReceipt {\n bytes32 blockHash;\n bytes blockNumber;\n address contractAddress;\n bytes cumulativeGasUsed;\n bytes effectiveGasPrice;\n address from;\n bytes gasUsed;\n RawReceiptLog[] logs;\n bytes logsBloom;\n bytes status;\n address to;\n bytes32 transactionHash;\n bytes transactionIndex;\n }\n\n struct Receipt {\n bytes32 blockHash;\n uint256 blockNumber;\n address contractAddress;\n uint256 cumulativeGasUsed;\n uint256 effectiveGasPrice;\n address from;\n uint256 gasUsed;\n ReceiptLog[] logs;\n bytes logsBloom;\n uint256 status;\n address to;\n bytes32 transactionHash;\n uint256 transactionIndex;\n }\n\n // Data structures to parse the entire broadcast artifact, assuming the\n // transactions conform to EIP1559.\n\n struct EIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n Receipt[] receipts;\n uint256 timestamp;\n Tx1559[] transactions;\n TxReturn[] txReturns;\n }\n\n struct RawEIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n RawReceipt[] receipts;\n TxReturn[] txReturns;\n uint256 timestamp;\n RawTx1559[] transactions;\n }\n\n struct RawReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n bytes blockNumber;\n bytes data;\n bytes logIndex;\n bool removed;\n bytes32[] topics;\n bytes32 transactionHash;\n bytes transactionIndex;\n bytes transactionLogIndex;\n }\n\n struct ReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n uint256 blockNumber;\n bytes data;\n uint256 logIndex;\n bytes32[] topics;\n uint256 transactionIndex;\n uint256 transactionLogIndex;\n bool removed;\n }\n\n struct TxReturn {\n string internalType;\n string value;\n }\n\n struct Account {\n address addr;\n uint256 key;\n }\n\n enum AddressType {\n Payable,\n NonPayable,\n ZeroAddress,\n Precompile,\n ForgeAddress\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n function assumeNotBlacklisted(address token, address addr) internal view virtual {\n // Nothing to check if `token` is not a contract.\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.\");\n\n bool success;\n bytes memory returnData;\n\n // 4-byte selector for `isBlacklisted(address)`, used by USDC.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n\n // 4-byte selector for `isBlackListed(address)`, used by USDT.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for\n // backwards compatibility, since this name was used in the original PR which already has\n // a release. This function can be removed in a future release once we want a breaking change.\n function assumeNoBlacklisted(address token, address addr) internal view virtual {\n assumeNotBlacklisted(token, addr);\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {\n if (addressType == AddressType.Payable) {\n assumeNotPayable(addr);\n } else if (addressType == AddressType.NonPayable) {\n assumePayable(addr);\n } else if (addressType == AddressType.ZeroAddress) {\n assumeNotZeroAddress(addr);\n } else if (addressType == AddressType.Precompile) {\n assumeNotPrecompile(addr);\n } else if (addressType == AddressType.ForgeAddress) {\n assumeNotForgeAddress(addr);\n }\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3,\n AddressType addressType4\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n assumeAddressIsNot(addr, addressType4);\n }\n\n // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to\n // `addr` and checking the `success` return value.\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used.\n function _isPayable(address addr) private returns (bool) {\n require(\n addr.balance < UINT256_MAX,\n \"StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds\"\n );\n uint256 origBalanceTest = address(this).balance;\n uint256 origBalanceAddr = address(addr).balance;\n\n vm.deal(address(this), 1);\n (bool success,) = payable(addr).call{value: 1}(\"\");\n\n // reset balances\n vm.deal(address(this), origBalanceTest);\n vm.deal(addr, origBalanceAddr);\n\n return success;\n }\n\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used. See the\n // `_isPayable` method for more information.\n function assumePayable(address addr) internal virtual {\n vm.assume(_isPayable(addr));\n }\n\n function assumeNotPayable(address addr) internal virtual {\n vm.assume(!_isPayable(addr));\n }\n\n function assumeNotZeroAddress(address addr) internal pure virtual {\n vm.assume(addr != address(0));\n }\n\n function assumeNotPrecompile(address addr) internal pure virtual {\n assumeNotPrecompile(addr, _pureChainId());\n }\n\n function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {\n // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific\n // address), but the same rationale for excluding them applies so we include those too.\n\n // These are reserved by Ethereum and may be on all EVM-compatible chains.\n vm.assume(addr < address(0x1) || addr > address(0xff));\n\n // forgefmt: disable-start\n if (chainId == 10 || chainId == 420) {\n // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21\n vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));\n } else if (chainId == 42161 || chainId == 421613) {\n // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains\n vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));\n } else if (chainId == 43114 || chainId == 43113) {\n // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59\n vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));\n vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));\n vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));\n }\n // forgefmt: disable-end\n }\n\n function assumeNotForgeAddress(address addr) internal pure virtual {\n // vm, console, and Create2Deployer addresses\n vm.assume(\n addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67\n && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C\n );\n }\n\n function readEIP1559ScriptArtifact(string memory path)\n internal\n view\n virtual\n returns (EIP1559ScriptArtifact memory)\n {\n string memory data = vm.readFile(path);\n bytes memory parsedData = vm.parseJson(data);\n RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));\n EIP1559ScriptArtifact memory artifact;\n artifact.libraries = rawArtifact.libraries;\n artifact.path = rawArtifact.path;\n artifact.timestamp = rawArtifact.timestamp;\n artifact.pending = rawArtifact.pending;\n artifact.txReturns = rawArtifact.txReturns;\n artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);\n artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);\n return artifact;\n }\n\n function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {\n Tx1559[] memory txs = new Tx1559[](rawTxs.length);\n for (uint256 i; i < rawTxs.length; i++) {\n txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);\n }\n return txs;\n }\n\n function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {\n Tx1559 memory transaction;\n transaction.arguments = rawTx.arguments;\n transaction.contractName = rawTx.contractName;\n transaction.functionSig = rawTx.functionSig;\n transaction.hash = rawTx.hash;\n transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);\n transaction.opcode = rawTx.opcode;\n return transaction;\n }\n\n function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)\n internal\n pure\n virtual\n returns (Tx1559Detail memory)\n {\n Tx1559Detail memory txDetail;\n txDetail.data = rawDetail.data;\n txDetail.from = rawDetail.from;\n txDetail.to = rawDetail.to;\n txDetail.nonce = _bytesToUint(rawDetail.nonce);\n txDetail.txType = _bytesToUint(rawDetail.txType);\n txDetail.value = _bytesToUint(rawDetail.value);\n txDetail.gas = _bytesToUint(rawDetail.gas);\n txDetail.accessList = rawDetail.accessList;\n return txDetail;\n }\n\n function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".transactions\");\n RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));\n return rawToConvertedEIPTx1559s(rawTxs);\n }\n\n function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".transactions[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));\n return rawToConvertedEIPTx1559(rawTx);\n }\n\n // Analogous to readTransactions, but for receipts.\n function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".receipts\");\n RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));\n return rawToConvertedReceipts(rawReceipts);\n }\n\n function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".receipts[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));\n return rawToConvertedReceipt(rawReceipt);\n }\n\n function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {\n Receipt[] memory receipts = new Receipt[](rawReceipts.length);\n for (uint256 i; i < rawReceipts.length; i++) {\n receipts[i] = rawToConvertedReceipt(rawReceipts[i]);\n }\n return receipts;\n }\n\n function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {\n Receipt memory receipt;\n receipt.blockHash = rawReceipt.blockHash;\n receipt.to = rawReceipt.to;\n receipt.from = rawReceipt.from;\n receipt.contractAddress = rawReceipt.contractAddress;\n receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);\n receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);\n receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);\n receipt.status = _bytesToUint(rawReceipt.status);\n receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);\n receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);\n receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);\n receipt.logsBloom = rawReceipt.logsBloom;\n receipt.transactionHash = rawReceipt.transactionHash;\n return receipt;\n }\n\n function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)\n internal\n pure\n virtual\n returns (ReceiptLog[] memory)\n {\n ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);\n for (uint256 i; i < rawLogs.length; i++) {\n logs[i].logAddress = rawLogs[i].logAddress;\n logs[i].blockHash = rawLogs[i].blockHash;\n logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);\n logs[i].data = rawLogs[i].data;\n logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);\n logs[i].topics = rawLogs[i].topics;\n logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);\n logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);\n logs[i].removed = rawLogs[i].removed;\n }\n return logs;\n }\n\n // Deploy a contract by fetching the contract bytecode from\n // the artifacts directory\n // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`\n function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes): Deployment failed.\");\n }\n\n function deployCode(string memory what) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string): Deployment failed.\");\n }\n\n /// @dev deploy contract with value on construction\n function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes,uint256): Deployment failed.\");\n }\n\n function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,uint256): Deployment failed.\");\n }\n\n // creates a labeled address and the corresponding private key\n function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {\n privateKey = uint256(keccak256(abi.encodePacked(name)));\n addr = vm.addr(privateKey);\n vm.label(addr, name);\n }\n\n // creates a labeled address\n function makeAddr(string memory name) internal virtual returns (address addr) {\n (addr,) = makeAddrAndKey(name);\n }\n\n // Destroys an account immediately, sending the balance to beneficiary.\n // Destroying means: balance will be zero, code will be empty, and nonce will be 0\n // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce\n // only after tx ends, this will run immediately.\n function destroyAccount(address who, address beneficiary) internal virtual {\n uint256 currBalance = who.balance;\n vm.etch(who, abi.encode());\n vm.deal(who, 0);\n vm.resetNonce(who);\n\n uint256 beneficiaryBalance = beneficiary.balance;\n vm.deal(beneficiary, currBalance + beneficiaryBalance);\n }\n\n // creates a struct containing both a labeled address and the corresponding private key\n function makeAccount(string memory name) internal virtual returns (Account memory account) {\n (account.addr, account.key) = makeAddrAndKey(name);\n }\n\n function deriveRememberKey(string memory mnemonic, uint32 index)\n internal\n virtual\n returns (address who, uint256 privateKey)\n {\n privateKey = vm.deriveKey(mnemonic, index);\n who = vm.rememberKey(privateKey);\n }\n\n function _bytesToUint(bytes memory b) private pure returns (uint256) {\n require(b.length <= 32, \"StdCheats _bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n function isFork() internal view virtual returns (bool status) {\n try vm.activeFork() {\n status = true;\n } catch (bytes memory) {}\n }\n\n modifier skipWhenForking() {\n if (!isFork()) {\n _;\n }\n }\n\n modifier skipWhenNotForking() {\n if (isFork()) {\n _;\n }\n }\n\n modifier noGasMetering() {\n vm.pauseGasMetering();\n // To prevent turning gas monitoring back on with nested functions that use this modifier,\n // we check if gasMetering started in the off position. If it did, we don't want to turn\n // it back on until we exit the top level function that used the modifier\n //\n // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.\n // funcA will have `gasStartedOff` as false, funcB will have it as true,\n // so we only turn metering back on at the end of the funcA\n bool gasStartedOff = gasMeteringOff;\n gasMeteringOff = true;\n\n _;\n\n // if gas metering was on when this modifier was called, turn it back on at the end\n if (!gasStartedOff) {\n gasMeteringOff = false;\n vm.resumeGasMetering();\n }\n }\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n\n// Wrappers around cheatcodes to avoid footguns\nabstract contract StdCheats is StdCheatsSafe {\n using stdStorage for StdStorage;\n\n StdStorage private stdstore;\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n\n // Skip forward or rewind time by the specified number of seconds\n function skip(uint256 time) internal virtual {\n vm.warp(block.timestamp + time);\n }\n\n function rewind(uint256 time) internal virtual {\n vm.warp(block.timestamp - time);\n }\n\n // Setup a prank from an address that has some ether\n function hoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender, origin);\n }\n\n function hoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender, origin);\n }\n\n // Start perpetual prank from an address that has some ether\n function startHoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender);\n }\n\n function startHoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender);\n }\n\n // Start perpetual prank from an address that has some ether\n // tx.origin is set to the origin parameter\n function startHoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender, origin);\n }\n\n function startHoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender, origin);\n }\n\n function changePrank(address msgSender) internal virtual {\n console2_log_StdCheats(\"changePrank is deprecated. Please use vm.startPrank instead.\");\n vm.stopPrank();\n vm.startPrank(msgSender);\n }\n\n function changePrank(address msgSender, address txOrigin) internal virtual {\n vm.stopPrank();\n vm.startPrank(msgSender, txOrigin);\n }\n\n // The same as Vm's `deal`\n // Use the alternative signature for ERC20 tokens\n function deal(address to, uint256 give) internal virtual {\n vm.deal(to, give);\n }\n\n // Set the balance of an account for any ERC20 token\n // Use the alternative signature to update `totalSupply`\n function deal(address token, address to, uint256 give) internal virtual {\n deal(token, to, give, false);\n }\n\n // Set the balance of an account for any ERC1155 token\n // Use the alternative signature to update `totalSupply`\n function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {\n dealERC1155(token, to, id, give, false);\n }\n\n function deal(address token, address to, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0x18160ddd).checked_write(totSup);\n }\n }\n\n function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));\n require(\n totSupData.length != 0,\n \"StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply.\"\n );\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);\n }\n }\n\n function dealERC721(address token, address to, uint256 id) internal virtual {\n // check if token id is already minted and the actual owner.\n (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));\n require(successMinted, \"StdCheats deal(address,address,uint,bool): id not minted.\");\n\n // get owner current balance\n (, bytes memory fromBalData) =\n token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));\n uint256 fromPrevBal = abi.decode(fromBalData, (uint256));\n\n // get new user current balance\n (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 toPrevBal = abi.decode(toBalData, (uint256));\n\n // update balances\n stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);\n\n // update owner\n stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);\n }\n\n function deployCodeTo(string memory what, address where) internal virtual {\n deployCodeTo(what, \"\", 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {\n deployCodeTo(what, args, 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {\n bytes memory creationCode = vm.getCode(what);\n vm.etch(where, abi.encodePacked(creationCode, args));\n (bool success, bytes memory runtimeBytecode) = where.call{value: value}(\"\");\n require(success, \"StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.\");\n vm.etch(where, runtimeBytecode);\n }\n\n // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.\n function console2_log_StdCheats(string memory p0) private view {\n (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature(\"log(string)\", p0));\n status;\n }\n}\n" + }, + "forge-std/StdError.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdError {\n bytes public constant assertionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x01);\n bytes public constant arithmeticError = abi.encodeWithSignature(\"Panic(uint256)\", 0x11);\n bytes public constant divisionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x12);\n bytes public constant enumConversionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x21);\n bytes public constant encodeStorageError = abi.encodeWithSignature(\"Panic(uint256)\", 0x22);\n bytes public constant popError = abi.encodeWithSignature(\"Panic(uint256)\", 0x31);\n bytes public constant indexOOBError = abi.encodeWithSignature(\"Panic(uint256)\", 0x32);\n bytes public constant memOverflowError = abi.encodeWithSignature(\"Panic(uint256)\", 0x41);\n bytes public constant zeroVarError = abi.encodeWithSignature(\"Panic(uint256)\", 0x51);\n}\n" + }, + "forge-std/StdInvariant.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nabstract contract StdInvariant {\n struct FuzzSelector {\n address addr;\n bytes4[] selectors;\n }\n\n struct FuzzArtifactSelector {\n string artifact;\n bytes4[] selectors;\n }\n\n struct FuzzInterface {\n address addr;\n string[] artifacts;\n }\n\n address[] private _excludedContracts;\n address[] private _excludedSenders;\n address[] private _targetedContracts;\n address[] private _targetedSenders;\n\n string[] private _excludedArtifacts;\n string[] private _targetedArtifacts;\n\n FuzzArtifactSelector[] private _targetedArtifactSelectors;\n\n FuzzSelector[] private _excludedSelectors;\n FuzzSelector[] private _targetedSelectors;\n\n FuzzInterface[] private _targetedInterfaces;\n\n // Functions for users:\n // These are intended to be called in tests.\n\n function excludeContract(address newExcludedContract_) internal {\n _excludedContracts.push(newExcludedContract_);\n }\n\n function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {\n _excludedSelectors.push(newExcludedSelector_);\n }\n\n function excludeSender(address newExcludedSender_) internal {\n _excludedSenders.push(newExcludedSender_);\n }\n\n function excludeArtifact(string memory newExcludedArtifact_) internal {\n _excludedArtifacts.push(newExcludedArtifact_);\n }\n\n function targetArtifact(string memory newTargetedArtifact_) internal {\n _targetedArtifacts.push(newTargetedArtifact_);\n }\n\n function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {\n _targetedArtifactSelectors.push(newTargetedArtifactSelector_);\n }\n\n function targetContract(address newTargetedContract_) internal {\n _targetedContracts.push(newTargetedContract_);\n }\n\n function targetSelector(FuzzSelector memory newTargetedSelector_) internal {\n _targetedSelectors.push(newTargetedSelector_);\n }\n\n function targetSender(address newTargetedSender_) internal {\n _targetedSenders.push(newTargetedSender_);\n }\n\n function targetInterface(FuzzInterface memory newTargetedInterface_) internal {\n _targetedInterfaces.push(newTargetedInterface_);\n }\n\n // Functions for forge:\n // These are called by forge to run invariant tests and don't need to be called in tests.\n\n function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {\n excludedArtifacts_ = _excludedArtifacts;\n }\n\n function excludeContracts() public view returns (address[] memory excludedContracts_) {\n excludedContracts_ = _excludedContracts;\n }\n\n function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {\n excludedSelectors_ = _excludedSelectors;\n }\n\n function excludeSenders() public view returns (address[] memory excludedSenders_) {\n excludedSenders_ = _excludedSenders;\n }\n\n function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {\n targetedArtifacts_ = _targetedArtifacts;\n }\n\n function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {\n targetedArtifactSelectors_ = _targetedArtifactSelectors;\n }\n\n function targetContracts() public view returns (address[] memory targetedContracts_) {\n targetedContracts_ = _targetedContracts;\n }\n\n function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {\n targetedSelectors_ = _targetedSelectors;\n }\n\n function targetSenders() public view returns (address[] memory targetedSenders_) {\n targetedSenders_ = _targetedSenders;\n }\n\n function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {\n targetedInterfaces_ = _targetedInterfaces;\n }\n}\n" + }, + "forge-std/StdJson.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing JSON files\n// To parse:\n// ```\n// using stdJson for string;\n// string memory json = vm.readFile(\"\");\n// json.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdJson for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdJson {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory json, string memory key) internal view returns (bool) {\n return vm.keyExistsJson(json, key);\n }\n\n function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJson(json, key);\n }\n\n function readUint(string memory json, string memory key) internal pure returns (uint256) {\n return vm.parseJsonUint(json, key);\n }\n\n function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseJsonUintArray(json, key);\n }\n\n function readInt(string memory json, string memory key) internal pure returns (int256) {\n return vm.parseJsonInt(json, key);\n }\n\n function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {\n return vm.parseJsonIntArray(json, key);\n }\n\n function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {\n return vm.parseJsonBytes32(json, key);\n }\n\n function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseJsonBytes32Array(json, key);\n }\n\n function readString(string memory json, string memory key) internal pure returns (string memory) {\n return vm.parseJsonString(json, key);\n }\n\n function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {\n return vm.parseJsonStringArray(json, key);\n }\n\n function readAddress(string memory json, string memory key) internal pure returns (address) {\n return vm.parseJsonAddress(json, key);\n }\n\n function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {\n return vm.parseJsonAddressArray(json, key);\n }\n\n function readBool(string memory json, string memory key) internal pure returns (bool) {\n return vm.parseJsonBool(json, key);\n }\n\n function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {\n return vm.parseJsonBoolArray(json, key);\n }\n\n function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJsonBytes(json, key);\n }\n\n function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseJsonBytesArray(json, key);\n }\n\n function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(json, key) ? readUint(json, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(json, key) ? readUintArray(json, key) : defaultValue;\n }\n\n function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(json, key) ? readInt(json, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(json, key) ? readIntArray(json, key) : defaultValue;\n }\n\n function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(json, key) ? readBytes32(json, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;\n }\n\n function readStringOr(string memory json, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(json, key) ? readString(json, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(json, key) ? readStringArray(json, key) : defaultValue;\n }\n\n function readAddressOr(string memory json, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(json, key) ? readAddress(json, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;\n }\n\n function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(json, key) ? readBool(json, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;\n }\n\n function readBytesOr(string memory json, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(json, key) ? readBytes(json, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeJson(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeJson(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdMath {\n int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;\n\n function abs(int256 a) internal pure returns (uint256) {\n // Required or it will fail when `a = type(int256).min`\n if (a == INT256_MIN) {\n return 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n }\n\n return uint256(a > 0 ? a : -a);\n }\n\n function delta(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a - b : b - a;\n }\n\n function delta(int256 a, int256 b) internal pure returns (uint256) {\n // a and b are of the same sign\n // this works thanks to two's complement, the left-most bit is the sign bit\n if ((a ^ b) > -1) {\n return delta(abs(a), abs(b));\n }\n\n // a and b are of opposite signs\n return abs(a) + abs(b);\n }\n\n function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n\n return absDelta * 1e18 / b;\n }\n\n function percentDelta(int256 a, int256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n uint256 absB = abs(b);\n\n return absDelta * 1e18 / absB;\n }\n}\n" + }, + "forge-std/StdStorage.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {Vm} from \"./Vm.sol\";\n\nstruct FindData {\n uint256 slot;\n uint256 offsetLeft;\n uint256 offsetRight;\n bool found;\n}\n\nstruct StdStorage {\n mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;\n bytes32[] _keys;\n bytes4 _sig;\n uint256 _depth;\n address _target;\n bytes32 _set;\n bool _enable_packed_slots;\n bytes _calldata;\n}\n\nlibrary stdStorageSafe {\n event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);\n event WARNING_UninitedSlot(address who, uint256 slot);\n\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return bytes4(keccak256(bytes(sigStr)));\n }\n\n function getCallParams(StdStorage storage self) internal view returns (bytes memory) {\n if (self._calldata.length == 0) {\n return flatten(self._keys);\n } else {\n return self._calldata;\n }\n }\n\n // Calls target contract with configured parameters\n function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {\n bytes memory cald = abi.encodePacked(self._sig, getCallParams(self));\n (bool success, bytes memory rdat) = self._target.staticcall(cald);\n bytes32 result = bytesToBytes32(rdat, 32 * self._depth);\n\n return (success, result);\n }\n\n // Tries mutating slot value to determine if the targeted value is stored in it.\n // If current value is 0, then we are setting slot value to type(uint256).max\n // Otherwise, we set it to 0. That way, return value should always be affected.\n function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n (bool success, bytes32 prevReturnValue) = callTarget(self);\n\n bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);\n vm.store(self._target, slot, testVal);\n\n (, bytes32 newReturnValue) = callTarget(self);\n\n vm.store(self._target, slot, prevSlotValue);\n\n return (success && (prevReturnValue != newReturnValue));\n }\n\n // Tries setting one of the bits in slot to 1 until return value changes.\n // Index of resulted bit is an offset packed slot has from left/right side\n function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {\n for (uint256 offset = 0; offset < 256; offset++) {\n uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);\n vm.store(self._target, slot, bytes32(valueToPut));\n\n (bool success, bytes32 data) = callTarget(self);\n\n if (success && (uint256(data) > 0)) {\n return (true, offset);\n }\n }\n return (false, 0);\n }\n\n function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n\n (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);\n (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);\n\n // `findOffset` may mutate slot value, so we are setting it to initial value\n vm.store(self._target, slot, prevSlotValue);\n return (foundLeft && foundRight, offsetLeft, offsetRight);\n }\n\n function find(StdStorage storage self) internal returns (FindData storage) {\n return find(self, true);\n }\n\n /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against\n // slot complexity:\n // if flat, will be bytes32(uint256(uint));\n // if map, will be keccak256(abi.encode(key, uint(slot)));\n // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));\n // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);\n function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = getCallParams(self);\n\n // calldata to test against\n if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n vm.record();\n (, bytes32 callResult) = callTarget(self);\n (bytes32[] memory reads,) = vm.accesses(address(who));\n\n if (reads.length == 0) {\n revert(\"stdStorage find(StdStorage): No storage use detected for target.\");\n } else {\n for (uint256 i = reads.length; --i >= 0;) {\n bytes32 prev = vm.load(who, reads[i]);\n if (prev == bytes32(0)) {\n emit WARNING_UninitedSlot(who, uint256(reads[i]));\n }\n\n if (!checkSlotMutatesCall(self, reads[i])) {\n continue;\n }\n\n (uint256 offsetLeft, uint256 offsetRight) = (0, 0);\n\n if (self._enable_packed_slots) {\n bool found;\n (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);\n if (!found) {\n continue;\n }\n }\n\n // Check that value between found offsets is equal to the current call result\n uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;\n\n if (uint256(callResult) != curVal) {\n continue;\n }\n\n emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =\n FindData(uint256(reads[i]), offsetLeft, offsetRight, true);\n break;\n }\n }\n\n require(\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,\n \"stdStorage find(StdStorage): Slot(s) not found.\"\n );\n\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n self._target = _target;\n return self;\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n self._sig = _sig;\n return self;\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n self._sig = sigs(_sig);\n return self;\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n self._calldata = _calldata;\n return self;\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n self._keys.push(bytes32(uint256(uint160(who))));\n return self;\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n self._keys.push(bytes32(amt));\n return self;\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n self._keys.push(key);\n return self;\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n self._enable_packed_slots = true;\n return self;\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n self._depth = _depth;\n return self;\n }\n\n function read(StdStorage storage self) private returns (bytes memory) {\n FindData storage data = find(self, false);\n uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);\n uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;\n clear(self);\n return abi.encode(value);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return abi.decode(read(self), (bytes32));\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n int256 v = read_int(self);\n if (v == 0) return false;\n if (v == 1) return true;\n revert(\"stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.\");\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return abi.decode(read(self), (address));\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return abi.decode(read(self), (uint256));\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return abi.decode(read(self), (int256));\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n return (uint256(parent_slot), key);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n bool found;\n bytes32 root_slot;\n bytes32 parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n while (found) {\n root_slot = parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));\n }\n return uint256(root_slot);\n }\n\n function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {\n bytes32 out;\n\n uint256 max = b.length > 32 ? 32 : b.length;\n for (uint256 i = 0; i < max; i++) {\n out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);\n }\n return out;\n }\n\n function flatten(bytes32[] memory b) private pure returns (bytes memory) {\n bytes memory result = new bytes(b.length * 32);\n for (uint256 i = 0; i < b.length; i++) {\n bytes32 k = b[i];\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(result, add(32, mul(32, i))), k)\n }\n }\n\n return result;\n }\n\n function clear(StdStorage storage self) internal {\n delete self._target;\n delete self._sig;\n delete self._keys;\n delete self._depth;\n delete self._enable_packed_slots;\n delete self._calldata;\n }\n\n // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`\n // (slotValue & mask) >> offsetRight will be the value of the given packed variable\n function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {\n // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;\n // using assembly because (1 << 256) causes overflow\n assembly {\n mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))\n }\n }\n\n // Returns slot value with updated packed variable.\n function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)\n internal\n pure\n returns (bytes32 newValue)\n {\n return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));\n }\n}\n\nlibrary stdStorage {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return stdStorageSafe.sigs(sigStr);\n }\n\n function find(StdStorage storage self) internal returns (uint256) {\n return find(self, true);\n }\n\n function find(StdStorage storage self, bool _clear) internal returns (uint256) {\n return stdStorageSafe.find(self, _clear).slot;\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n return stdStorageSafe.target(self, _target);\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, who);\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, amt);\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, key);\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n return stdStorageSafe.with_calldata(self, _calldata);\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n return stdStorageSafe.enable_packed_slots(self);\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n return stdStorageSafe.depth(self, _depth);\n }\n\n function clear(StdStorage storage self) internal {\n stdStorageSafe.clear(self);\n }\n\n function checked_write(StdStorage storage self, address who) internal {\n checked_write(self, bytes32(uint256(uint160(who))));\n }\n\n function checked_write(StdStorage storage self, uint256 amt) internal {\n checked_write(self, bytes32(amt));\n }\n\n function checked_write_int(StdStorage storage self, int256 val) internal {\n checked_write(self, bytes32(uint256(val)));\n }\n\n function checked_write(StdStorage storage self, bool write) internal {\n bytes32 t;\n /// @solidity memory-safe-assembly\n assembly {\n t := write\n }\n checked_write(self, t);\n }\n\n function checked_write(StdStorage storage self, bytes32 set) internal {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = stdStorageSafe.getCallParams(self);\n\n if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n find(self, false);\n }\n FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n if ((data.offsetLeft + data.offsetRight) > 0) {\n uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));\n require(\n uint256(set) < maxVal,\n string(\n abi.encodePacked(\n \"stdStorage find(StdStorage): Packed slot. We can't fit value greater than \",\n vm.toString(maxVal)\n )\n )\n );\n }\n bytes32 curVal = vm.load(who, bytes32(data.slot));\n bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);\n\n vm.store(who, bytes32(data.slot), valToSet);\n\n (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);\n\n if (!success || callResult != set) {\n vm.store(who, bytes32(data.slot), curVal);\n revert(\"stdStorage find(StdStorage): Failed to write value.\");\n }\n clear(self);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return stdStorageSafe.read_bytes32(self);\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n return stdStorageSafe.read_bool(self);\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return stdStorageSafe.read_address(self);\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.read_uint(self);\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return stdStorageSafe.read_int(self);\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n return stdStorageSafe.parent(self);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.root(self);\n }\n}\n" + }, + "forge-std/StdStyle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\nlibrary StdStyle {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n string constant RED = \"\\u001b[91m\";\n string constant GREEN = \"\\u001b[92m\";\n string constant YELLOW = \"\\u001b[93m\";\n string constant BLUE = \"\\u001b[94m\";\n string constant MAGENTA = \"\\u001b[95m\";\n string constant CYAN = \"\\u001b[96m\";\n string constant BOLD = \"\\u001b[1m\";\n string constant DIM = \"\\u001b[2m\";\n string constant ITALIC = \"\\u001b[3m\";\n string constant UNDERLINE = \"\\u001b[4m\";\n string constant INVERSE = \"\\u001b[7m\";\n string constant RESET = \"\\u001b[0m\";\n\n function styleConcat(string memory style, string memory self) private pure returns (string memory) {\n return string(abi.encodePacked(style, self, RESET));\n }\n\n function red(string memory self) internal pure returns (string memory) {\n return styleConcat(RED, self);\n }\n\n function red(uint256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(int256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(address self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(bool self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes(bytes memory self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes32(bytes32 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function green(string memory self) internal pure returns (string memory) {\n return styleConcat(GREEN, self);\n }\n\n function green(uint256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(int256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(address self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(bool self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes(bytes memory self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes32(bytes32 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function yellow(string memory self) internal pure returns (string memory) {\n return styleConcat(YELLOW, self);\n }\n\n function yellow(uint256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(int256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(address self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(bool self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes(bytes memory self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes32(bytes32 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function blue(string memory self) internal pure returns (string memory) {\n return styleConcat(BLUE, self);\n }\n\n function blue(uint256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(int256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(address self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(bool self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes(bytes memory self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes32(bytes32 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function magenta(string memory self) internal pure returns (string memory) {\n return styleConcat(MAGENTA, self);\n }\n\n function magenta(uint256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(int256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(address self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(bool self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes(bytes memory self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes32(bytes32 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function cyan(string memory self) internal pure returns (string memory) {\n return styleConcat(CYAN, self);\n }\n\n function cyan(uint256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(int256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(address self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(bool self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes(bytes memory self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes32(bytes32 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function bold(string memory self) internal pure returns (string memory) {\n return styleConcat(BOLD, self);\n }\n\n function bold(uint256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(int256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(address self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(bool self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes(bytes memory self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes32(bytes32 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function dim(string memory self) internal pure returns (string memory) {\n return styleConcat(DIM, self);\n }\n\n function dim(uint256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(int256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(address self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(bool self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes(bytes memory self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes32(bytes32 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function italic(string memory self) internal pure returns (string memory) {\n return styleConcat(ITALIC, self);\n }\n\n function italic(uint256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(int256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(address self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(bool self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes(bytes memory self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes32(bytes32 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function underline(string memory self) internal pure returns (string memory) {\n return styleConcat(UNDERLINE, self);\n }\n\n function underline(uint256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(int256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(address self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(bool self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes(bytes memory self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes32(bytes32 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function inverse(string memory self) internal pure returns (string memory) {\n return styleConcat(INVERSE, self);\n }\n\n function inverse(uint256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(int256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(address self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(bool self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes(bytes memory self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes32(bytes32 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n}\n" + }, + "forge-std/StdToml.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing TOML files\n// To parse:\n// ```\n// using stdToml for string;\n// string memory toml = vm.readFile(\"\");\n// toml.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdToml for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdToml {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory toml, string memory key) internal view returns (bool) {\n return vm.keyExistsToml(toml, key);\n }\n\n function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseToml(toml, key);\n }\n\n function readUint(string memory toml, string memory key) internal pure returns (uint256) {\n return vm.parseTomlUint(toml, key);\n }\n\n function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseTomlUintArray(toml, key);\n }\n\n function readInt(string memory toml, string memory key) internal pure returns (int256) {\n return vm.parseTomlInt(toml, key);\n }\n\n function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {\n return vm.parseTomlIntArray(toml, key);\n }\n\n function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {\n return vm.parseTomlBytes32(toml, key);\n }\n\n function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseTomlBytes32Array(toml, key);\n }\n\n function readString(string memory toml, string memory key) internal pure returns (string memory) {\n return vm.parseTomlString(toml, key);\n }\n\n function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {\n return vm.parseTomlStringArray(toml, key);\n }\n\n function readAddress(string memory toml, string memory key) internal pure returns (address) {\n return vm.parseTomlAddress(toml, key);\n }\n\n function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {\n return vm.parseTomlAddressArray(toml, key);\n }\n\n function readBool(string memory toml, string memory key) internal pure returns (bool) {\n return vm.parseTomlBool(toml, key);\n }\n\n function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {\n return vm.parseTomlBoolArray(toml, key);\n }\n\n function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseTomlBytes(toml, key);\n }\n\n function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseTomlBytesArray(toml, key);\n }\n\n function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(toml, key) ? readUint(toml, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;\n }\n\n function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(toml, key) ? readInt(toml, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;\n }\n\n function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;\n }\n\n function readStringOr(string memory toml, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(toml, key) ? readString(toml, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;\n }\n\n function readAddressOr(string memory toml, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;\n }\n\n function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(toml, key) ? readBool(toml, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;\n }\n\n function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeToml(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeToml(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {IMulticall3} from \"./interfaces/IMulticall3.sol\";\nimport {MockERC20} from \"./mocks/MockERC20.sol\";\nimport {MockERC721} from \"./mocks/MockERC721.sol\";\nimport {VmSafe} from \"./Vm.sol\";\n\nabstract contract StdUtils {\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS\n //////////////////////////////////////////////////////////////////////////*/\n\n IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n uint256 private constant INT256_MIN_ABS =\n 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n uint256 private constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n require(min <= max, \"StdUtils bound(uint256,uint256,uint256): Max is less than min.\");\n // If x is between min and max, return x directly. This is to ensure that dictionary values\n // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188\n if (x >= min && x <= max) return x;\n\n uint256 size = max - min + 1;\n\n // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.\n // This helps ensure coverage of the min/max values.\n if (x <= 3 && size > x) return min + x;\n if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);\n\n // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.\n if (x > max) {\n uint256 diff = x - max;\n uint256 rem = diff % size;\n if (rem == 0) return max;\n result = min + rem - 1;\n } else if (x < min) {\n uint256 diff = min - x;\n uint256 rem = diff % size;\n if (rem == 0) return min;\n result = max - rem + 1;\n }\n }\n\n function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", result);\n }\n\n function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n require(min <= max, \"StdUtils bound(int256,int256,int256): Max is less than min.\");\n\n // Shifting all int256 values to uint256 to use _bound function. The range of two types are:\n // int256 : -(2**255) ~ (2**255 - 1)\n // uint256: 0 ~ (2**256 - 1)\n // So, add 2**255, INT256_MIN_ABS to the integer values.\n //\n // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.\n // So, use `~uint256(x) + 1` instead.\n uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);\n uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);\n uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);\n\n uint256 y = _bound(_x, _min, _max);\n\n // To move it back to int256 value, subtract INT256_MIN_ABS at here.\n result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);\n }\n\n function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", vm.toString(result));\n }\n\n function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {\n result = _bound(privateKey, 1, SECP256K1_ORDER - 1);\n }\n\n function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {\n require(b.length <= 32, \"StdUtils bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce\n /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol)\n function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {\n console2_log_StdUtils(\"computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.\");\n return vm.computeCreateAddress(deployer, nonce);\n }\n\n function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)\n internal\n pure\n virtual\n returns (address)\n {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initcodeHash, deployer);\n }\n\n /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initCodeHash);\n }\n\n /// @dev returns an initialized mock ERC20 contract\n function deployMockERC20(string memory name, string memory symbol, uint8 decimals)\n internal\n returns (MockERC20 mock)\n {\n mock = new MockERC20();\n mock.initialize(name, symbol, decimals);\n }\n\n /// @dev returns an initialized mock ERC721 contract\n function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) {\n mock = new MockERC721();\n mock.initialize(name, symbol);\n }\n\n /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {\n return hashInitCode(creationCode, \"\");\n }\n\n /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n /// @param args the ABI-encoded arguments to the constructor of C\n function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(creationCode, args));\n }\n\n // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.\n function getTokenBalances(address token, address[] memory addresses)\n internal\n virtual\n returns (uint256[] memory balances)\n {\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdUtils getTokenBalances(address,address[]): Token address is not a contract.\");\n\n // ABI encode the aggregate call to Multicall3.\n uint256 length = addresses.length;\n IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);\n for (uint256 i = 0; i < length; ++i) {\n // 0x70a08231 = bytes4(\"balanceOf(address)\"))\n calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});\n }\n\n // Make the aggregate call.\n (, bytes[] memory returnData) = multicall.aggregate(calls);\n\n // ABI decode the return data and return the balances.\n balances = new uint256[](length);\n for (uint256 i = 0; i < length; ++i) {\n balances[i] = abi.decode(returnData[i], (uint256));\n }\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n PRIVATE FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {\n return address(uint160(uint256(bytesValue)));\n }\n\n // This section is used to prevent the compilation of console, which shortens the compilation time when console is\n // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid\n // any breaking changes to function signatures.\n function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)\n internal\n pure\n returns (function(bytes memory) internal pure fnOut)\n {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castLogPayloadViewToPure(_sendLogPayloadView)(payload);\n }\n\n function _sendLogPayloadView(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE2_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function console2_log_StdUtils(string memory p0) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function console2_log_StdUtils(string memory p0, uint256 p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function console2_log_StdUtils(string memory p0, string memory p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n}\n" + }, + "forge-std/Test.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\n// 💬 ABOUT\n// Forge Std's default Test.\n\n// 🧩 MODULES\nimport {console} from \"./console.sol\";\nimport {console2} from \"./console2.sol\";\nimport {safeconsole} from \"./safeconsole.sol\";\nimport {StdAssertions} from \"./StdAssertions.sol\";\nimport {StdChains} from \"./StdChains.sol\";\nimport {StdCheats} from \"./StdCheats.sol\";\nimport {stdError} from \"./StdError.sol\";\nimport {StdInvariant} from \"./StdInvariant.sol\";\nimport {stdJson} from \"./StdJson.sol\";\nimport {stdMath} from \"./StdMath.sol\";\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {StdStyle} from \"./StdStyle.sol\";\nimport {stdToml} from \"./StdToml.sol\";\nimport {StdUtils} from \"./StdUtils.sol\";\nimport {Vm} from \"./Vm.sol\";\n\n// 📦 BOILERPLATE\nimport {TestBase} from \"./Base.sol\";\n\n// ⭐️ TEST\nabstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {\n // Note: IS_TEST() must return true.\n bool public IS_TEST = true;\n}\n" + }, + "forge-std/Vm.sol": { + "content": "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\n/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may\n/// result in Script simulations differing from on-chain execution. It is recommended to only use\n/// these cheats in scripts.\ninterface VmSafe {\n /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.\n enum CallerMode {\n // No caller modification is currently active.\n None,\n // A one time broadcast triggered by a `vm.broadcast()` call is currently active.\n Broadcast,\n // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.\n RecurrentBroadcast,\n // A one time prank triggered by a `vm.prank()` call is currently active.\n Prank,\n // A recurrent prank triggered by a `vm.startPrank()` call is currently active.\n RecurrentPrank\n }\n\n /// The kind of account access that occurred.\n enum AccountAccessKind {\n // The account was called.\n Call,\n // The account was called via delegatecall.\n DelegateCall,\n // The account was called via callcode.\n CallCode,\n // The account was called via staticcall.\n StaticCall,\n // The account was created.\n Create,\n // The account was selfdestructed.\n SelfDestruct,\n // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).\n Resume,\n // The account's balance was read.\n Balance,\n // The account's codesize was read.\n Extcodesize,\n // The account's codehash was read.\n Extcodehash,\n // The account's code was copied.\n Extcodecopy\n }\n\n /// Forge execution contexts.\n enum ForgeContext {\n // Test group execution context (test, coverage or snapshot).\n TestGroup,\n // `forge test` execution context.\n Test,\n // `forge coverage` execution context.\n Coverage,\n // `forge snapshot` execution context.\n Snapshot,\n // Script group execution context (dry run, broadcast or resume).\n ScriptGroup,\n // `forge script` execution context.\n ScriptDryRun,\n // `forge script --broadcast` execution context.\n ScriptBroadcast,\n // `forge script --resume` execution context.\n ScriptResume,\n // Unknown `forge` execution context.\n Unknown\n }\n\n /// An Ethereum log. Returned by `getRecordedLogs`.\n struct Log {\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The address of the log's emitter.\n address emitter;\n }\n\n /// An RPC URL and its alias. Returned by `rpcUrlStructs`.\n struct Rpc {\n // The alias of the RPC URL.\n string key;\n // The RPC URL.\n string url;\n }\n\n /// An RPC log object. Returned by `eth_getLogs`.\n struct EthGetLogs {\n // The address of the log's emitter.\n address emitter;\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The block hash.\n bytes32 blockHash;\n // The block number.\n uint64 blockNumber;\n // The transaction hash.\n bytes32 transactionHash;\n // The transaction index in the block.\n uint64 transactionIndex;\n // The log index.\n uint256 logIndex;\n // Whether the log was removed.\n bool removed;\n }\n\n /// A single entry in a directory listing. Returned by `readDir`.\n struct DirEntry {\n // The error message, if any.\n string errorMessage;\n // The path of the entry.\n string path;\n // The depth of the entry.\n uint64 depth;\n // Whether the entry is a directory.\n bool isDir;\n // Whether the entry is a symlink.\n bool isSymlink;\n }\n\n /// Metadata information about a file.\n /// This structure is returned from the `fsMetadata` function and represents known\n /// metadata about a file such as its permissions, size, modification\n /// times, etc.\n struct FsMetadata {\n // True if this metadata is for a directory.\n bool isDir;\n // True if this metadata is for a symlink.\n bool isSymlink;\n // The size of the file, in bytes, this metadata is for.\n uint256 length;\n // True if this metadata is for a readonly (unwritable) file.\n bool readOnly;\n // The last modification time listed in this metadata.\n uint256 modified;\n // The last access time of this metadata.\n uint256 accessed;\n // The creation time listed in this metadata.\n uint256 created;\n }\n\n /// A wallet with a public and private key.\n struct Wallet {\n // The wallet's address.\n address addr;\n // The wallet's public key `X`.\n uint256 publicKeyX;\n // The wallet's public key `Y`.\n uint256 publicKeyY;\n // The wallet's private key.\n uint256 privateKey;\n }\n\n /// The result of a `tryFfi` call.\n struct FfiResult {\n // The exit code of the call.\n int32 exitCode;\n // The optionally hex-decoded `stdout` data.\n bytes stdout;\n // The `stderr` data.\n bytes stderr;\n }\n\n /// Information on the chain and fork.\n struct ChainInfo {\n // The fork identifier. Set to zero if no fork is active.\n uint256 forkId;\n // The chain ID of the current fork.\n uint256 chainId;\n }\n\n /// The result of a `stopAndReturnStateDiff` call.\n struct AccountAccess {\n // The chain and fork the access occurred.\n ChainInfo chainInfo;\n // The kind of account access that determines what the account is.\n // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.\n // If kind is Create, then the account is the newly created account.\n // If kind is SelfDestruct, then the account is the selfdestruct recipient.\n // If kind is a Resume, then account represents a account context that has resumed.\n AccountAccessKind kind;\n // The account that was accessed.\n // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.\n address account;\n // What accessed the account.\n address accessor;\n // If the account was initialized or empty prior to the access.\n // An account is considered initialized if it has code, a\n // non-zero nonce, or a non-zero balance.\n bool initialized;\n // The previous balance of the accessed account.\n uint256 oldBalance;\n // The potential new balance of the accessed account.\n // That is, all balance changes are recorded here, even if reverts occurred.\n uint256 newBalance;\n // Code of the account deployed by CREATE.\n bytes deployedCode;\n // Value passed along with the account access\n uint256 value;\n // Input data provided to the CREATE or CALL\n bytes data;\n // If this access reverted in either the current or parent context.\n bool reverted;\n // An ordered list of storage accesses made during an account access operation.\n StorageAccess[] storageAccesses;\n // Call depth traversed during the recording of state differences\n uint64 depth;\n }\n\n /// The storage accessed during an `AccountAccess`.\n struct StorageAccess {\n // The account whose storage was accessed.\n address account;\n // The slot that was accessed.\n bytes32 slot;\n // If the access was a write.\n bool isWrite;\n // The previous value of the slot.\n bytes32 previousValue;\n // The new value of the slot.\n bytes32 newValue;\n // If the access was reverted.\n bool reverted;\n }\n\n /// Gas used. Returned by `lastCallGas`.\n struct Gas {\n // The gas limit of the call.\n uint64 gasLimit;\n // The total gas used.\n uint64 gasTotalUsed;\n // DEPRECATED: The amount of gas used for memory expansion. Ref: \n uint64 gasMemoryUsed;\n // The amount of gas refunded.\n int64 gasRefunded;\n // The amount of gas remaining.\n uint64 gasRemaining;\n }\n\n // ======== Crypto ========\n\n /// Derives a private key from the name, labels the account with that name, and returns the wallet.\n function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key and returns the wallet.\n function createWallet(uint256 privateKey) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.\n function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derives secp256r1 public key from the provided `privateKey`.\n function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);\n\n /// Adds a private key to the local forge wallet and returns the address.\n function rememberKey(uint256 privateKey) external returns (address keyAddr);\n\n /// Signs data with a `Wallet`.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// Raises error if none of the signers passed into the script have provided address.\n function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256r1 curve.\n function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);\n\n /// Signs data with a `Wallet`.\n function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Raises error if none of the signers passed into the script have provided address.\n function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n // ======== Environment ========\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and returns true if it exists, else returns false.\n function envExists(string calldata name) external view returns (bool result);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bool defaultValue) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)\n external\n view\n returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)\n external\n view\n returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)\n external\n view\n returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)\n external\n view\n returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, address defaultValue) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)\n external\n view\n returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)\n external\n view\n returns (uint256[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)\n external\n view\n returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name, string calldata delim) external view returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);\n\n /// Returns true if `forge` command was executed in given context.\n function isContext(ForgeContext context) external view returns (bool result);\n\n /// Sets environment variables.\n function setEnv(string calldata name, string calldata value) external;\n\n // ======== EVM ========\n\n /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.\n function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);\n\n /// Gets the address for a given private key.\n function addr(uint256 privateKey) external pure returns (address keyAddr);\n\n /// Gets all the logs according to specified filter.\n function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)\n external\n returns (EthGetLogs[] memory logs);\n\n /// Gets the current `block.blobbasefee`.\n /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlobBaseFee() external view returns (uint256 blobBaseFee);\n\n /// Gets the current `block.number`.\n /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockNumber() external view returns (uint256 height);\n\n /// Gets the current `block.timestamp`.\n /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockTimestamp() external view returns (uint256 timestamp);\n\n /// Gets the map key and parent of a mapping at a given slot, for a given address.\n function getMappingKeyAndParentOf(address target, bytes32 elementSlot)\n external\n returns (bool found, bytes32 key, bytes32 parent);\n\n /// Gets the number of elements in the mapping at the given slot, for a given address.\n function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length);\n\n /// Gets the elements at index idx of the mapping at the given slot, for a given address. The\n /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).\n function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value);\n\n /// Gets the nonce of an account.\n function getNonce(address account) external view returns (uint64 nonce);\n\n /// Get the nonce of a `Wallet`.\n function getNonce(Wallet calldata wallet) external returns (uint64 nonce);\n\n /// Gets all the recorded logs.\n function getRecordedLogs() external returns (Log[] memory logs);\n\n /// Gets the gas used in the last call.\n function lastCallGas() external view returns (Gas memory gas);\n\n /// Loads a storage slot from an address.\n function load(address target, bytes32 slot) external view returns (bytes32 data);\n\n /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.\n function pauseGasMetering() external;\n\n /// Records all storage reads and writes.\n function record() external;\n\n /// Record all the transaction logs.\n function recordLogs() external;\n\n /// Reset gas metering (i.e. gas usage is set to gas limit).\n function resetGasMetering() external;\n\n /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.\n function resumeGasMetering() external;\n\n /// Performs an Ethereum JSON-RPC request to the current fork URL.\n function rpc(string calldata method, string calldata params) external returns (bytes memory data);\n\n /// Performs an Ethereum JSON-RPC request to the given endpoint.\n function rpc(string calldata urlOrAlias, string calldata method, string calldata params)\n external\n returns (bytes memory data);\n\n /// Starts recording all map SSTOREs for later retrieval.\n function startMappingRecording() external;\n\n /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,\n /// along with the context of the calls\n function startStateDiffRecording() external;\n\n /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.\n function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);\n\n /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.\n function stopMappingRecording() external;\n\n // ======== Filesystem ========\n\n /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.\n /// `path` is relative to the project root.\n function closeFile(string calldata path) external;\n\n /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.\n /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.\n /// Both `from` and `to` are relative to the project root.\n function copyFile(string calldata from, string calldata to) external returns (uint64 copied);\n\n /// Creates a new, empty directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - User lacks permissions to modify `path`.\n /// - A parent of the given path doesn't exist and `recursive` is false.\n /// - `path` already exists and `recursive` is false.\n /// `path` is relative to the project root.\n function createDir(string calldata path, bool recursive) external;\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function deployCode(string calldata artifactPath) external returns (address deployedAddress);\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n /// Additionally accepts abi-encoded constructor arguments.\n function deployCode(string calldata artifactPath, bytes calldata constructorArgs)\n external\n returns (address deployedAddress);\n\n /// Returns true if the given path points to an existing entity, else returns false.\n function exists(string calldata path) external returns (bool result);\n\n /// Performs a foreign function call via the terminal.\n function ffi(string[] calldata commandInput) external returns (bytes memory result);\n\n /// Given a path, query the file system to get information about a file, directory, etc.\n function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);\n\n /// Gets the artifact path from code (aka. creation code).\n function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);\n\n /// Gets the artifact path from deployed code (aka. runtime code).\n function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);\n\n /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);\n\n /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);\n\n /// Returns true if the path exists on disk and is pointing at a directory, else returns false.\n function isDir(string calldata path) external returns (bool result);\n\n /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.\n function isFile(string calldata path) external returns (bool result);\n\n /// Get the path of the current project root.\n function projectRoot() external view returns (string memory path);\n\n /// Prompts the user for a string value in the terminal.\n function prompt(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for an address in the terminal.\n function promptAddress(string calldata promptText) external returns (address);\n\n /// Prompts the user for a hidden string value in the terminal.\n function promptSecret(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for hidden uint256 in the terminal (usually pk).\n function promptSecretUint(string calldata promptText) external returns (uint256);\n\n /// Prompts the user for uint256 in the terminal.\n function promptUint(string calldata promptText) external returns (uint256);\n\n /// Reads the directory at the given path recursively, up to `maxDepth`.\n /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.\n /// Follows symbolic links if `followLinks` is true.\n function readDir(string calldata path) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth, bool followLinks)\n external\n view\n returns (DirEntry[] memory entries);\n\n /// Reads the entire content of file to string. `path` is relative to the project root.\n function readFile(string calldata path) external view returns (string memory data);\n\n /// Reads the entire content of file as binary. `path` is relative to the project root.\n function readFileBinary(string calldata path) external view returns (bytes memory data);\n\n /// Reads next line of file to string.\n function readLine(string calldata path) external view returns (string memory line);\n\n /// Reads a symbolic link, returning the path that the link points to.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` is not a symbolic link.\n /// - `path` does not exist.\n function readLink(string calldata linkPath) external view returns (string memory targetPath);\n\n /// Removes a directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` doesn't exist.\n /// - `path` isn't a directory.\n /// - User lacks permissions to modify `path`.\n /// - The directory is not empty and `recursive` is false.\n /// `path` is relative to the project root.\n function removeDir(string calldata path, bool recursive) external;\n\n /// Removes a file from the filesystem.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` points to a directory.\n /// - The file doesn't exist.\n /// - The user lacks permissions to remove the file.\n /// `path` is relative to the project root.\n function removeFile(string calldata path) external;\n\n /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.\n function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);\n\n /// Returns the time since unix epoch in milliseconds.\n function unixTime() external returns (uint256 milliseconds);\n\n /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFile(string calldata path, string calldata data) external;\n\n /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFileBinary(string calldata path, bytes calldata data) external;\n\n /// Writes line to file, creating a file if it does not exist.\n /// `path` is relative to the project root.\n function writeLine(string calldata path, string calldata data) external;\n\n // ======== JSON ========\n\n /// Checks if `key` exists in a JSON object.\n function keyExistsJson(string calldata json, string calldata key) external view returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `address`.\n function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);\n\n /// Parses a string of JSON data at `key` and coerces it to `address[]`.\n function parseJsonAddressArray(string calldata json, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool`.\n function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool[]`.\n function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes`.\n function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32`.\n function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.\n function parseJsonBytes32Array(string calldata json, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.\n function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256`.\n function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256[]`.\n function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a JSON object.\n function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of JSON data at `key` and coerces it to `string`.\n function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `string[]`.\n function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256`.\n function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.\n function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a JSON object.\n function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a JSON object at `key`.\n function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)\n external\n returns (string memory json);\n\n /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.\n /// Returns the stringified version of the specific JSON file up to that moment.\n function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(string calldata typeDescription, bytes calldata value)\n external\n pure\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(\n string calldata objectKey,\n string calldata valueKey,\n string calldata typeDescription,\n bytes calldata value\n ) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)\n external\n returns (string memory json);\n\n /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.\n function writeJson(string calldata json, string calldata path) external;\n\n /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = \n /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.\n function writeJson(string calldata json, string calldata path, string calldata valueKey) external;\n\n /// Checks if `key` exists in a JSON object\n /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.\n function keyExists(string calldata json, string calldata key) external view returns (bool);\n\n // ======== Scripting ========\n\n /// Takes a signed transaction and broadcasts it to the network.\n function broadcastRawTransaction(bytes calldata data) external;\n\n /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function broadcast() external;\n\n /// Has the next call (at this call depth only) create a transaction with the address provided\n /// as the sender that can later be signed and sent onchain.\n function broadcast(address signer) external;\n\n /// Has the next call (at this call depth only) create a transaction with the private key\n /// provided as the sender that can later be signed and sent onchain.\n function broadcast(uint256 privateKey) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function startBroadcast() external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the address\n /// provided that can later be signed and sent onchain.\n function startBroadcast(address signer) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the private key\n /// provided that can later be signed and sent onchain.\n function startBroadcast(uint256 privateKey) external;\n\n /// Stops collecting onchain transactions.\n function stopBroadcast() external;\n\n // ======== String ========\n\n /// Returns the index of the first occurrence of a `key` in an `input` string.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.\n /// Returns 0 in case of an empty `key`.\n function indexOf(string calldata input, string calldata key) external pure returns (uint256);\n\n /// Parses the given `string` into an `address`.\n function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);\n\n /// Parses the given `string` into a `bool`.\n function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);\n\n /// Parses the given `string` into `bytes`.\n function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);\n\n /// Parses the given `string` into a `bytes32`.\n function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);\n\n /// Parses the given `string` into a `int256`.\n function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);\n\n /// Parses the given `string` into a `uint256`.\n function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);\n\n /// Replaces occurrences of `from` in the given `string` with `to`.\n function replace(string calldata input, string calldata from, string calldata to)\n external\n pure\n returns (string memory output);\n\n /// Splits the given `string` into an array of strings divided by the `delimiter`.\n function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);\n\n /// Converts the given `string` value to Lowercase.\n function toLowercase(string calldata input) external pure returns (string memory output);\n\n /// Converts the given value to a `string`.\n function toString(address value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes calldata value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes32 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bool value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(uint256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(int256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given `string` value to Uppercase.\n function toUppercase(string calldata input) external pure returns (string memory output);\n\n /// Trims leading and trailing whitespace from the given `string` value.\n function trim(string calldata input) external pure returns (string memory output);\n\n // ======== Testing ========\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n int256 left,\n int256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are equal.\n function assertEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are equal.\n function assertEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are equal and includes error message into revert string on failure.\n function assertEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are equal.\n function assertEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are equal.\n function assertEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256 values are equal.\n function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are equal.\n function assertEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal.\n function assertEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are equal.\n function assertEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.\n function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are equal.\n function assertEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.\n function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal.\n function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal.\n function assertEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are equal.\n function assertEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are equal and includes error message into revert string on failure.\n function assertEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are equal.\n function assertEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is false.\n function assertFalse(bool condition) external pure;\n\n /// Asserts that the given condition is false and includes error message into revert string on failure.\n function assertFalse(bool condition, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n function assertGe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n function assertGe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n function assertGt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n function assertGt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n function assertLe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n function assertLe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n function assertLt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n function assertLt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are not equal.\n function assertNotEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are not equal.\n function assertNotEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are not equal.\n function assertNotEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal.\n function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal.\n function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal.\n function assertNotEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal.\n function assertNotEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are not equal.\n function assertNotEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal.\n function assertNotEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are not equal.\n function assertNotEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are not equal.\n function assertNotEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is true.\n function assertTrue(bool condition) external pure;\n\n /// Asserts that the given condition is true and includes error message into revert string on failure.\n function assertTrue(bool condition, string calldata error) external pure;\n\n /// If the condition is false, discard this run's fuzz inputs and generate new ones.\n function assume(bool condition) external pure;\n\n /// Discard this run's fuzz inputs and generate new ones if next call reverted.\n function assumeNoRevert() external pure;\n\n /// Writes a breakpoint to jump to in the debugger.\n function breakpoint(string calldata char) external;\n\n /// Writes a conditional breakpoint to jump to in the debugger.\n function breakpoint(string calldata char, bool value) external;\n\n /// Returns the Foundry version.\n /// Format: ++\n /// Sample output: 0.2.0+faa94c384+202407110019\n /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.\n /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000)\n /// to compare timestamps while ignoring minor time differences.\n function getFoundryVersion() external view returns (string memory version);\n\n /// Returns the RPC url for the given alias.\n function rpcUrl(string calldata rpcAlias) external view returns (string memory json);\n\n /// Returns all rpc urls and their aliases as structs.\n function rpcUrlStructs() external view returns (Rpc[] memory urls);\n\n /// Returns all rpc urls and their aliases `[alias, url][]`.\n function rpcUrls() external view returns (string[2][] memory urls);\n\n /// Suspends execution of the main thread for `duration` milliseconds.\n function sleep(uint256 duration) external;\n\n // ======== Toml ========\n\n /// Checks if `key` exists in a TOML table.\n function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `address`.\n function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);\n\n /// Parses a string of TOML data at `key` and coerces it to `address[]`.\n function parseTomlAddressArray(string calldata toml, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool`.\n function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool[]`.\n function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes`.\n function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32`.\n function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.\n function parseTomlBytes32Array(string calldata toml, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.\n function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256`.\n function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256[]`.\n function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a TOML table.\n function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of TOML data at `key` and coerces it to `string`.\n function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `string[]`.\n function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256`.\n function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.\n function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a TOML table.\n function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a TOML table at `key`.\n function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.\n function writeToml(string calldata json, string calldata path) external;\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = \n /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.\n function writeToml(string calldata json, string calldata path, string calldata valueKey) external;\n\n // ======== Utilities ========\n\n /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer)\n external\n pure\n returns (address);\n\n /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);\n\n /// Compute the address a contract will be deployed at for a given deployer address and nonce.\n function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);\n\n /// Utility cheatcode to copy storage of `from` contract to another `to` contract.\n function copyStorage(address from, address to) external;\n\n /// Returns ENS namehash for provided string.\n function ensNamehash(string calldata name) external pure returns (bytes32);\n\n /// Gets the label for the specified address.\n function getLabel(address account) external view returns (string memory currentLabel);\n\n /// Labels an address in call traces.\n function label(address account, string calldata newLabel) external;\n\n /// Pauses collection of call traces. Useful in cases when you want to skip tracing of\n /// complex calls which are not useful for debugging.\n function pauseTracing() external view;\n\n /// Returns a random `address`.\n function randomAddress() external returns (address);\n\n /// Returns an random `bool`.\n function randomBool() external view returns (bool);\n\n /// Returns an random byte array value of the given length.\n function randomBytes(uint256 len) external view returns (bytes memory);\n\n /// Returns an random `int256` value.\n function randomInt() external view returns (int256);\n\n /// Returns an random `int256` value of given bits.\n function randomInt(uint256 bits) external view returns (int256);\n\n /// Returns a random uint256 value.\n function randomUint() external returns (uint256);\n\n /// Returns random uint256 value between the provided range (=min..=max).\n function randomUint(uint256 min, uint256 max) external returns (uint256);\n\n /// Returns an random `uint256` value of given bits.\n function randomUint(uint256 bits) external view returns (uint256);\n\n /// Unpauses collection of call traces.\n function resumeTracing() external view;\n\n /// Utility cheatcode to set arbitrary storage for given target address.\n function setArbitraryStorage(address target) external;\n\n /// Encodes a `bytes` value to a base64url string.\n function toBase64URL(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64url string.\n function toBase64URL(string calldata data) external pure returns (string memory);\n\n /// Encodes a `bytes` value to a base64 string.\n function toBase64(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64 string.\n function toBase64(string calldata data) external pure returns (string memory);\n}\n\n/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used\n/// in tests, but it is not recommended to use these cheats in scripts.\ninterface Vm is VmSafe {\n // ======== EVM ========\n\n /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.\n function activeFork() external view returns (uint256 forkId);\n\n /// In forking mode, explicitly grant the given address cheatcode access.\n function allowCheatcodes(address account) external;\n\n /// Sets `block.blobbasefee`\n function blobBaseFee(uint256 newBlobBaseFee) external;\n\n /// Sets the blobhashes in the transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function blobhashes(bytes32[] calldata hashes) external;\n\n /// Sets `block.chainid`.\n function chainId(uint256 newChainId) external;\n\n /// Clears all mocked calls.\n function clearMockedCalls() external;\n\n /// Sets `block.coinbase`.\n function coinbase(address newCoinbase) external;\n\n /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Sets an address' balance.\n function deal(address account, uint256 newBalance) external;\n\n /// Removes the snapshot with the given ID created by `snapshot`.\n /// Takes the snapshot ID to delete.\n /// Returns `true` if the snapshot was successfully deleted.\n /// Returns `false` if the snapshot does not exist.\n function deleteSnapshot(uint256 snapshotId) external returns (bool success);\n\n /// Removes _all_ snapshots previously created by `snapshot`.\n function deleteSnapshots() external;\n\n /// Sets `block.difficulty`.\n /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.\n /// Reverts if used on unsupported EVM versions.\n function difficulty(uint256 newDifficulty) external;\n\n /// Dump a genesis JSON file's `allocs` to disk.\n function dumpState(string calldata pathToStateJson) external;\n\n /// Sets an address' code.\n function etch(address target, bytes calldata newRuntimeBytecode) external;\n\n /// Sets `block.basefee`.\n function fee(uint256 newBasefee) external;\n\n /// Gets the blockhashes from the current transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function getBlobhashes() external view returns (bytes32[] memory hashes);\n\n /// Returns true if the account is marked as persistent.\n function isPersistent(address account) external view returns (bool persistent);\n\n /// Load a genesis JSON file's `allocs` into the in-memory revm state.\n function loadAllocs(string calldata pathToAllocsJson) external;\n\n /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup\n /// Meaning, changes made to the state of this account will be kept when switching forks.\n function makePersistent(address account) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1, address account2) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address[] calldata accounts) external;\n\n /// Reverts a call to an address with specified revert data.\n function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;\n\n /// Reverts a call to an address with a specific `msg.value`, with specified revert data.\n function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)\n external;\n\n /// Mocks a call to an address, returning specified data.\n /// Calldata can either be strict or a partial match, e.g. if you only\n /// pass a Solidity selector to the expected calldata, then the entire Solidity\n /// function will be mocked.\n function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;\n\n /// Mocks a call to an address with a specific `msg.value`, returning specified data.\n /// Calldata match takes precedence over `msg.value` in case of ambiguity.\n function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;\n\n /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls\n /// `target` with the same calldata. This functionality is similar to a delegate call made to\n /// `target` contract from `callee`.\n /// Can be used to substitute a call to a function with another implementation that captures\n /// the primary logic of the original function but is easier to reason about.\n /// If calldata is not a strict match then partial match by selector is attempted.\n function mockFunction(address callee, address target, bytes calldata data) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address.\n function prank(address msgSender) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.\n function prank(address msgSender, address txOrigin) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(bytes32 newPrevrandao) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(uint256 newPrevrandao) external;\n\n /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.\n function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin);\n\n /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.\n function resetNonce(address account) external;\n\n /// Revert the state of the EVM to a previous snapshot\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted.\n /// Returns `false` if the snapshot does not exist.\n /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`.\n function revertTo(uint256 snapshotId) external returns (bool success);\n\n /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted and deleted.\n /// Returns `false` if the snapshot does not exist.\n function revertToAndDelete(uint256 snapshotId) external returns (bool success);\n\n /// Revokes persistent status from the address, previously added via `makePersistent`.\n function revokePersistent(address account) external;\n\n /// See `revokePersistent(address)`.\n function revokePersistent(address[] calldata accounts) external;\n\n /// Sets `block.height`.\n function roll(uint256 newHeight) external;\n\n /// Updates the currently active fork to given block number\n /// This is similar to `roll` but for the currently active fork.\n function rollFork(uint256 blockNumber) external;\n\n /// Updates the currently active fork to given transaction. This will `rollFork` with the number\n /// of the block the transaction was mined in and replays all transaction mined before it in the block.\n function rollFork(bytes32 txHash) external;\n\n /// Updates the given fork to given block number.\n function rollFork(uint256 forkId, uint256 blockNumber) external;\n\n /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.\n function rollFork(uint256 forkId, bytes32 txHash) external;\n\n /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.\n function selectFork(uint256 forkId) external;\n\n /// Set blockhash for the current block.\n /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.\n function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;\n\n /// Sets the nonce of an account. Must be higher than the current nonce of the account.\n function setNonce(address account, uint64 newNonce) external;\n\n /// Sets the nonce of an account to an arbitrary value.\n function setNonceUnsafe(address account, uint64 newNonce) external;\n\n /// Snapshot the current state of the evm.\n /// Returns the ID of the snapshot that was created.\n /// To revert a snapshot use `revertTo`.\n function snapshot() external returns (uint256 snapshotId);\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.\n function startPrank(address msgSender) external;\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.\n function startPrank(address msgSender, address txOrigin) external;\n\n /// Resets subsequent calls' `msg.sender` to be `address(this)`.\n function stopPrank() external;\n\n /// Stores a value to an address' storage slot.\n function store(address target, bytes32 slot, bytes32 value) external;\n\n /// Fetches the given transaction from the active fork and executes it on the current state.\n function transact(bytes32 txHash) external;\n\n /// Fetches the given transaction from the given fork and executes it on the current state.\n function transact(uint256 forkId, bytes32 txHash) external;\n\n /// Sets `tx.gasprice`.\n function txGasPrice(uint256 newGasPrice) external;\n\n /// Sets `block.timestamp`.\n function warp(uint256 newTimestamp) external;\n\n // ======== Testing ========\n\n /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;\n\n /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)\n external;\n\n /// Expects a call to an address with the specified calldata.\n /// Calldata can either be a strict or a partial match.\n function expectCall(address callee, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified calldata.\n function expectCall(address callee, bytes calldata data, uint64 count) external;\n\n /// Expects a call to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;\n\n /// Expect a call to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;\n\n /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)\n external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(\n bool checkTopic0,\n bool checkTopic1,\n bool checkTopic2,\n bool checkTopic3,\n bool checkData,\n address emitter\n ) external;\n\n /// Prepare an expected anonymous log with all topic and data checks enabled.\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmitAnonymous() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(address emitter) external;\n\n /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)\n external;\n\n /// Prepare an expected log with all topic and data checks enabled.\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmit() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(address emitter) external;\n\n /// Expects an error on next call that starts with the revert data.\n function expectPartialRevert(bytes4 revertData) external;\n\n /// Expects an error on next call to reverter address, that starts with the revert data.\n function expectPartialRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error on next call with any revert data.\n function expectRevert() external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes4 revertData) external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes calldata revertData) external;\n\n /// Expects an error with any revert data on next call to reverter address.\n function expectRevert(address reverter) external;\n\n /// Expects an error from reverter address on next call, with any revert data.\n function expectRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error from reverter address on next call, that exactly matches the revert data.\n function expectRevert(bytes calldata revertData, address reverter) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other\n /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.\n function expectSafeMemory(uint64 min, uint64 max) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.\n /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges\n /// to the set.\n function expectSafeMemoryCall(uint64 min, uint64 max) external;\n\n /// Marks a test as skipped. Must be called at the top level of a test.\n function skip(bool skipTest) external;\n\n /// Marks a test as skipped with a reason. Must be called at the top level of a test.\n function skip(bool skipTest, string calldata reason) external;\n\n /// Stops all safe memory expectation in the current subcontext.\n function stopExpectSafeMemory() external;\n}\n" + }, + "lib/ERC1155Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport 'lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol';\n\ncontract ERC1155Mintable is ERC1155(\"//uri\"), ERC1155Burnable {\n function mint(address to, uint256 id, uint256 amount) public {\n _mint(to, id, amount, bytes(\"\"));\n }\n}\n" + }, + "lib/ERC20Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\n\ncontract ERC20Mintable is ERC20(\"n\", \"s\") {\n function mint(address to, uint256 amount) public {\n _mint(to, amount);\n }\n}\n" + }, + "lib/ERC721Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol\";\n\ncontract ERC721Mintable is ERC721(\"n\", \"s\") {\n function mint(address to, uint256 tokenId) public {\n _mint(to, tokenId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() external {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC1155.sol\";\nimport \"./IERC1155Receiver.sol\";\nimport \"./extensions/IERC1155MetadataURI.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n *\n * _Available since v3.1._\n */\ncontract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {\n using Address for address;\n\n // Mapping from token ID to account balances\n mapping(uint256 => mapping(address => uint256)) private _balances;\n\n // Mapping from account to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256) public view virtual override returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {\n require(account != address(0), \"ERC1155: address zero is not a valid owner\");\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] memory accounts, uint256[] memory ids)\n public\n view\n virtual\n override\n returns (uint256[] memory)\n {\n require(accounts.length == ids.length, \"ERC1155: accounts and ids length mismatch\");\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts[i], ids[i]);\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeTransferFrom(from, to, id, amount, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeBatchTransferFrom(from, to, ids, amounts, data);\n }\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n\n emit TransferSingle(operator, from, to, id, amount);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n }\n\n emit TransferBatch(operator, from, to, ids, amounts);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the amounts in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _balances[id][to] += amount;\n emit TransferSingle(operator, address(0), to, id, amount);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; i++) {\n _balances[ids[i]][to] += amounts[i];\n }\n\n emit TransferBatch(operator, address(0), to, ids, amounts);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);\n }\n\n /**\n * @dev Destroys `amount` tokens of token type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `amount` tokens of token type `id`.\n */\n function _burn(\n address from,\n uint256 id,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n\n emit TransferSingle(operator, from, address(0), id, amount);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n */\n function _burnBatch(\n address from,\n uint256[] memory ids,\n uint256[] memory amounts\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n for (uint256 i = 0; i < ids.length; i++) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n }\n\n emit TransferBatch(operator, from, address(0), ids, amounts);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC1155: setting approval status for self\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `ids` and `amounts` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `id` and `amount` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {\n uint256[] memory array = new uint256[](1);\n array[0] = element;\n\n return array;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1155.sol\";\n\n/**\n * @dev Extension of {ERC1155} that allows token holders to destroy both their\n * own tokens and those that they have been approved to use.\n *\n * _Available since v3.1._\n */\nabstract contract ERC1155Burnable is ERC1155 {\n function burn(\n address account,\n uint256 id,\n uint256 value\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burn(account, id, value);\n }\n\n function burnBatch(\n address account,\n uint256[] memory ids,\n uint256[] memory values\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burnBatch(account, ids, values);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)\n external\n view\n returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes calldata data\n ) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) external;\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC1155Receiver.sol\";\n\n/**\n * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.\n *\n * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be\n * stuck.\n *\n * @dev _Available since v3.1._\n */\ncontract ERC1155Holder is ERC1155Receiver {\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155Receiver.sol\";\nimport \"../../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\nabstract contract ERC1155Receiver is ERC165, IERC1155Receiver {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.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 * For a generic mechanism see {ERC20PresetMinterPauser}.\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 * 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 *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => 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 * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\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 override 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 override 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 value {ERC20} uses, unless this function is\n * 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 override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override 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 `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` 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 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\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 `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `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 * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` 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 function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\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" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\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 amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` 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(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256, /* firstTokenId */\n uint256 batchSize\n ) internal virtual {\n if (batchSize > 1) {\n if (from != address(0)) {\n _balances[from] -= batchSize;\n }\n if (to != address(0)) {\n _balances[to] += batchSize;\n }\n }\n }\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Receiver.sol\";\n\n/**\n * @dev Implementation of the {IERC721Receiver} interface.\n *\n * Accepts all token transfers.\n * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.\n */\ncontract ERC721Holder is IERC721Receiver {\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n *\n * Always returns `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "lib/openzeppelin-contracts/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface.\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n // prepare call\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n\n // perform static call\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly {\n success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0x00)\n }\n\n return success && returnSize >= 0x20 && returnValue > 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableMap.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableMap.js.\n\npragma solidity ^0.8.0;\n\nimport \"./EnumerableSet.sol\";\n\n/**\n * @dev Library for managing an enumerable variant of Solidity's\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\n * type.\n *\n * Maps have the following properties:\n *\n * - Entries are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableMap for EnumerableMap.UintToAddressMap;\n *\n * // Declare a set state variable\n * EnumerableMap.UintToAddressMap private myMap;\n * }\n * ```\n *\n * The following map types are supported:\n *\n * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0\n * - `address -> uint256` (`AddressToUintMap`) since v4.6.0\n * - `bytes32 -> bytes32` (`Bytes32ToBytes32Map`) since v4.6.0\n * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0\n * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableMap.\n * ====\n */\nlibrary EnumerableMap {\n using EnumerableSet for EnumerableSet.Bytes32Set;\n\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Map type with\n // bytes32 keys and values.\n // The Map implementation uses private functions, and user-facing\n // implementations (such as Uint256ToAddressMap) are just wrappers around\n // the underlying Map.\n // This means that we can only create new EnumerableMaps for types that fit\n // in bytes32.\n\n struct Bytes32ToBytes32Map {\n // Storage of keys\n EnumerableSet.Bytes32Set _keys;\n mapping(bytes32 => bytes32) _values;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n bytes32 value\n ) internal returns (bool) {\n map._values[key] = value;\n return map._keys.add(key);\n }\n\n /**\n * @dev Removes a key-value pair from a map. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {\n delete map._values[key];\n return map._keys.remove(key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) {\n return map._keys.contains(key);\n }\n\n /**\n * @dev Returns the number of key-value pairs in the map. O(1).\n */\n function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) {\n return map._keys.length();\n }\n\n /**\n * @dev Returns the key-value pair stored at position `index` in the map. O(1).\n *\n * Note that there are no guarantees on the ordering of entries inside the\n * array, and it may change when more entries are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) {\n bytes32 key = map._keys.at(index);\n return (key, map._values[key]);\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) {\n bytes32 value = map._values[key];\n if (value == bytes32(0)) {\n return (contains(map, key), bytes32(0));\n } else {\n return (true, value);\n }\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), \"EnumerableMap: nonexistent key\");\n return value;\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), errorMessage);\n return value;\n }\n\n // UintToUintMap\n\n struct UintToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToUintMap storage map,\n uint256 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToUintMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key)));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToUintMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key), errorMessage));\n }\n\n // UintToAddressMap\n\n struct UintToAddressMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToAddressMap storage map,\n uint256 key,\n address value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToAddressMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), address(uint160(uint256(value))));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, address(uint160(uint256(value))));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToAddressMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage))));\n }\n\n // AddressToUintMap\n\n struct AddressToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n AddressToUintMap storage map,\n address key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(AddressToUintMap storage map, address key) internal returns (bool) {\n return remove(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(AddressToUintMap storage map, address key) internal view returns (bool) {\n return contains(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(AddressToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (address(uint160(uint256(key))), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key))));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(AddressToUintMap storage map, address key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n AddressToUintMap storage map,\n address key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage));\n }\n\n // Bytes32ToUintMap\n\n struct Bytes32ToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToUintMap storage map,\n bytes32 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, key, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) {\n return remove(map._inner, key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) {\n return contains(map._inner, key);\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(Bytes32ToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (key, uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, key);\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) {\n return uint256(get(map._inner, key));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToUintMap storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, key, errorMessage));\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableSet for EnumerableSet.AddressSet;\n *\n * // Declare a set state variable\n * EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSet {\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Set type with\n // bytes32 values.\n // The Set implementation uses private functions, and user-facing\n // implementations (such as AddressSet) are just wrappers around the\n // underlying Set.\n // This means that we can only create new EnumerableSets for types that fit\n // in bytes32.\n\n struct Set {\n // Storage of set values\n bytes32[] _values;\n // Position of the value in the `values` array, plus 1 because index 0\n // means a value is not in the set.\n mapping(bytes32 => uint256) _indexes;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function _add(Set storage set, bytes32 value) private returns (bool) {\n if (!_contains(set, value)) {\n set._values.push(value);\n // The value is stored at length-1, but we add 1 to all indexes\n // and use 0 as a sentinel value\n set._indexes[value] = set._values.length;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function _remove(Set storage set, bytes32 value) private returns (bool) {\n // We read and store the value's index to prevent multiple reads from the same storage slot\n uint256 valueIndex = set._indexes[value];\n\n if (valueIndex != 0) {\n // Equivalent to contains(set, value)\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n // the array, and then remove the last element (sometimes called as 'swap and pop').\n // This modifies the order of the array, as noted in {at}.\n\n uint256 toDeleteIndex = valueIndex - 1;\n uint256 lastIndex = set._values.length - 1;\n\n if (lastIndex != toDeleteIndex) {\n bytes32 lastValue = set._values[lastIndex];\n\n // Move the last value to the index where the value to delete is\n set._values[toDeleteIndex] = lastValue;\n // Update the index for the moved value\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\n }\n\n // Delete the slot where the moved value was stored\n set._values.pop();\n\n // Delete the index for the deleted slot\n delete set._indexes[value];\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\n return set._indexes[value] != 0;\n }\n\n /**\n * @dev Returns the number of values on the set. O(1).\n */\n function _length(Set storage set) private view returns (uint256) {\n return set._values.length;\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\n return set._values[index];\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function _values(Set storage set) private view returns (bytes32[] memory) {\n return set._values;\n }\n\n // Bytes32Set\n\n struct Bytes32Set {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _add(set._inner, value);\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _remove(set._inner, value);\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n return _contains(set._inner, value);\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(Bytes32Set storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n return _at(set._inner, index);\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n bytes32[] memory store = _values(set._inner);\n bytes32[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // AddressSet\n\n struct AddressSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(AddressSet storage set, address value) internal returns (bool) {\n return _add(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(AddressSet storage set, address value) internal returns (bool) {\n return _remove(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(AddressSet storage set, address value) internal view returns (bool) {\n return _contains(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(AddressSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\n return address(uint160(uint256(_at(set._inner, index))));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(AddressSet storage set) internal view returns (address[] memory) {\n bytes32[] memory store = _values(set._inner);\n address[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // UintSet\n\n struct UintSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(UintSet storage set, uint256 value) internal returns (bool) {\n return _add(set._inner, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\n return _remove(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n return _contains(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(UintSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n return uint256(_at(set._inner, index));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(UintSet storage set) internal view returns (uint256[] memory) {\n bytes32[] memory store = _values(set._inner);\n uint256[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n}\n" + }, + "lib/solmate/src/tokens/ERC20.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\nabstract contract ERC20 {\n /*//////////////////////////////////////////////////////////////\n EVENTS\n //////////////////////////////////////////////////////////////*/\n\n event Transfer(address indexed from, address indexed to, uint256 amount);\n\n event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string public name;\n\n string public symbol;\n\n uint8 public immutable decimals;\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 public totalSupply;\n\n mapping(address => uint256) public balanceOf;\n\n mapping(address => mapping(address => uint256)) public allowance;\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal immutable INITIAL_CHAIN_ID;\n\n bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n CONSTRUCTOR\n //////////////////////////////////////////////////////////////*/\n\n constructor(\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n\n INITIAL_CHAIN_ID = block.chainid;\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual returns (bool) {\n allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual returns (bool) {\n balanceOf[msg.sender] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual returns (bool) {\n uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;\n\n balanceOf[from] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n // Unchecked because the only math done is incrementing\n // the owner's nonce which cannot realistically overflow.\n unchecked {\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n allowance[recoveredAddress][spender] = value;\n }\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return\n keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(\"1\"),\n block.chainid,\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n totalSupply += amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n balanceOf[from] -= amount;\n\n // Cannot underflow because a user's balance\n // will never be larger than the total supply.\n unchecked {\n totalSupply -= amount;\n }\n\n emit Transfer(from, address(0), amount);\n }\n}\n" + }, + "lib/solmate/src/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Gas optimized reentrancy protection for smart contracts.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)\nabstract contract ReentrancyGuard {\n uint256 private locked = 1;\n\n modifier nonReentrant() virtual {\n require(locked == 1, \"REENTRANCY\");\n\n locked = 2;\n\n _;\n\n locked = 1;\n }\n}\n" + }, + "lib/solmate/src/utils/SafeTransferLib.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20} from \"../tokens/ERC20.sol\";\n\n/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)\n/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.\n/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.\nlibrary SafeTransferLib {\n /*//////////////////////////////////////////////////////////////\n ETH OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferETH(address to, uint256 amount) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Transfer the ETH and store if it succeeded or not.\n success := call(gas(), to, amount, 0, 0, 0, 0)\n }\n\n require(success, \"ETH_TRANSFER_FAILED\");\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferFrom(\n ERC20 token,\n address from,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), from) // Append the \"from\" argument.\n mstore(add(freeMemoryPointer, 36), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 68), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FROM_FAILED\");\n }\n\n function safeTransfer(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FAILED\");\n }\n\n function safeApprove(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"APPROVE_FAILED\");\n }\n}\n" + } + }, + "settings": { + "evmVersion": "paris", + "optimizer": { + "enabled": true, + "mode": "3" + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout" + ], + "": [ + "ast" + ] + } + }, + "detectMissingLibraries": false, + "forceEVMLA": false, + "enableEraVMExtensions": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/deployments/treasureTopaz/.chainId b/deployments/treasureTopaz/.chainId new file mode 100644 index 0000000..4e79b60 --- /dev/null +++ b/deployments/treasureTopaz/.chainId @@ -0,0 +1 @@ +978658 \ No newline at end of file diff --git a/deployments/treasureTopaz/MagicSwapV2Router.json b/deployments/treasureTopaz/MagicSwapV2Router.json new file mode 100644 index 0000000..da5f88b --- /dev/null +++ b/deployments/treasureTopaz/MagicSwapV2Router.json @@ -0,0 +1,4781 @@ +{ + "address": "0xAd781eD13b5966E7c620B896B6340AbB4dd2ca86", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "MagicSwapV2InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountADeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountBDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmounts", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExcessiveInputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientAAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientBAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientOutputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedNft", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityRemoved", + "type": "event" + }, + { + "inputs": [], + "name": "BURN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ONE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountADesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountTokenDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountMinted", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountIn", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountOut", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsOut", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveB", + "type": "uint256" + } + ], + "name": "quote", + "outputs": [ + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityETHWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapETHForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapETHForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactETHForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collectionIn", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountIn", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_collectionOut", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountOut", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapTokensForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "withdrawVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x022a4b97045770eca2e423fbf47d802ac7b1c5005b3b78444969626533fb9698", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0xAd781eD13b5966E7c620B896B6340AbB4dd2ca86", + "transactionIndex": 0, + "gasUsed": "143690", + "logsBloom": "0x00000002000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000040000000008000040000000000000000000000000000000080400000000000000000000000000000000000000000000000000000010000000000000000000000000000004000000000000000100000000000000000000000000000000000000180000000000800010000000000000000000002000010000000000000002008000000000000000000000000000020100000000000000000000000200000000010000000000000000000000000000000000000000000000100000", + "blockHash": "0x9d155dcb0360cd2b079085f1a8e7826bba246ae15ca954b87ea8f170c7223952", + "transactionHash": "0x022a4b97045770eca2e423fbf47d802ac7b1c5005b3b78444969626533fb9698", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 1642, + "transactionHash": "0x022a4b97045770eca2e423fbf47d802ac7b1c5005b3b78444969626533fb9698", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x00000000000000000000000000000000000000000000000000000e182585d0cc", + "logIndex": 0, + "blockHash": "0x9d155dcb0360cd2b079085f1a8e7826bba246ae15ca954b87ea8f170c7223952" + }, + { + "transactionIndex": 0, + "blockNumber": 1642, + "transactionHash": "0x022a4b97045770eca2e423fbf47d802ac7b1c5005b3b78444969626533fb9698", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x000000000000000000000000000000000000000000000000000002fc5f9a5bd8", + "logIndex": 1, + "blockHash": "0x9d155dcb0360cd2b079085f1a8e7826bba246ae15ca954b87ea8f170c7223952" + }, + { + "transactionIndex": 0, + "blockNumber": 1642, + "transactionHash": "0x022a4b97045770eca2e423fbf47d802ac7b1c5005b3b78444969626533fb9698", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0100141159e31f4ebc3a6451663e13976564c96f78f859fb58cb15a60c017bb0", + "0x000000000000000000000000ad781ed13b5966e7c620b896b6340abb4dd2ca86" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0x9d155dcb0360cd2b079085f1a8e7826bba246ae15ca954b87ea8f170c7223952" + }, + { + "transactionIndex": 0, + "blockNumber": 1642, + "transactionHash": "0x022a4b97045770eca2e423fbf47d802ac7b1c5005b3b78444969626533fb9698", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x0000000000000000000000000000000000000000000000000000040a45630026", + "logIndex": 3, + "blockHash": "0x9d155dcb0360cd2b079085f1a8e7826bba246ae15ca954b87ea8f170c7223952" + } + ], + "blockNumber": 1642, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [ + "0x129A3Fe403c94000A89136ABDffce7C98FbDaB8a", + "0x095ded714d42cBD5fb2E84A0FfbFb140E38dC9E1" + ], + "numDeployments": 4, + "solcInputHash": "29575f9c42d79da7d15102bbf5192733", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "MagicSwapV2InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountADeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountBDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmounts", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExcessiveInputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientAAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientBAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientOutputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedNft", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityRemoved", + "type": "event" + }, + { + "inputs": [], + "name": "BURN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ONE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountADesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountTokenDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountMinted", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountIn", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountOut", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsOut", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveB", + "type": "uint256" + } + ], + "name": "quote", + "outputs": [ + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityETHWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapETHForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapETHForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactETHForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collectionIn", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountIn", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_collectionOut", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountOut", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapTokensForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "withdrawVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "errors": { + "MagicSwapV2WrongAmounts()": [ + { + "details": "Amounts does not match" + } + ], + "UnsupportedNft()": [ + { + "details": "Trying to interact with token that does not support ERC721 nor ERC1155" + } + ] + }, + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vault": "vault data of deposited NFTs" + } + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vault": "vault data of withdrawn NFTs" + } + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vaultA": "vault data of deposited NFTs for first side", + "vaultB": "vault data of deposited NFTs for second side" + } + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vaultA": "vault data of withdrawn NFTs for first side", + "vaultB": "vault data of withdrawn NFTs for second side" + } + } + }, + "kind": "dev", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountBDesired": "desired amount of token B to be added as liquidity", + "_amountBMin": "minimum amount of token B to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "desired amount of ETH to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountETH": "amount of ETH added as liquidity", + "amountToken": "amount of vault token added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "details": "All NFTs must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be deposited", + "_amountBMin": "minimum amount of token B to be deposited", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to deposit as liquidity for first side", + "_vaultB": "vault data for NFTs to deposit as liquidity for second side" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to deposit. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to deposit", + "_to": "address that gets ERC20 for deposited NFTs", + "_tokenId": "list of token IDs to deposit", + "_vault": "address of the vault where NFTs are deposited" + }, + "returns": { + "amountMinted": "amount of ERC20 minted for deposited NFTs" + } + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to Token B", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "minimum amount of ETH to be redeemed", + "_amountTokenMin": "minimum amount of vault token to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to ETH", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountETH": "amount of ETH redeemed", + "amountToken": "amount of vault token redeemed" + } + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "details": "Lp token must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to withdraw from liquidity for first side", + "_vaultB": "vault data for NFTs to withdraw from liquidity for second side" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "details": "Does not require any approvals. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for ETH. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to receive for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for ETH. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of ETH expected after swap", + "_collection": "list of NFT addresses to swap for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets ETH", + "_tokenId": "list of token IDs to swap for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "details": "All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn` as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.", + "params": { + "_amountIn": "list of input token amounts. For ERC721 amount is always 1.", + "_amountOut": "list of output token amounts. For ERC721 amount is always 1.", + "_collectionIn": "list of input NFT addresses", + "_collectionOut": "list of output NFT addresses", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenIdIn": "list of input token IDs", + "_tokenIdOut": "list of output token IDs" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for token. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of output token expected after swap", + "_collection": "list of NFT addresses to swap for token", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets output token", + "_tokenId": "list of token IDs to swap for token" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "ERC20 must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for tokens. For ERC721 amount is always 1.", + "_amountInMax": "maximum acceptable amount of token to swap for NFTs", + "_collection": "list of NFT addresses to receive for tokens", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for tokens" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "withdrawVault(address[],uint256[],uint256[],address,address)": { + "details": "Withdraw NFTs from vaultVault token must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to withdraw. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to withdraw", + "_to": "address that gets withdrawn NFTs", + "_tokenId": "list of token IDs to withdraw", + "_vault": "address of the vault to withdraw NFTs from" + }, + "returns": { + "amountBurned": "amount of ERC20 redeemed for NFTs" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is added" + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is removed" + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is added" + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is removed" + } + }, + "kind": "user", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and second ERC20 token" + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and ETH" + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using two NFT vaults" + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "notice": "Deposit NFTs to vault" + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ERC20 token" + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ETH" + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs" + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap ETH for NFTs" + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ETH" + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap NFTs for NFTs" + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ERC20" + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap ERC20 for NFTs" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Router/MagicSwapV2Router.sol": "MagicSwapV2Router" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Router/IMagicSwapV2Router.sol": { + "keccak256": "0xdb888ba1f12b7183d1ecdb0bd339dc5d925b5162cb92824d5d68e1f38b247783", + "license": "MIT", + "urls": [ + "bzz-raw://0ceb09f733371968efa18dc2541e54f181922ef8172a48b350db765dc2fd2495", + "dweb:/ipfs/QmWaiHJ1dcjH2fwXyrTFNS3BJ4gU23mBxdLykCUEsyPMbz" + ] + }, + "contracts/Router/MagicSwapV2Router.sol": { + "keccak256": "0xaae4f0fb40a1f8a82fdde45247d241b8a0a9834420da05c1eed3f84cb595cd5e", + "license": "MIT", + "urls": [ + "bzz-raw://de2ce14bf9f2dd56c92dd98cf0107eb7893916030956caa88bab8b2e884ae21a", + "dweb:/ipfs/Qmaaon5zGU4hBqKJe14UxZru2FGydvavEDWuhBQiqUDZWv" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "keccak256": "0xd8d0de3bc69be9bb5106a5d83f2d6ce2fb523d763b03f2986fce0d355fce6d2a", + "license": "MIT", + "urls": [ + "bzz-raw://bd591385f6f6f94f62c2b519663fa00933d8f2f7d462cea3145e896986e53564", + "dweb:/ipfs/QmRK4x93DxKuyDdgE5PAPWrJzVrQcnBGPiTdBhwKcXanZn" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "keccak256": "0x581635a3e35ab2ae2ce040810296921859b606e19a83f5277396f8b51cb548a1", + "license": "MIT", + "urls": [ + "bzz-raw://61e91d41aa083b0d41f1c30780efbc0259c0c717c122fc11b69ee249362b2330", + "dweb:/ipfs/QmdHsKrcno9mmXAj3zotSLQqX4K6BYFxxJuzxUBGAwVKzi" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "keccak256": "0xb96650151113d4a4224a66aba18c59560b6558375b7eda755abb73f5095c233f", + "license": "MIT", + "urls": [ + "bzz-raw://254aba5995bf05b6d8a1268a9bdbe7d02a86ff4f1cd32a4104977be7384d6c20", + "dweb:/ipfs/QmRNZX4Z8m7QkBvEEbAQhs85cM3wxQ6tNDpCjuoYipZ3zE" + ] + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "keccak256": "0xc8075f02390b9bc257755e15590b56a51e2db779350bfbb5f50ab5b6ebf2e9cc", + "license": "MIT", + "urls": [ + "bzz-raw://34ea022d70255fce6141d5eca24f81096ca371dc4a3297ebe13dd89dc6d119c5", + "dweb:/ipfs/QmXWJuuwv3S8ePZdJUbifD33VqjGng1kkbXk2bzmFcPjez" + ] + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "keccak256": "0xde862b35bbd7c6ac8dd071dc0cd38873bcdb2308a379d55644a38b7c15da4c2f", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://9ac966d3b2824a5edb1cd8dceb840d5c2ec7b4852abcc46d473717bc4454e4b9", + "dweb:/ipfs/QmchxPi4nwYPzKtzKrSCaDmVuXgBefAcRtDue9bdRNDV8M" + ] + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "keccak256": "0x37dc5def704641a09087cc013c342d90b4ec19895f3a7db0b19e0b85fa835b1f", + "license": "MIT", + "urls": [ + "bzz-raw://94d8ad4085e5d0068859ff1ca0c7ccbac67366c87afa7e4ebee17a98d9b8d21a", + "dweb:/ipfs/QmTyzy2owzkRBPRcrPSPc4S35dq7U8KXQYoDWMGdS1Ysq8" + ] + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "keccak256": "0xa582e16b3ee477026948b6b3005dbf6cc3cd26b7f5bb6b30d26a30d95817ba79", + "license": "MIT", + "urls": [ + "bzz-raw://f73e7a540120fa614930131a589959d812bc9934c5e28badda026667ce5b69a6", + "dweb:/ipfs/QmdS18B1tw8Lx4dS7SjATik8EJNEr6zX2jD3ujRZqfJd52" + ] + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "keccak256": "0x4bbae1ece9f02b258df5f4e9ace2bca49d3a856d573af95fe18bb674489ba26f", + "license": "MIT", + "urls": [ + "bzz-raw://7849a819f44fb311a6f860a031082721ac1e18fffba4ef5ab24d67c646b6d580", + "dweb:/ipfs/QmRxeaBmcW49R7xnSTHTCtbWh76LEgRjkQMkRX4fWdBmBD" + ] + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "keccak256": "0x44adba74f336c548fa63c94f2f1c344c96320076668a7f71767ef9f66a0aa49c", + "license": "MIT", + "urls": [ + "bzz-raw://e2d46b52b4a233a2684994ac802510f4d57473394161398a4352e0bea5066d8f", + "dweb:/ipfs/QmPxZ6mgiQoFfXtGNvkYEWMyeVBAaUbKLcbMJ73gqEZQXE" + ] + }, + "contracts/Vault/INftVault.sol": { + "keccak256": "0x1b55813c809306ff889c9a07ea9aae68a4267568b5d09226096779b2bc8f552c", + "license": "MIT", + "urls": [ + "bzz-raw://a890283e8f67d5c2d8ff78486e4d2c214587aac76dd941f5d0a3a7a1b02b2280", + "dweb:/ipfs/QmUBhfyiit6VHerjJGmQL2q9C3P3XiX1gjv97jVx37qn6v" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "keccak256": "0x6392f2cfe3a5ee802227fe7a2dfd47096d881aec89bddd214b35c5b46d3cd941", + "license": "MIT", + "urls": [ + "bzz-raw://bd9c47a375639888e726a99da718890ba16d17d7ad9eacb0ccc892d46d1b3ee0", + "dweb:/ipfs/Qmb41W5RUjy2sWg49A2rMnxekSeEk6SvGyJL5tyCCSr7un" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "keccak256": "0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329", + "license": "MIT", + "urls": [ + "bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95", + "dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238", + "license": "MIT", + "urls": [ + "bzz-raw://f5a7b96e511be78d5cdf635c784e6ab8cdd38625bb8cafb8a80914a1c89cf0f6", + "dweb:/ipfs/QmVzTCwJxQAkjRQHboT5QrvsVJGWQHgfEjeTbvyxoKBrds" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68", + "license": "MIT", + "urls": [ + "bzz-raw://daae589a9d6fa7e55f99f86c0a16796ca490f243fb3693632c3711c0646c1d56", + "dweb:/ipfs/QmR3zpd7wNw3rcUdekwiv6FYHJqksuTCXLVioTxu6Fbxk3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1", + "license": "MIT", + "urls": [ + "bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269", + "dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "license": "MIT", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f0200000200000000000000000000000000000000000000000000000000000000d428b3d22b9d43b26182a61bca7ec11e0198c7cd6599abee921a4f1b32fb5aa2", + "deployedBytecode": "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f0200000200000000000000000000000000000000000000000000000000000000d428b3d22b9d43b26182a61bca7ec11e0198c7cd6599abee921a4f1b32fb5aa2", + "devdoc": { + "errors": { + "MagicSwapV2WrongAmounts()": [ + { + "details": "Amounts does not match" + } + ], + "UnsupportedNft()": [ + { + "details": "Trying to interact with token that does not support ERC721 nor ERC1155" + } + ] + }, + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vault": "vault data of deposited NFTs" + } + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vault": "vault data of withdrawn NFTs" + } + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vaultA": "vault data of deposited NFTs for first side", + "vaultB": "vault data of deposited NFTs for second side" + } + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vaultA": "vault data of withdrawn NFTs for first side", + "vaultB": "vault data of withdrawn NFTs for second side" + } + } + }, + "kind": "dev", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountBDesired": "desired amount of token B to be added as liquidity", + "_amountBMin": "minimum amount of token B to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "desired amount of ETH to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountETH": "amount of ETH added as liquidity", + "amountToken": "amount of vault token added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "details": "All NFTs must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be deposited", + "_amountBMin": "minimum amount of token B to be deposited", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to deposit as liquidity for first side", + "_vaultB": "vault data for NFTs to deposit as liquidity for second side" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to deposit. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to deposit", + "_to": "address that gets ERC20 for deposited NFTs", + "_tokenId": "list of token IDs to deposit", + "_vault": "address of the vault where NFTs are deposited" + }, + "returns": { + "amountMinted": "amount of ERC20 minted for deposited NFTs" + } + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to Token B", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "minimum amount of ETH to be redeemed", + "_amountTokenMin": "minimum amount of vault token to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to ETH", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountETH": "amount of ETH redeemed", + "amountToken": "amount of vault token redeemed" + } + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "details": "Lp token must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to withdraw from liquidity for first side", + "_vaultB": "vault data for NFTs to withdraw from liquidity for second side" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "details": "Does not require any approvals. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for ETH. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to receive for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for ETH. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of ETH expected after swap", + "_collection": "list of NFT addresses to swap for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets ETH", + "_tokenId": "list of token IDs to swap for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "details": "All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn` as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.", + "params": { + "_amountIn": "list of input token amounts. For ERC721 amount is always 1.", + "_amountOut": "list of output token amounts. For ERC721 amount is always 1.", + "_collectionIn": "list of input NFT addresses", + "_collectionOut": "list of output NFT addresses", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenIdIn": "list of input token IDs", + "_tokenIdOut": "list of output token IDs" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for token. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of output token expected after swap", + "_collection": "list of NFT addresses to swap for token", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets output token", + "_tokenId": "list of token IDs to swap for token" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "ERC20 must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for tokens. For ERC721 amount is always 1.", + "_amountInMax": "maximum acceptable amount of token to swap for NFTs", + "_collection": "list of NFT addresses to receive for tokens", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for tokens" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "withdrawVault(address[],uint256[],uint256[],address,address)": { + "details": "Withdraw NFTs from vaultVault token must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to withdraw. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to withdraw", + "_to": "address that gets withdrawn NFTs", + "_tokenId": "list of token IDs to withdraw", + "_vault": "address of the vault to withdraw NFTs from" + }, + "returns": { + "amountBurned": "amount of ERC20 redeemed for NFTs" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is added" + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is removed" + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is added" + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is removed" + } + }, + "kind": "user", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and second ERC20 token" + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and ETH" + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using two NFT vaults" + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "notice": "Deposit NFTs to vault" + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ERC20 token" + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ETH" + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs" + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap ETH for NFTs" + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ETH" + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap NFTs for NFTs" + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ERC20" + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap ERC20 for NFTs" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + }, + "factoryDeps": [ + "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f0200000200000000000000000000000000000000000000000000000000000000d428b3d22b9d43b26182a61bca7ec11e0198c7cd6599abee921a4f1b32fb5aa2" + ] +} \ No newline at end of file diff --git a/deployments/treasureTopaz/NftVaultFactory.json b/deployments/treasureTopaz/NftVaultFactory.json new file mode 100644 index 0000000..ddab252 --- /dev/null +++ b/deployments/treasureTopaz/NftVaultFactory.json @@ -0,0 +1,1399 @@ +{ + "address": "0x657c165eE78429c71D7D6d7dE6c0dBe39aD30817", + "abi": [ + { + "inputs": [], + "name": "VaultAlreadyDeployed", + "type": "error" + }, + { + "inputs": [], + "name": "VaultDoesNotExist", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": true, + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "vaultId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct INftVault.CollectionData[]", + "name": "collections", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "creator", + "type": "address" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllVaults", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getVaultAt", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVaultLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "hashVault", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVault", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "vaultHashMap", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "name": "vaultIdMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xd40fa1f5898b1073434573eb3954d916f93ff63a44a5fb284448ea3fcbd43658", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0x657c165eE78429c71D7D6d7dE6c0dBe39aD30817", + "transactionIndex": 0, + "gasUsed": "112835", + "logsBloom": "0x00000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000000000000000000000240000000008000040000000000000000000000000000000080400000100000000000000000000000000000000000000000000000010000000000000000000000000000004000000080000000100000000000000400000000000000000000000100000000000800000000000000000000000002000010000000000000002008000000000000000000000000000000100000000000000000000000200000000010000000000000000000000000000000000000000000000000000", + "blockHash": "0xb3f9d033ebb86b423c14b8885792847d69bcfff9ff6fad023def3253deedbed6", + "transactionHash": "0xd40fa1f5898b1073434573eb3954d916f93ff63a44a5fb284448ea3fcbd43658", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 1643, + "transactionHash": "0xd40fa1f5898b1073434573eb3954d916f93ff63a44a5fb284448ea3fcbd43658", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x00000000000000000000000000000000000000000000000000000bb7d9cfed06", + "logIndex": 0, + "blockHash": "0xb3f9d033ebb86b423c14b8885792847d69bcfff9ff6fad023def3253deedbed6" + }, + { + "transactionIndex": 0, + "blockNumber": 1643, + "transactionHash": "0xd40fa1f5898b1073434573eb3954d916f93ff63a44a5fb284448ea3fcbd43658", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x0000000000000000000000000000000000000000000000000000027bb2c9b6f4", + "logIndex": 1, + "blockHash": "0xb3f9d033ebb86b423c14b8885792847d69bcfff9ff6fad023def3253deedbed6" + }, + { + "transactionIndex": 0, + "blockNumber": 1643, + "transactionHash": "0xd40fa1f5898b1073434573eb3954d916f93ff63a44a5fb284448ea3fcbd43658", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x010001db5d767185714cc92b45e71aa204d217485b14dabe76b1c480a7f435a5", + "0x000000000000000000000000657c165ee78429c71d7d6d7de6c0dbe39ad30817" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0xb3f9d033ebb86b423c14b8885792847d69bcfff9ff6fad023def3253deedbed6" + }, + { + "transactionIndex": 0, + "blockNumber": 1643, + "transactionHash": "0xd40fa1f5898b1073434573eb3954d916f93ff63a44a5fb284448ea3fcbd43658", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x000000000000000000000000000000000000000000000000000003af35da1281", + "logIndex": 3, + "blockHash": "0xb3f9d033ebb86b423c14b8885792847d69bcfff9ff6fad023def3253deedbed6" + } + ], + "blockNumber": 1643, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 3, + "solcInputHash": "29575f9c42d79da7d15102bbf5192733", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "name": "VaultAlreadyDeployed", + "type": "error" + }, + { + "inputs": [], + "name": "VaultDoesNotExist", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": true, + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "vaultId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct INftVault.CollectionData[]", + "name": "collections", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "creator", + "type": "address" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllVaults", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getVaultAt", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVaultLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "hashVault", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVault", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "vaultHashMap", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "name": "vaultIdMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "VaultAlreadyDeployed()": [ + { + "details": "Vault with identical configuration is already deployed" + } + ], + "VaultDoesNotExist()": [ + { + "details": "Vault does not exist" + } + ] + }, + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "params": { + "collections": "configuration used for vault creation", + "creator": "address of vault creator", + "name": "vault's name", + "symbol": "vault's name", + "vault": "vault's address as INftVault", + "vaultId": "vault's index in `vaults` AddressSet" + } + } + }, + "kind": "dev", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "details": "If vault already exists, function reverts", + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address of deployed vault" + } + }, + "exists((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "true if vault with given config exists" + } + }, + "getAllVaults()": { + "returns": { + "_0": "all deployed vaults" + } + }, + "getVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address" + } + }, + "getVaultAt(uint256)": { + "params": { + "index": "vaultId or index in NftVaultFactory.vaults array" + }, + "returns": { + "_0": "vault address" + } + }, + "getVaultLength()": { + "returns": { + "_0": "length of vault's EnumerableSet" + } + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "config hash" + } + }, + "isVault(address)": { + "params": { + "vault": "address" + }, + "returns": { + "_0": "true if vault is deployed by the factory" + } + } + }, + "stateVariables": { + "vaultHashMap": { + "params": { + "hash": "vault's config hash" + }, + "return": "address", + "returns": { + "_0": "address" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "notice": "Emitted when new vault is deployed" + } + }, + "kind": "user", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "notice": "Create new vault" + }, + "exists((address,uint8,bool,uint256[])[])": { + "notice": "Returns true if vault with given config exists" + }, + "getVault((address,uint8,bool,uint256[])[])": { + "notice": "Get vault by it's config" + }, + "getVaultAt(uint256)": { + "notice": "Get vault by its EnumerableSet vaultId" + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "notice": "Get config hash" + }, + "isVault(address)": { + "notice": "Returns true if vault has been deployed by factory" + }, + "vaultHashMap(bytes32)": { + "notice": "Get vault by its config hash" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Vault/NftVaultFactory.sol": "NftVaultFactory" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Vault/INftVault.sol": { + "keccak256": "0x1b55813c809306ff889c9a07ea9aae68a4267568b5d09226096779b2bc8f552c", + "license": "MIT", + "urls": [ + "bzz-raw://a890283e8f67d5c2d8ff78486e4d2c214587aac76dd941f5d0a3a7a1b02b2280", + "dweb:/ipfs/QmUBhfyiit6VHerjJGmQL2q9C3P3XiX1gjv97jVx37qn6v" + ] + }, + "contracts/Vault/INftVaultFactory.sol": { + "keccak256": "0x48b76dac0e86e80a6c31e9566a42445b82c30b5bb184a0f70badeb1ac4448c20", + "license": "MIT", + "urls": [ + "bzz-raw://6bc21cf0dd88cb6ca4a990513c0f88010a2b8745a6f3bceff9a8e55fe822ddca", + "dweb:/ipfs/QmU3UFqt2aU8W8MSBQznzGMT6Mh3jTGcvxZrKjBdrYB8yG" + ] + }, + "contracts/Vault/NftVault.sol": { + "keccak256": "0xfcc3dc2246c4519105987c2c55330caa44fd280bf12b9e17769cfb2d44d3af30", + "license": "MIT", + "urls": [ + "bzz-raw://92e5cc716c130e5ea8948a1d67d2c66967f05a59320bbdcd1e2f7d1b1178bd67", + "dweb:/ipfs/QmdyPtrKpLUNA9auRcweLK33EeBHammReNft4xEA56wfC8" + ] + }, + "contracts/Vault/NftVaultFactory.sol": { + "keccak256": "0x30fb7e6ba0a7016ba9d745883b070c96645e7e2af429e3435bf812dfae03881a", + "license": "MIT", + "urls": [ + "bzz-raw://755d95704a415d732c996a54a239821ad262f0b54c7846ec090b0599634c639f", + "dweb:/ipfs/QmWC2wg75hEYuDa3ATLitL5xM1zvLJawbTCkRpSnHfxNUK" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673", + "license": "MIT", + "urls": [ + "bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2", + "dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "keccak256": "0x5c879356795cc563440408404a52eaf672d4547949e0a5920fb17642303d9e1b", + "license": "MIT", + "urls": [ + "bzz-raw://fb210cdef017f9813af368e17ea1573bc26094dd8dba8b5db8bec4cc90883d0a", + "dweb:/ipfs/QmdixQwckiNVVWHaJD9ps5ALWsHkZGRAePkuUPw1ZhhJhM" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "keccak256": "0x6392f2cfe3a5ee802227fe7a2dfd47096d881aec89bddd214b35c5b46d3cd941", + "license": "MIT", + "urls": [ + "bzz-raw://bd9c47a375639888e726a99da718890ba16d17d7ad9eacb0ccc892d46d1b3ee0", + "dweb:/ipfs/Qmb41W5RUjy2sWg49A2rMnxekSeEk6SvGyJL5tyCCSr7un" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "keccak256": "0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b", + "license": "MIT", + "urls": [ + "bzz-raw://0e28648f994abf1d6bc345644a361cc0b7efa544f8bc0c8ec26011fed85a91ec", + "dweb:/ipfs/QmVVE7AiRjKaQYYji7TkjmTeVzGpNmms5eoxqTCfvvpj6D" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "keccak256": "0x2e024ca51ce5abe16c0d34e6992a1104f356e2244eb4ccbec970435e8b3405e3", + "license": "MIT", + "urls": [ + "bzz-raw://a74009db3c6fc8db851ba69ddb6795b5c1ef1120c5a00fd1a8dc3a717dd9d519", + "dweb:/ipfs/QmZMk8Yh2X3gPS51ckUVLEXjZUhMSEeGApnA53WtjvLb9h" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "keccak256": "0x3dd5e1a66a56f30302108a1da97d677a42b1daa60e503696b2bcbbf3e4c95bcb", + "license": "MIT", + "urls": [ + "bzz-raw://0808de0ae4918c664643c885ca7fa6503e8ef2bd75609dfc85152c0128a3422d", + "dweb:/ipfs/QmNrhFC1XgBKuuxfahFeiwi1MCdu3FLNpHj2uStgmf4iJj" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "keccak256": "0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d", + "license": "MIT", + "urls": [ + "bzz-raw://15f52f51413a9de1ff191e2f6367c62178e1df7806d7880fe857a98b0b66253d", + "dweb:/ipfs/QmaQG1fwfgUt5E9nu2cccFiV47B2V78MM1tCy1qB7n4MsH" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "keccak256": "0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca", + "license": "MIT", + "urls": [ + "bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd", + "dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68", + "license": "MIT", + "urls": [ + "bzz-raw://daae589a9d6fa7e55f99f86c0a16796ca490f243fb3693632c3711c0646c1d56", + "dweb:/ipfs/QmR3zpd7wNw3rcUdekwiv6FYHJqksuTCXLVioTxu6Fbxk3" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "keccak256": "0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da", + "license": "MIT", + "urls": [ + "bzz-raw://6e75cf83beb757b8855791088546b8337e9d4684e169400c20d44a515353b708", + "dweb:/ipfs/QmYvPafLfoquiDMEj7CKHtvbgHu7TJNPSVPSCjrtjV8HjV" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "keccak256": "0x0108bf6a6ebd5f96678bed33a35947537263f96766131ee91461fb6485805028", + "license": "MIT", + "urls": [ + "bzz-raw://ae2d274bf3d56a6d49a9bbd0a4871c54997a82551eb3eb1c0c39dc98698ff8bf", + "dweb:/ipfs/QmTT7ty5DPGAmRnx94Xu3TUDYGSPDVLN2bppJAjjedrg1e" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1", + "license": "MIT", + "urls": [ + "bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269", + "dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", + "license": "MIT", + "urls": [ + "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", + "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "keccak256": "0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a", + "license": "MIT", + "urls": [ + "bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634", + "dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "keccak256": "0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b", + "license": "MIT", + "urls": [ + "bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d", + "dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "keccak256": "0x0812bc73d6e30558840122fa48d6f64ae978ccc1b1fc42e616bac190c6360f46", + "license": "MIT", + "urls": [ + "bzz-raw://3d95a53b7e19ca1d46043eaad8967b6e0b02aab2b5fefc2108bfa6d1ad425f5b", + "dweb:/ipfs/QmQq7AUGT9juE3hun2Wy7r2BDoDBFdBn43DVwhJpK2StLV" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "license": "MIT", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "keccak256": "0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6", + "license": "MIT", + "urls": [ + "bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b", + "dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "keccak256": "0x5094b17cb46143943f3206d0738b91a05a7005e979681af7210d534cd3e72f54", + "license": "MIT", + "urls": [ + "bzz-raw://a55fbc9ee8080ec3b397e8e32e5dafcff2c377ce44d553bfc93dfce1be2d5b12", + "dweb:/ipfs/QmYSk6bNHnpKRyNWXmEBKbkPxXi7Hco9JZHHyxMdrZGWpb" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0xc3ff3f5c4584e1d9a483ad7ced51ab64523201f4e3d3c65293e4ca8aeb77a961", + "license": "MIT", + "urls": [ + "bzz-raw://d7d3dd6067a994690471b5fc71b6f81fac3847798b37d404f74db00b4d3c3d0e", + "dweb:/ipfs/QmRHF1RarifjNi93RttouNPkYZGyu6CD926PgRDzD5iL35" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252", + "deployedBytecode": "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252", + "devdoc": { + "errors": { + "VaultAlreadyDeployed()": [ + { + "details": "Vault with identical configuration is already deployed" + } + ], + "VaultDoesNotExist()": [ + { + "details": "Vault does not exist" + } + ] + }, + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "params": { + "collections": "configuration used for vault creation", + "creator": "address of vault creator", + "name": "vault's name", + "symbol": "vault's name", + "vault": "vault's address as INftVault", + "vaultId": "vault's index in `vaults` AddressSet" + } + } + }, + "kind": "dev", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "details": "If vault already exists, function reverts", + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address of deployed vault" + } + }, + "exists((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "true if vault with given config exists" + } + }, + "getAllVaults()": { + "returns": { + "_0": "all deployed vaults" + } + }, + "getVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address" + } + }, + "getVaultAt(uint256)": { + "params": { + "index": "vaultId or index in NftVaultFactory.vaults array" + }, + "returns": { + "_0": "vault address" + } + }, + "getVaultLength()": { + "returns": { + "_0": "length of vault's EnumerableSet" + } + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "config hash" + } + }, + "isVault(address)": { + "params": { + "vault": "address" + }, + "returns": { + "_0": "true if vault is deployed by the factory" + } + } + }, + "stateVariables": { + "vaultHashMap": { + "params": { + "hash": "vault's config hash" + }, + "return": "address", + "returns": { + "_0": "address" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "notice": "Emitted when new vault is deployed" + } + }, + "kind": "user", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "notice": "Create new vault" + }, + "exists((address,uint8,bool,uint256[])[])": { + "notice": "Returns true if vault with given config exists" + }, + "getVault((address,uint8,bool,uint256[])[])": { + "notice": "Get vault by it's config" + }, + "getVaultAt(uint256)": { + "notice": "Get vault by its EnumerableSet vaultId" + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "notice": "Get config hash" + }, + "isVault(address)": { + "notice": "Returns true if vault has been deployed by factory" + }, + "vaultHashMap(bytes32)": { + "notice": "Get vault by its config hash" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 35668, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "vaults", + "offset": 0, + "slot": "0", + "type": "t_struct(AddressSet)89493_storage" + }, + { + "astId": 35673, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "vaultHashMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_contract(INftVault)34603)" + }, + { + "astId": 35678, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "vaultIdMap", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_contract(INftVault)34603,t_uint256)" + } + ], + "types": { + "t_array(t_bytes32)dyn_storage": { + "base": "t_bytes32", + "encoding": "dynamic_array", + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(INftVault)34603": { + "encoding": "inplace", + "label": "contract INftVault", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_contract(INftVault)34603)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => contract INftVault)", + "numberOfBytes": "32", + "value": "t_contract(INftVault)34603" + }, + "t_mapping(t_bytes32,t_uint256)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_contract(INftVault)34603,t_uint256)": { + "encoding": "mapping", + "key": "t_contract(INftVault)34603", + "label": "mapping(contract INftVault => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(AddressSet)89493_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "astId": 89492, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "_inner", + "offset": 0, + "slot": "0", + "type": "t_struct(Set)89178_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)89178_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.Set", + "members": [ + { + "astId": 89173, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "_values", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 89177, + "contract": "contracts/Vault/NftVaultFactory.sol:NftVaultFactory", + "label": "_indexes", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_uint256)" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + }, + "factoryDeps": [ + "0x00020000000000020010000000000002000000000e01034f00010000000e035500000000010e0019000000600110027000000632031001970000000100200190000000570000c13d0000008002000039000000400020043f000000040030008c00000dd20000413d00000000010e043b000000e0011002700000063b0010009c000001250000213d000006530010009c000001340000213d0000065f0010009c000001890000213d000006650010009c0000026b0000213d000006680010009c000003f90000613d000006690010009c00000dd20000c13d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000010001000039000000400010043f000000800000043f000000a00000043f000000c00000043f0000006001000039000000e00010043f0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c000006430000613d000000000001004b00000dd40000c13d000b00000001001d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b0000000b01000029000006430000c13d000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000006910000013d000000c002000039000000400020043f0000000001000416000000000001004b00000dd20000c13d0000001f013000390000063301100197000000c001100039000000400010043f0000001f0430018f0000063405300198000000c001500039000000690000613d00000000060e034f000000006706043c0000000002720436000000000012004b000000650000c13d000000000004004b000000760000613d00000000025e034f0000000304400210000000000501043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f0000000000210435000000400030008c00000dd20000413d000000c00400043d000006350040009c00000dd20000213d0000001f01400039000000000031004b000000000200001900000636020080410000063601100197000000000001004b00000000050000190000063605004041000006360010009c000000000502c019000000000005004b00000dd20000c13d000000c0014000390000000002010433000006350020009c000005930000213d0000001f01200039000006a8011001970000003f01100039000006a801100197000000400600043d0000000005160019000000000065004b00000000010000390000000101004039000006350050009c000005930000213d0000000100100190000005930000c13d000000c001300039000000400050043f000c00000006001d0000000005260436000b00000005001d000000e0044000390000000005420019000000000015004b00000dd20000213d000000000002004b0000000b08000029000000ac0000613d000000000500001900000000065800190000000007450019000000000707043300000000007604350000002005500039000000000025004b000000a50000413d0000000c0220002900000020022000390000000000020435000000e00400043d000006350040009c00000dd20000213d0000001f02400039000000000032004b000000000300001900000636030080410000063602200197000000000002004b00000000050000190000063605004041000006360020009c000000000503c019000000000005004b00000dd20000c13d000000c0024000390000000002020433000006350020009c000005930000213d0000001f03200039000006a8033001970000003f03300039000006a803300197000000400600043d0000000003360019000000000063004b00000000050000390000000105004039000006350030009c000005930000213d0000000100500190000005930000c13d000000400030043f000a00000006001d0000000003260436000900000003001d000000e0034000390000000004320019000000000014004b00000dd20000213d000000000002004b0000000906000029000000e20000613d000000000100001900000000041600190000000005310019000000000505043300000000005404350000002001100039000000000021004b000000db0000413d0000000a01200029000000200110003900000000000104350000000c010000290000000004010433000006350040009c000005930000213d0000000303000039000000000103041a000000010210019000000001051002700000007f0550618f0000001f0050008c00000000010000390000000101002039000000000012004b000005d50000c13d000700000005001d000000200050008c000800000004001d000001130000413d000000000030043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d00000008040000290000001f024000390000000502200270000000200040008c0000000002004019000000000301043b00000007010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b0000000303000039000001130000813d000000000002041b0000000102200039000000000012004b0000010f0000413d0000001f0040008c000007120000a13d000000000030043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000200200008a0000000802200180000000000101043b000007dc0000c13d0000002003000039000007e90000013d0000063c0010009c000001730000213d000006480010009c0000019c0000213d0000064e0010009c0000027e0000213d000006510010009c0000040a0000613d000006520010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000501000039000005df0000013d000006540010009c000001ad0000213d0000065a0010009c0000031c0000213d0000065d0010009c000004110000613d0000065e0010009c00000dd20000c13d000000640030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d0000066a0010009c00000dd20000213d0000004401e00370000000000101043b000a00000001001d0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b00000000020004110000066a02200197000900000002001d000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000006a90010009c000006890000c13d0000000c010000290000000b020000290000000a0300002918c317bf0000040f0000062b0000013d0000063d0010009c0000024d0000213d000006430010009c0000034d0000213d000006460010009c000004180000613d000006470010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000201043b0000066a0020009c00000dd20000213d0000002401e00370000000000301043b000000000100041118c317bf0000040f0000027c0000013d000006600010009c000003b80000213d000006630010009c000004570000613d000006640010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b18c3123d0000040f000005fa0000013d000006490010009c000003c10000213d0000064c0010009c0000046a0000613d0000064d0010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000001000412001000000001001d000f00200000003d000080050100003900000044030000390000000004000415000000100440008a000005570000013d000006550010009c000003cc0000213d000006580010009c000005040000613d000006590010009c00000dd20000c13d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000dd20000213d000000000005004b000001e00000613d000000800500003900000000062e034f000000000606043b0000066a0060009c00000dd20000213d000000200550003900000000006504350000002002200039000000000042004b000001d70000413d0000004402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000700000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000706000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000002130000613d000000070400002900000000062e034f000000000606043b000000200440003900000000006404350000002002200039000000000052004b0000020c0000413d0000006402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000400000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000406000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000002460000613d000000040300002900000000042e034f000000000404043b000000200330003900000000004304350000002002200039000000000052004b0000023f0000413d000000800200043d000000000002004b000800000000001d00000a310000c13d000000400100043d00000008020000290000062d0000013d0000063e0010009c000003df0000213d000006410010009c0000054d0000613d000006420010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d000000000010043f0000000a01000039000000200010043f00000040020000390000000001000019000c0000000e035318c3188b0000040f0000000c0200035f0000002402200370000000000202043b000000000020043f000000200010043f00000000010000190000004002000039000003dd0000013d000006660010009c0000055d0000613d000006670010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000201043b0000066a0020009c00000dd20000213d0000002401e00370000000000301043b000000000100041118c318330000040f0000000101000039000005fa0000013d0000064f0010009c0000057d0000613d000006500010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d000000010010008c00000dd20000213d0000004401e00370000000000101043b000a00000001001d0000066a0010009c00000dd20000213d0000006401e00370000000000101043b000900000001001d0000000a01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000002b90000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000002db0000613d0000000a01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000202100039000000000202041a000000ff002001900000070a0000c13d0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff001001900000070a0000c13d0000000b0000006b0000072b0000c13d0000067b0100004100000000001004430000000a0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400300043d00000044013000390000000902000029000000000021043500000024013000390000000c0200002900000000002104350000068001000041000000000013043500000000010004100000066a01100197000c00000003001d0000000402300039000000000012043500000000010004140000000a02000029000000040020008c000007860000613d0000000c02000029000006320020009c00000632020080410000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000a0200002918c318b90000040f00000000030100190000006003300270000006320030019d0000000100200190000007860000c13d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000003170000c13d000008ea0000013d0000065b0010009c000005990000613d0000065c0010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a00000024020000390000000102200367000000000202043b000000000012001a00000de10000413d0000000003120019000006280000013d000006440010009c000005a00000613d000006450010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000004401e00370000000000101043b000006350010009c00000dd20000213d0000002304100039000000000034004b00000dd20000813d000000040410003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024011000390000000004140019000000000034004b00000dd20000213d000000000005004b0000037f0000613d00000000051e034f000000000505043b000000200220003900000000005204350000002001100039000000000041004b000003780000413d0000006401e00370000000000101043b000006350010009c00000dd20000213d0000002302100039000000000032004b000000000400001900000636040080410000063602200197000000000002004b00000000050000190000063605004041000006360020009c000000000504c019000000000005004b00000dd20000c13d000000040210003900000000022e034f000000000402043b000006350040009c000005930000213d00000005054002100000003f025000390000066f06200197000000400200043d0000000006620019000000000026004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f000000000042043500000024011000390000000005150019000000000035004b00000dd20000213d000000000004004b000003af0000613d00000000041e034f000000000404043b000000200220003900000000004204350000002001100039000000000051004b000003a80000413d0000008401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f0000067101000041000005fa0000013d000006610010009c000005b00000613d000006620010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000201000039000005df0000013d0000064a0010009c000005c60000613d0000064b0010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ef70000040f18c30f9a0000040f000005fa0000013d000006560010009c000005db0000613d000006570010009c00000dd20000c13d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d000000000010043f000000200000043f0000004002000039000000000100001918c3188b0000040f000005df0000013d0000063f0010009c000005e30000613d000006400010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000008401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f0000066b01000041000005fa0000013d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000006a50010019800000dd20000c13d000006a60010009c00000000020000390000000102006039000006a70010009c00000001022061bf000000800020043f0000066d01000041000018c40001042e0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ee30000040f18c315a20000040f000005fa0000013d0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ee30000040f18c313720000040f000005fa0000013d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0000000b0310006c000006280000813d000000400100043d00000064021000390000067303000041000000000032043500000044021000390000067403000041000000000032043500000024021000390000002503000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c500010430000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000302043b0000000002030019000000010030008c00000dd20000213d000c00000002001d18c310010000040f000000400100043d0000000c020000290000062d0000013d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000dd20000213d000000000005004b000004970000613d000000800500003900000000062e034f000000000606043b0000066a0060009c00000dd20000213d000000200550003900000000006504350000002002200039000000000042004b0000048e0000413d0000004402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000600000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000606000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000004ca0000613d000000060400002900000000062e034f000000000606043b000000200440003900000000006404350000002002200039000000000052004b000004c30000413d0000006402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000200000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000206000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000004fd0000613d000000020300002900000000042e034f000000000404043b000000200330003900000000004304350000002002200039000000000052004b000004f60000413d000000800200043d000000000002004b000700000000001d00000c1a0000c13d000000400100043d00000007020000290000062d0000013d0000000001000416000000000001004b00000dd20000c13d0000000601000039000000000101041a000006350010009c000005930000213d00000005041002100000003f024000390000066f02200197000006700020009c000005930000213d0000008002200039000000400020043f000000800010043f0000001f0240018f000000000004004b0000051d0000613d00000000033e034f000000a004400039000000a005000039000000003603043c0000000005650436000000000045004b000005190000c13d000000000002004b000000800400043d000000000004004b000005330000613d00000008020000390000000003000019000000000031004b00000dda0000a13d0000068d0530009a000000000505041a000000000050043f000000200020043f000000000034004b00000dda0000a13d0000066a045001970000000505300210000000a00550003900000000004504350000000103300039000000800400043d000000000043004b000005230000413d000000400100043d00000020020000390000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005440000613d00000080040000390000000005000019000000200440003900000000060404330000066a0660019700000000026204360000000105500039000000000035004b0000053d0000413d0000000002120049000006320020009c00000632020080410000006002200210000006320010009c00000632010080410000004001100210000000000112019f000018c40001042e0000000001000416000000000001004b00000dd20000c13d0000000001000412000e00000001001d000d00000000003d0000800501000039000000440300003900000000040004150000000e0440008a00000005044002100000066e0200004118c318a00000040f000000800010043f0000066d01000041000018c40001042e0000000001000416000000000001004b00000dd20000c13d0000000303000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f0000000100600190000005d50000c13d000000800010043f000000000005004b000006040000613d000000000030043f000000020020008c0000000002000019000006170000413d000006a3030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b000005750000413d000006170000013d000000240130008c00000dd20000413d0000000002000416000000000002004b00000dd20000c13d0000000402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000704043b000006350070009c000005930000213d00000005067002100000003f046000390000066f04400197000006700040009c000006330000a13d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000416000000000001004b00000dd20000c13d0000001201000039000000800010043f0000066d01000041000018c40001042e000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b18c311f30000040f000000000001004b0000000001000039000000010100c039000005fa0000013d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000006401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f000006a201000041000005fa0000013d0000000001000416000000000001004b00000dd20000c13d0000000403000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f0000000100600190000006010000613d0000069b01000041000000000010043f0000002201000039000000040010043f0000069601000041000018c5000104300000000001000416000000000001004b00000dd20000c13d0000000601000039000000000101041a000000800010043f0000066d01000041000018c40001042e000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000c00000002001d0000066a0020009c00000dd20000213d000000000010043f0000000101000039000000200010043f0000004002000039000000000100001918c3188b0000040f0000000c0200002918c30f8a0000040f000000000101041a000000400200043d0000000000120435000006320020009c000006320200804100000040012002100000066c011001c7000018c40001042e000000800010043f000000000005004b0000060a0000c13d000006aa01200197000000a00010043f000000000004004b00000020020000390000000002006039000006170000013d000000000030043f000000020020008c0000000002000019000006170000413d00000677030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b000006100000413d0000002002200039000000800100003918c30e880000040f000000400100043d000c00000001001d000000800200003918c30e730000040f0000000c020000290000000001210049000006320010009c00000632010080410000006001100210000006320020009c00000632020080410000004002200210000000000121019f000018c40001042e00000000010004110000000c0200002918c318330000040f000000400100043d00000001020000390000000000210435000006320010009c000006320100804100000040011002100000066c011001c7000018c40001042e0000008004400039000000400040043f000000800070043f00000024052000390000000006560019000000000036004b00000dd20000213d000000000007004b0000069c0000c13d00000692010000410000000000140435000006320040009c000006320400804100000040014002100000067f011001c7000018c500010430000b00000001001d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000201100039000000000101041a000a00000001001d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000400400043d000006700040009c000005930000213d0000000a02000029000000ff00200190000000000101043b0000008002400039000000400020043f0000000002000039000000010200c0390000004003400039000000000023043500000020024000390000000b0300002900000000003204350000000c02000029000a00000004001d00000000002404350000000101100039000000000301041a000000400200043d000c00000002001d000b00000003001d0000000002320436000900000002001d000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d0000000b0000006b000007be0000c13d0000000904000029000007c80000013d0008000a00100074000006fe0000813d000000400100043d0000004402100039000006a103000041000000000032043500000024021000390000001d03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000008004000039000006a50000013d00000020044000390000006009700039000000000089043500000000007404350000002005500039000000000065004b0000083d0000813d00000000075e034f000000000707043b000006350070009c00000dd20000213d00000000082700190000000007810049000006880070009c00000dd20000213d000000800070008c00000dd20000413d000000400700043d000006700070009c000005930000213d0000008009700039000000400090043f0000002409800039000000000a9e034f000000000a0a043b0000066a00a0009c00000dd20000213d000000000aa704360000002009900039000000000b9e034f000000000b0b043b0000000100b0008c00000dd20000213d0000000000ba04350000002009900039000000000a9e034f000000000a0a043b00000000000a004b000000000b000039000000010b00c0390000000000ba004b00000dd20000c13d000000400b7000390000000000ab0435000000200990003900000000099e034f000000000909043b000006350090009c00000dd20000213d00000000098900190000004308900039000000000038004b000000000a000019000006360a0080410000063608800197000000000008004b000000000b000019000006360b004041000006360080009c000000000b0ac01900000000000b004b00000dd20000c13d000000240890003900000000088e034f000000000a08043b0000063500a0009c000005930000213d000000050ba002100000003f08b000390000066f0c800197000000400800043d000000000cc8001900000000008c004b000000000d000039000000010d0040390000063500c0009c000005930000213d0000000100d00190000005930000c13d0000004000c0043f0000000000a804350000004409900039000000000a9b001900000000003a004b00000dd20000213d0000000000a9004b0000069e0000813d000000000b080019000000000c9e034f000000000c0c043b000000200bb000390000000000cb043500000020099000390000000000a9004b000006f60000413d0000069e0000013d0000000c0000006b0000071f0000c13d000000400100043d00000064021000390000069f0300004100000000003204350000004402100039000006a0030000410000000000320435000000240210003900000024030000390000044c0000013d000000400100043d00000687020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c500010430000000080000006b0000000001000019000007170000613d0000000b01000029000000000101043300000008040000290000000302400210000006a90220027f000006a902200167000000000121016f0000000102400210000000000121019f000007f70000013d000000090000006b0000078d0000c13d000000400100043d00000064021000390000069d03000041000000000032043500000044021000390000069e030000410000000000320435000000240210003900000022030000390000044c0000013d000000400100043d000b00000001001d0000067a0010009c000005930000213d0000000b020000290000002001200039000800000001001d000000400010043f00000000000204350000067b0100004100000000001004430000000a0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400400043d0000067d01000041000000000014043500000084010000390000000101100367000000000101043b0000008402400039000000a00300003900000000003204350000006402400039000000000012043500000044014000390000000902000029000000000021043500000024014000390000000c02000029000000000021043500000000010004100000066a01100197000000040240003900000000001204350000000b010000290000000001010433000000a4024000390000000000120435000c00000004001d000000c402400039000000000001004b00000008060000290000076a0000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000007630000413d0000000002210019000000000002043500000000020004140000000a03000029000000040030008c000007860000613d0000001f01100039000006a801100197000000c401100039000006320010009c000006320100804100000060011002100000000c03000029000006320030009c00000632030080410000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000112019f0000000a0200002918c318b90000040f00000000030100190000006003300270000006320030019d0000000100200190000008de0000613d0000000c01000029000006350010009c000005930000213d0000000c01000029000000400010043f0000000001000019000018c40001042e0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000802000029000000000021041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d0200003900000003030000390000069c040000410000000c05000029000000090600002918c318b90000040f00000001002001900000016e0000c13d00000dd20000013d000000000101043b000000000200001900000009040000290000000b05000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000007c20000413d0000000c0140006a0000001f01100039000006a8021001970000000c01200029000000000021004b00000000030000390000000103004039000006350010009c0000000a02000029000005930000213d0000000100300190000005930000c13d000000400010043f00000060012000390000000c030000290000000000310435000000400100043d000c00000001001d18c30e490000040f0000061e0000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000c0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000007e20000c13d000000080020006c000007f40000813d00000008020000290000000302200210000000f80220018f000006a90220027f000006a9022001670000000c033000290000000003030433000000000223016f000000000021041b0000000801000029000000010110021000000001011001bf0000000302000039000000000012041b0000000a010000290000000001010433000c00000001001d000006350010009c000005930000213d0000000401000039000000000101041a000000010010019000000001021002700000007f0220618f000b00000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000005d50000c13d0000000b01000029000000200010008c000008290000413d0000000401000039000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d0000000c030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b0000000b010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b000008290000813d000000000002041b0000000102200039000000000012004b000008250000413d0000000c010000290000001f0010008c000008780000a13d0000000401000039000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000200200008a0000000c02200180000000000101043b000008860000c13d0000002003000039000008930000013d000000400400043d000000800100043d000000000001004b0000063c0000613d0000000601000039000000000101041a000000000001004b000008840000c13d0000002001400039000000200200003900000000002104350000004002400039000000800300043d0000000000320435000000600540003900000005023002100000000002520019000000000003004b000008b20000c13d0000000002420049000000200320008a00000000003404350000001f02200039000006a8032001970000000002430019000000000032004b00000000030000390000000103004039000006350020009c000005930000213d0000000100300190000005930000c13d000000400020043f000006320010009c000006320100804100000040011002100000000002040433000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000502000039000000000012041b000000800100043d000000000001004b000008fd0000c13d0000000001000019000018c40001042e0000000c0000006b00000000010000190000087d0000613d000000090100002900000000010104330000000c040000290000000302400210000006a90220027f000006a902200167000000000221016f0000000101400210000008a10000013d00000689010000410000063d0000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000a0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b0000088c0000c13d0000000c0020006c0000089e0000813d0000000c020000290000000302200210000000f80220018f000006a90220027f000006a9022001670000000a033000290000000003030433000000000223016f000000000021041b00000001010000390000000c020000290000000102200210000000000112019f0000000402000039000000000012041b0000063801000041000000800010043f0000063902000041000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a0002004430000010000100443000000020100003900000120001004430000063a01000041000018c40001042e000000800600003900000000070000190000000008060019000008b90000013d0000000107700039000000000037004b000008500000813d0000000009420049000000600990008a00000000059504360000002008800039000000000908043300000000ba0904340000066a0aa00197000000000aa20436000000000b0b04330000000100b0008c00000dd40000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b2000390000000000ab043500000060099000390000000009090433000000600a20003900000000006a0435000000800b200039000000000a0904330000000000ab0435000000a00220003900000000000a004b000008b60000613d000000000b0000190000002009900039000000000c0904330000000002c20436000000010bb000390000000000ab004b000008d70000413d000008b60000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000008e60000c13d000000000005004b000008f70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300000000002000019000009040000013d00000006020000290000000102200039000000800100043d000000000012004b000008760000813d0000000501200210000000a00110003900000000030104330000004001300039000c00000001001d0000000001010433000000000001004b0000006004300039000009110000613d00000000010404330000000001010433000000000001004b00000e370000c13d000800000004001d000600000002001d0000002001300039000700000001001d0000000002010433000000010020008c00000dd40000213d00000000010304330000066a01100197000900000002001d000b00000003001d18c310010000040f0000000b0100002900000000010104330000066a01100197000a00000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000021041b0000000a01000029000000000010043f0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000e0e0000c13d0000000601000039000000000101041a000006350010009c0000801002000039000005930000213d00000001041000390000000603000039000000000043041b0000068d0110009a0000000a04000029000000000041041b000000000103041a000900000001001d000000000040043f0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000021041b0000000c010000290000000001010433000a00000001001d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000201100039000000000201041a000006aa022001970000000a0000006b000000010220c1bf000000000021041b000000400100043d000000200200003900000000022104360000000b0300002900000000030304330000066a03300197000000000032043500000007020000290000000002020433000000010020008c00000dd40000213d000000400310003900000000002304350000000c020000290000000002020433000000000002004b0000000002000039000000010200c0390000006003100039000000000023043500000008020000290000000002020433000000800310003900000080040000390000000000430435000000a00310003900000000040204330000000000430435000000c003100039000000000004004b0000099b0000613d00000000050000190000002002200039000000000602043300000000036304360000000105500039000000000045004b000009950000413d0000000002130049000006320020009c00000632020080410000006002200210000006320010009c00000632010080410000004001100210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000121019f0000068a011001c70000800d0200003900000001030000390000068e0400004118c318b90000040f0000000100200190000080100200003900000dd20000613d0000000c010000290000000001010433000000000001004b000008ff0000c13d000000080100002900000000010104330000000003010433000000000003004b00000e3a0000613d00000000030000190000000004000019000a00000003001d0000000503300210000000000131001900000020011000390000000001010433000c00000001001d000000000041004b00000de70000413d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff0010019000000dea0000c13d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a000006aa0220019700000001022001bf000000000021041b0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000101100039000000000301041a000006350030009c0000801002000039000005930000213d000900000003001d0000000103300039000000000031041b000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b00000009011000290000000c04000029000000000041041b0000000a030000290000000103300039000000080100002900000000010104330000000002010433000000000023004b0000801002000039000009bb0000413d000008ff0000013d0009066a0010019b00000000010004100003066a0010019b0000000002000019000800000000001d00000007010000290000000001010433000000000021004b0000000003020019000000040200002900000dda0000a13d0000000001020433000000000031004b00000dda0000a13d000500000003001d000000050130021000000000030200190000002002100039000000a00110003900000000010104330000066a0410019700000007012000290000000001010433000b00000001001d00000000013200190000000001010433000a00000001001d000c00000004001d000000000040043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000a6c0000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000e080000613d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000202100039000000000202041a000000ff0020019000000a8e0000c13d0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff0010019000000e080000613d0000000c01000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000600000001001d0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c00000ae00000613d000000000001004b00000dd40000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000000500000613d000000060000006b00000000010000190000000a030000290000000c0200002900000b730000c13d000000400a00043d000006950100004100000000001a04350000000401a000390000000b0300002900000000003104350000000001000414000000040020008c00000b310000c13d0000000003000031000000200030008c0000002004000039000000000403401900000b5c0000013d000000400a00043d0000002401a000390000000b020000290000000000210435000006930100004100000000001a04350000000401a000390000000302000029000000000021043500000000010004140000000c02000029000000040020008c00000af20000c13d0000000003000031000000200030008c0000002004000039000000000403401900000b1d0000013d0000063200a0009c000006320300004100000000030a40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700020000000a001d18c318be0000040f000000020a000029000000000301001900000060033002700000063203300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000b0d0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000b090000c13d0000001f0740019000000b1a0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000000003001f000000010020019000000e110000613d0000001f01400039000000600210018f00000000040a00190000000001a20019000000000021004b00000000020000390000000102004039000006350010009c000005930000213d0000000100200190000005930000c13d000000400010043f000000200030008c00000dd20000413d0000000001040433000000060110006c0000000a0300002900000de10000413d0000000c0200002900000b740000013d0000063200a0009c000006320300004100000000030a40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700060000000a001d18c318be0000040f000000060a000029000000000301001900000060033002700000063203300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000b4c0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000b480000c13d0000001f0740019000000b590000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000000003001f000000010020019000000e3d0000613d0000001f01400039000000600210018f00000000040a00190000000001a20019000000000021004b00000000020000390000000102004039000006350010009c000005930000213d0000000100200190000005930000c13d000000400010043f000000200030008c00000dd20000413d00000000010404330000066a0010009c00000dd20000213d0000000002000410000000000021004b000000000100003900000001010060390000000a030000290000000c02000029000000010110018f000000010330008a000000000013004b00000ded0000813d000000000020043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000a03000029000000000032001a00000de10000413d0000000002320019000000000021041b000000400100043d000000200210003900000000003204350000000b020000290000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d020000390000000303000039000006980400004100000009050000290000000c0600002918c318b90000040f000000010020019000000dd20000613d0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000401043b0000000a0200002900000000032400a9000000000004004b00000bc30000613d00000000014300d9000000000021004b00000de10000c13d0000000201000039000000000101041a000000000001004b00000be20000613d000a00000001001d000b00000004001d000c00000003001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000101043b0000000b0110006b0000000c0300002900000de10000413d0000000a0010006b0000000a0100002900000be20000213d000000000313004b00000de10000413d000000090000006b00000df00000613d0000000201000039000000000101041a000000000031001a00000de10000413d000c00000003001d00000000013100190000000202000039000000000012041b0000000901000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000c030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000005000019000000090600002918c318b90000040f000000010020019000000dd20000613d0000000c02000029000000080020002a00000de10000413d000800080020002d00000005020000290000000102200039000000800100043d000000000012004b00000a360000413d0000024a0000013d0005066a0010019b00000000010004100008066a0010019b0000000002000019000700000000001d00000006010000290000000001010433000000000021004b000000020300002900000dda0000a13d0000000001030433000000000021004b00000dda0000a13d000400000002001d0000000502200210000000200120003900000000033100190000000003030433000c00000003001d000000000003004b00000ded0000613d000000a00220003900000000020204330000066a0320019700000006011000290000000001010433000900000001001d000b00000003001d000000000030043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0000000c0010006c00000ded0000413d0000000b01000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000c0220006c00000de10000413d000000000021041b0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000401043b0000000c034000b9000000000004004b00000c870000613d00000000014300d90000000c0010006c00000de10000c13d0000000201000039000000000101041a000000000031004b00000cc50000c13d000300000004001d000a00000003001d0000000801000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b00000003030000290000000a0230006b00000de10000413d000300000002001d000000000101041a000100000001001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000101043b0000000302000029000000000021001a0000000a0300002900000de10000413d0000000001210019000000010010006b000000080100002900000cc60000413d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000301041a0000000801000029000a00000003001d000000000001004b00000df70000613d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0003000a0010007400000e010000413d0000000801000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000302000029000000000021041b0000000202000039000000000102041a0000000a030000290000000001310049000000000012041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000805000029000000000600001918c318b90000040f000000010020019000000dd20000613d0000000b01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c00000d570000613d000000000001004b00000dd40000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000000500000613d0000000c01000029000000010010008c00000e0b0000c13d0000067b0100004100000000001004430000000b0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400600043d0000004401600039000000090200002900000000002104350000002401600039000000050200002900000000002104350000068001000041000000000016043500000004016000390000000802000029000000000021043500000000010004140000000b02000029000000040020008c00000daf0000613d000006320060009c000006320200004100000000020640190000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000b02000029000300000006001d18c318b90000040f000000030600002900000000030100190000006003300270000006320030019d000000010020019000000daf0000c13d00000e1d0000013d000000400200043d0000067a0020009c000005930000213d0000002001200039000300000001001d000000400010043f000100000002001d00000000000204350000067b0100004100000000001004430000000b0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400600043d0000008401600039000000a002000039000000000021043500000064016000390000000c0200002900000000002104350000004401600039000000090200002900000000002104350000002401600039000000050200002900000000002104350000067d01000041000000000016043500000004016000390000000802000029000000000021043500000001010000290000000001010433000000a4026000390000000000120435000000c402600039000000000001004b000000030700002900000d910000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00000d8a0000413d0000000002210019000000000002043500000000020004140000000b03000029000000040030008c00000daf0000613d0000001f01100039000006a801100197000000c401100039000006320010009c00000632010080410000006001100210000006320060009c000006320300004100000000030640190000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000112019f0000000b02000029000300000006001d18c318b90000040f000000030600002900000000030100190000006003300270000006320030019d000000010020019000000e2a0000613d000006350060009c000005930000213d000000400060043f0000000901000029000000000016043500000020016000390000000c020000290000000000210435000006320060009c000006320600804100000040016002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d020000390000000303000039000006820400004100000005050000290000000b0600002918c318b90000040f000000010020019000000dd20000613d0000000a02000029000000070020002a00000de10000413d000700070020002d00000004020000290000000102200039000000800100043d000000000012004b00000c1f0000413d000005010000013d0000000001000019000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000003201000039000000040010043f0000069601000041000018c500010430000000000001042f0000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000400100043d00000690020000410000070c0000013d000000400100043d0000068f020000410000070c0000013d000000400100043d00000697020000410000070c0000013d000000400100043d00000044021000390000069903000041000000000032043500000024021000390000001f03000039000006910000013d000000400100043d000000640210003900000685030000410000000000320435000000440210003900000686030000410000000000320435000000240210003900000021030000390000044c0000013d000000400100043d00000064021000390000068303000041000000000032043500000044021000390000068403000041000007270000013d000000400100043d0000069a020000410000070c0000013d000000400100043d0000067e020000410000070c0000013d000000400100043d0000068c020000410000070c0000013d0000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e180000c13d000008ea0000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e250000c13d000008ea0000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e320000c13d000008ea0000013d000000400100043d0000068b020000410000070c0000013d000000400100043d00000691020000410000070c0000013d0000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e440000c13d000008ea0000013d0000002003000039000000000331043600000000540204340000066a0440019700000000004304350000000003050433000000020030008c00000e6d0000813d0000004004100039000000000034043500000040032000390000000003030433000000000003004b0000000003000039000000010300c0390000006004100039000000000034043500000060022000390000000002020433000000800310003900000080040000390000000000430435000000a00410003900000000030204330000000000340435000000c001100039000000000003004b00000e6c0000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b00000e660000413d000000000001042d0000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c50001043000000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000e820000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000e7b0000413d000000000321001900000000000304350000001f02200039000006a8022001970000000001210019000000000001042d0000001f02200039000006a8022001970000000001120019000000000021004b00000000020000390000000102004039000006350010009c00000e940000213d000000010020019000000e940000c13d000000400010043f000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000001f03100039000000000023004b0000000004000019000006360400404100000636052001970000063603300197000000000653013f000000000053004b00000000030000190000063603002041000006360060009c000000000304c019000000000003004b00000ee10000613d0000000105000367000000000315034f000000000303043b000006ab0030009c00000edb0000813d0000001f04300039000006a8044001970000003f04400039000006a807400197000000400400043d0000000007740019000000000047004b00000000080000390000000108004039000006350070009c00000edb0000213d000000010080019000000edb0000c13d000000400070043f000000000434043600000020011000390000000007310019000000000027004b00000ee10000213d000000000215034f000006a8053001980000001f0630018f000000000154001900000ecb0000613d000000000702034f0000000008040019000000007907043c0000000008980436000000000018004b00000ec70000c13d000000000006004b00000ed80000613d000000000252034f0000000305600210000000000601043300000000065601cf000000000656022f000000000202043b0000010005500089000000000252022f00000000025201cf000000000262019f000000000021043500000000013400190000000000010435000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000019000018c500010430000006880010009c00000ef50000213d000000830010008c00000ef50000a13d00000001040003670000000401400370000000000101043b0000066a0010009c00000ef50000213d0000002402400370000000000202043b0000066a0020009c00000ef50000213d0000004403400370000000000303043b0000006404400370000000000404043b000000000001042d0000000001000019000018c500010430000006880010009c00000f820000213d000000240310008c00000f820000413d00000001040003670000000402400370000000000502043b000006350050009c00000f820000213d0000002302500039000000000012004b00000f820000813d0000000402500039000000000224034f000000000802043b000006ab0080009c00000f840000813d00000005078002100000003f027000390000066f06200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000006350060009c00000f840000213d000000010090019000000f840000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b00000f820000213d000000000008004b00000f800000613d000000000802001900000f250000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b00000f800000813d000000000964034f000000000909043b000006350090009c00000f820000213d000000000a5900190000000009a30049000006880090009c00000f820000213d000000800090008c00000f820000413d000000400900043d000006700090009c00000f840000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b0000066a00c0009c00000f820000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c00000f820000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b00000f820000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b0000063500b0009c00000f820000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000006360c008041000006360aa00197000006360d100197000000000eda013f0000000000da004b000000000a000019000006360a0040410000063600e0009c000000000a0cc01900000000000a004b00000f820000c13d000000240ab00039000000000aa4034f000000000c0a043b0000063500c0009c00000f840000213d000000050dc002100000003f0ad000390000066f0ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f0040390000063500e0009c00000f840000213d0000000100f0019000000f840000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cbd001900000000001c004b00000f820000213d0000000000cb004b00000f1e0000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b00000f780000413d00000f1e0000013d0000000001020019000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000066a02200197000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000f980000613d000000000101043b000000000001042d0000000001000019000018c500010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004460019000000000005004b00000fd10000613d0000008007000039000000000800001900000fac0000013d0000000108800039000000000058004b00000fd10000813d0000000009240049000000600990008a00000000069604360000002001100039000000000901043300000000ba0904340000066a0aa00197000000000aa40436000000000b0b04330000000200b0008c00000ff30000813d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b4000390000000000ab043500000060099000390000000009090433000000600a40003900000000007a0435000000800b400039000000000a0904330000000000ab0435000000a00440003900000000000a004b00000fa90000613d000000000b0000190000002009900039000000000c0904330000000004c40436000000010bb000390000000000ab004b00000fca0000413d00000fa90000013d0000000001240049000000200410008a00000000004204350000001f01100039000006a8041001970000000001240019000000000041004b00000000040000390000000104004039000006350010009c00000ff90000213d000000010040019000000ff90000c13d000000400010043f000006320030009c000006320300804100000040013002100000000002020433000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f000000010020019000000fff0000613d000000000101043b000000000001042d0000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000019000018c5000104300006000000000002000200000002001d0000000006010019000000400100043d0000002002100039000006a60300004100000000003204350000002404100039000000000034043500000024070000390000000000710435000006ac0010009c000011e70000813d0000006003100039000000400030043f000000040060008c000300000006001d000010190000c13d0000000001020433000000000010043f0000000003000031000000200030008c000010480000813d0000105c0000013d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010330000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000102f0000c13d000000000005004b000010400000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f000000010020019000000024070000390000105b0000613d000000000100043d0000000306000029000000200030008c0000105c0000413d000000000001004b0000105c0000613d000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006ae0500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000010610000c13d0000000001020433000000000010043f000010920000013d00000003060000290000000008000415000000060880008a0000000508800210000600000000003d000010ec0000013d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000107b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010770000c13d000000000005004b000010880000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000001f0030008c00000000010000390000000101002039000000000112016f000000010010019000000024070000390000109a0000613d000000000100043d00000003060000290000000008000415000000040880008a0000000508800210000000000001004b000400000000003d000400010000603d000010ec0000c13d0000109f0000013d0000000008000415000000050880008a0000000508800210000500010000003d0000000306000029000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006b00500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000010b50000c13d0000000001020433000000000010043f000000200030008c000010e60000413d000000000001004b0000000001000039000000010100c039000010ea0000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010d00000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010cc0000c13d000000000005004b0000000108000029000010de0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f00000001002001900000002407000039000010e80000613d000000000100043d0000000306000029000000200030008c000010b10000813d0000000001000019000010ea0000013d0000000001000019000000030600002900000005028002700000000102100195000000400100043d0000002002100039000006a6040000410000000000420435000000240510003900000000004504350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011140000c13d0000000001020433000000000010043f000000200030008c000011460000413d000000000001004b0000000001000019000011c80000613d000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006ae0500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011480000c13d0000000001020433000000000010043f000000000001004b0000000001000019000011c80000c13d000011800000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000112f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000112b0000c13d000000000005004b00000024070000390000113d0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000000100200190000000000100001900000003060000290000000108000029000011c80000613d000000000100043d000000200030008c000010fd0000813d0000000001000019000011c80000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011630000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000115f0000c13d000000000005004b0000000108000029000011710000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000001f0030008c00000000010000390000000101002039000000000112016f000000010010008c00000024070000390000117f0000c13d000000000100043d0000000306000029000000000001004b0000000001000019000011c80000c13d000011800000013d0000000306000029000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006b10500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011940000c13d0000000002020433000000000020043f000000200030008c0000000001000019000011c50000813d000011c80000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011af0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000011ab0000c13d000000000005004b000011bc0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f000000010020019000000000010000190000000108000029000011c80000613d000000000200043d000000200030008c0000000001000019000011c80000413d000000000002004b0000000001000039000000010100c03900000005028002700000000000020032000011d50000613d0000000100100190000011e30000c13d0000000201000029000000020010008c000011ed0000813d000000000001004b000011e60000613d000000400100043d000006b202000041000011dd0000013d0000000100100190000011e30000613d0000000201000029000000010010008c000011ed0000213d000011e60000613d000000400100043d000006b3020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c5000104300000000201000029000000010010008c000011ed0000213d000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300002000000000002000100000002001d0000066a01100197000200000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000000001004b000012160000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000000001004b000012390000613d0000000201000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000201043b0000000201200039000000000101041a000000ff01100190000012290000613d000000000001042d0000000101000029000000000010043f000000200020043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000ff0110018f000000000001042d0000000001000019000000000001042d0000000001000019000018c5000104300003000000000002000200000002001d0000066a01100197000300000001001d000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b0000000202000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000100000001001d0000000301000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000000010010008c000012910000613d000000000001004b0000132b0000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000000000001004b000013310000613d000000010000006b00000000010000190000000302000029000013210000c13d000000400b00043d000006950100004100000000001b04350000000401b00039000000020300002900000000003104350000000001000414000000040020008c000012e10000c13d0000000003000031000000200030008c000000200400003900000000040340190000130d0000013d000000400b00043d0000002401b0003900000002020000290000000000210435000006930100004100000000001b043500000000010004100000066a011001970000000402b00039000000000012043500000000010004140000000302000029000000040020008c000012a40000c13d0000000003000031000000200030008c00000020040000390000000004034019000012d00000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700030000000b001d18c318be0000040f000000030b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000012c00000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000012bc0000c13d000000000006004b000012cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000013480000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c000013250000213d0000000100200190000013250000c13d000000400010043f000000200030008c000013230000413d00000000010b0433000000010110006c000013420000413d000000000001042d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700030000000b001d18c318be0000040f000000030b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000012fd0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000012f90000c13d000000000006004b0000130a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000013540000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c000013250000213d0000000100200190000013250000c13d000000400010043f000000200030008c000013230000413d00000000010b04330000066a0010009c000013230000213d0000000002000410000000000021004b00000000010000390000000101006039000000010110018f000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c5000104300000001f0530018f0000063406300198000000400200043d00000000046200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d0000135f0000013d0000001f0530018f0000063406300198000000400200043d00000000046200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300006000000000002000400000004001d000500000003001d000300000001001d0000066a01200197000600000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000013970000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000015530000613d0000000601000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000202100039000000000202041a000000ff00200190000013b90000c13d0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000ff00100190000015530000613d0000000601000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000200000001001d0000000601000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000010010008c0000140b0000613d000000000001004b000015610000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000015670000613d000000020000006b0000000001000019000000040300002900000006020000290000149f0000c13d000000400b00043d000006950100004100000000001b04350000000401b00039000000050300002900000000003104350000000001000414000000040020008c0000145d0000c13d0000000003000031000000200030008c00000020040000390000000004034019000014890000013d000000400b00043d0000002401b0003900000005020000290000000000210435000006930100004100000000001b043500000000010004100000066a011001970000000402b00039000000000012043500000000010004140000000602000029000000040020008c0000141e0000c13d0000000003000031000000200030008c000000200400003900000000040340190000144a0000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700010000000b001d18c318be0000040f000000010b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000143a0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000014360000c13d000000000006004b000014470000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000015780000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c0000155b0000213d00000001002001900000155b0000c13d000000400010043f000000200030008c000015400000413d00000000010b0433000000020110006c0000000403000029000015420000413d0000000602000029000014a00000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700020000000b001d18c318be0000040f000000020b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000014790000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000014750000c13d000000000006004b000014860000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000015840000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c0000155b0000213d00000001002001900000155b0000c13d000000400010043f000000200030008c000015400000413d00000000010b04330000066a0010009c000015400000213d0000000002000410000000000021004b0000000001000039000000010100603900000004030000290000000602000029000000010110018f000000010330008a000000000013004b000015490000813d000000000020043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000201041a0000000403000029000000000032001a000015420000413d0000000002320019000000000021041b000000400100043d0000002002100039000000000032043500000005020000290000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000003020000290000066a0520019700000672011001c70000800d0200003900000003030000390000069804000041000500000005001d000000060600002918c318b90000040f0000000100200190000015400000613d0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000015480000613d000000000501043b000000040200002900000000042500a9000000000005004b0000000503000029000014f20000613d00000000015400d9000000000021004b000015420000c13d0000000202000039000000000102041a000000000001004b000015130000613d000300000001001d000400000005001d000600000004001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000015480000613d000000000101043b000000040110006b000000050300002900000006040000290000000202000039000015420000413d000000030010006b0000000301000029000015130000213d000000000414004b000015420000413d000000000003004b0000154c0000613d000000000102041a000000000041001a000015420000413d0000000001410019000000000012041b000000000030043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c70000801002000039000600000004001d18c318be0000040f0000000100200190000015400000613d000000000101043b000000000201041a00000006030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000005000019000000050600002918c318b90000040f0000000100200190000015400000613d0000000601000029000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000000001042f000000400100043d0000069702000041000015550000013d000000400100043d00000044021000390000069903000041000000000032043500000024021000390000001f030000390000156d0000013d000000400100043d0000069a020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000001f0530018f0000063406300198000000400200043d00000000046200190000158f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000157f0000c13d0000158f0000013d0000001f0530018f0000063406300198000000400200043d00000000046200190000158f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000158b0000c13d000000000005004b0000159c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300008000000000002000500000003001d000300000001001d000800000004001d000000000004004b0000175a0000613d0000066a01200197000700000001001d000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000080010006c0000175a0000413d0000000701000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000201041a000000080220006c000017540000413d000000000021041b0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000017530000613d000000000401043b00000008034000b9000000000004004b000015fb0000613d00000000014300d9000000080010006c000017540000c13d00000000010004100000066a021001970000000201000039000000000101041a000000000031004b000400000002001d0000163c0000c13d000200000004001d000600000003001d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000203000029000000060230006b000017540000413d000200000002001d000000000101041a000100000001001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000017530000613d000000000101043b0000000202000029000000000021001a0000000603000029000017540000413d0000000001210019000000010010006b00000004020000290000163c0000413d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000301041a0000000402000029000600000003001d000000000002004b000017630000613d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a00020006001000740000176d0000413d0000000401000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000202000029000000000021041b0000000203000039000000000103041a00000006020000290000000001210049000000000013041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000405000029000000000600001918c318b90000040f0000000100200190000017510000613d0000000701000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000010010008c000016dc0000613d000000000001004b000017810000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000000001004b000017870000613d0000000801000029000000010010008c000017980000c13d0000067b010000410000000000100443000000070100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f0000000100200190000017530000613d000000000101043b000000000001004b000017510000613d000000400600043d0000004401600039000000050200002900000000002104350000068001000041000000000016043500000004016000390000000402000029000000000021043500000003010000290000066a051001970000002401600039000000000051043500000000010004140000000702000029000000040020008c000017370000613d000006320060009c000006320200004100000000020640190000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000702000029000400000006001d000300000005001d18c318b90000040f0000000305000029000000040600002900000000030100190000006003300270000006320030019d0000000100200190000017370000c13d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000017ac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016d70000c13d000017ac0000013d000000400200043d000006b40020009c0000175d0000813d0000002001200039000200000001001d000000400010043f000100000002001d00000000000204350000067b010000410000000000100443000000070100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f0000000100200190000017530000613d000000000101043b000000000001004b000017510000613d000000400600043d0000008401600039000000a00200003900000000002104350000006401600039000000080200002900000000002104350000004401600039000000050200002900000000002104350000067d01000041000000000016043500000004016000390000000402000029000000000021043500000003010000290000066a051001970000002401600039000000000051043500000001010000290000000001010433000000a4026000390000000000120435000000c402600039000000000001004b0000000208000029000017170000613d000000000300001900000000042300190000000007830019000000000707043300000000007404350000002003300039000000000013004b000017100000413d0000000002120019000000000002043500000000020004140000000703000029000000040030008c000017370000613d0000001f01100039000006a801100197000000c401100039000006320010009c00000632010080410000006001100210000006320060009c000006320300004100000000030640190000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000121019f0000000702000029000400000006001d000300000005001d18c318b90000040f0000000305000029000000040600002900000000030100190000006003300270000006320030019d0000000100200190000017a00000613d000006350060009c0000175d0000213d000000400060043f00000005010000290000000000160435000000200160003900000008020000290000000000210435000006320060009c000006320600804100000040016002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d0200003900000003030000390000068204000041000000070600002918c318b90000040f0000000100200190000017510000613d0000000601000029000000000001042d0000000001000019000018c500010430000000000001042f0000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000400100043d00000697020000410000179a0000013d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c500010430000000400100043d00000064021000390000068503000041000000000032043500000044021000390000068603000041000000000032043500000024021000390000002103000039000017760000013d000000400100043d00000064021000390000068303000041000000000032043500000044021000390000068403000041000000000032043500000024021000390000002203000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c500010430000000400100043d0000067e020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c50001043000000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000017ac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000017a80000c13d000000000005004b000017b90000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300004000000000002000400000003001d0000066a011001980000180b0000613d0002066a0020019c000018150000613d000300000001001d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b000000000101041a00010004001000740000181f0000413d0000000301000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b0000000102000029000000000021041b0000000201000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b000000000201041a00000004030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000305000029000000020600002918c318b90000040f0000000100200190000018090000613d000000000001042d0000000001000019000018c500010430000000400100043d0000006402100039000006b90300004100000000003204350000004402100039000006ba03000041000000000032043500000024021000390000002503000039000018280000013d000000400100043d0000006402100039000006b70300004100000000003204350000004402100039000006b803000041000000000032043500000024021000390000002303000039000018280000013d000000400100043d0000006402100039000006b50300004100000000003204350000004402100039000006b603000041000000000032043500000024021000390000002603000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c50001043000030000000000020000066a011001980000186c0000613d000200000003001d0003066a0020019c000018760000613d000100000001001d000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000003030000290000186a0000613d000000000101043b000000000030043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000030600002900000001002001900000186a0000613d000000000101043b0000000202000029000000000021041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d0200003900000003030000390000069c04000041000000010500002918c318b90000040f00000001002001900000186a0000613d000000000001042d0000000001000019000018c500010430000000400100043d00000064021000390000069f0300004100000000003204350000004402100039000006a0030000410000000000320435000000240210003900000024030000390000187f0000013d000000400100043d00000064021000390000069d03000041000000000032043500000044021000390000069e03000041000000000032043500000024021000390000002203000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c500010430000000000001042f000006320010009c00000632010080410000004001100210000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f00000001002001900000189e0000613d000000000101043b000000000001042d0000000001000019000018c50001043000000000050100190000000000200443000000040100003900000005024002700000000002020031000000000121043a0000002004400039000000000031004b000018a30000413d000006320030009c000006320300804100000060013002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f000006bb011001c7000000000205001918c318be0000040f0000000100200190000018b80000613d000000000101043b000000000001042d000000000001042f000018bc002104210000000102000039000000000001042d0000000002000019000000000001042d000018c1002104230000000102000039000000000001042d0000000002000019000000000001042d000018c300000432000018c40001042e000018c5000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000ddd2935029d800000000002000000000000000000000000000000c0000001000000000000000000000000000000000000000000000000000000000000000000000000007bfe950b00000000000000000000000000000000000000000000000000000000a457c2d600000000000000000000000000000000000000000000000000000000c2ee3a0700000000000000000000000000000000000000000000000000000000dd62ed3d00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000f23a6e6100000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000cbf1304d00000000000000000000000000000000000000000000000000000000b58d774f00000000000000000000000000000000000000000000000000000000b58d775000000000000000000000000000000000000000000000000000000000bc197c8100000000000000000000000000000000000000000000000000000000a457c2d700000000000000000000000000000000000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000086937eb30000000000000000000000000000000000000000000000000000000095d89b400000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000008b878cb2000000000000000000000000000000000000000000000000000000007ccc2ec1000000000000000000000000000000000000000000000000000000007ccc2ec2000000000000000000000000000000000000000000000000000000007ddc2cd1000000000000000000000000000000000000000000000000000000007bfe950c000000000000000000000000000000000000000000000000000000007cc253700000000000000000000000000000000000000000000000000000000020e8c564000000000000000000000000000000000000000000000000000000003a51f3820000000000000000000000000000000000000000000000000000000056359ba90000000000000000000000000000000000000000000000000000000056359baa0000000000000000000000000000000000000000000000000000000070a08231000000000000000000000000000000000000000000000000000000003a51f383000000000000000000000000000000000000000000000000000000004c4c45de00000000000000000000000000000000000000000000000000000000313ce56600000000000000000000000000000000000000000000000000000000313ce56700000000000000000000000000000000000000000000000000000000395093510000000000000000000000000000000000000000000000000000000020e8c5650000000000000000000000000000000000000000000000000000000023b872dd000000000000000000000000000000000000000000000000000000000c7056b700000000000000000000000000000000000000000000000000000000150b7a0100000000000000000000000000000000000000000000000000000000150b7a020000000000000000000000000000000000000000000000000000000018160ddd000000000000000000000000000000000000000000000000000000000c7056b800000000000000000000000000000000000000000000000000000000139f11440000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000095ea7b30000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000006d81bf4000000000000000000000000fffffffffffffffffffffffffffffffffffffffff23a6e610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000800000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7fbc197c81000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000207a65726f00000000000000000000000000000000000000000000000000000045524332303a2064656372656173656420616c6c6f77616e63652062656c6f7708c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000000000000000000000008a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0200000200000000000000000000000000000044000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000000000000000000000000000ffffffffffffffdf1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000545c577100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000f341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567636500000000000000000000000000000000000000000000000000000000000045524332303a206275726e20616d6f756e7420657863656564732062616c616e730000000000000000000000000000000000000000000000000000000000000045524332303a206275726e2066726f6d20746865207a65726f20616464726573af1ad76e000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5daa87a000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000099b777de0000000000000000000000000000000000000000000000000000000033195adc0000000000000000000000000000000000000000000000000000000009addddcec1d7ba6ad726df49aeea3e93fb0c1037d551236841a60c0c883f2c12ebca503d1d899889b8a6d039632aa576bbff8cb8233491fbaece7f7773c3417403b2b67000000000000000000000000000000000000000000000000000000007c4ef3dc0000000000000000000000000000000000000000000000000000000090f22bf1000000000000000000000000000000000000000000000000000000008004ef9a0000000000000000000000000000000000000000000000000000000000fdd58e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006352211e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000049986e7300000000000000000000000000000000000000000000000000000000dcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d745524332303a206d696e7420746f20746865207a65726f206164647265737300edcb51b1000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925737300000000000000000000000000000000000000000000000000000000000045524332303a20617070726f766520746f20746865207a65726f206164647265726573730000000000000000000000000000000000000000000000000000000045524332303a20617070726f76652066726f6d20746865207a65726f2061646445524332303a20696e73756666696369656e7420616c6c6f77616e6365000000150b7a0200000000000000000000000000000000000000000000000000000000c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000004e2312e000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa00000000000007530000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f80ac58cd00000000000000000000000000000000000000000000000000000000d9b67a2600000000000000000000000000000000000000000000000000000000185e917c00000000000000000000000000000000000000000000000000000000520b404e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffe0616c616e6365000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062657373000000000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220746f20746865207a65726f2061646472647265737300000000000000000000000000000000000000000000000000000045524332303a207472616e736665722066726f6d20746865207a65726f206164020000020000000000000000000000000000000000000000000000000000000021075256c6208e4b0222227178cfff61ecbe7936dc58d50674e8b5266c15b4f4", + "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252" + ] +} \ No newline at end of file diff --git a/deployments/treasureTopaz/StakingContractMainnet.json b/deployments/treasureTopaz/StakingContractMainnet.json new file mode 100644 index 0000000..b467a31 --- /dev/null +++ b/deployments/treasureTopaz/StakingContractMainnet.json @@ -0,0 +1,1664 @@ +{ + "address": "0x474Dd6564155004863c39B6b0928D4219bE4F70B", + "abi": [ + { + "inputs": [], + "name": "AlreadySubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyUnsubscribed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "innerErorr", + "type": "bytes" + } + ], + "name": "BatchError", + "type": "error" + }, + { + "inputs": [], + "name": "FullyPacked", + "type": "error" + }, + { + "inputs": [], + "name": "IncentiveOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientStakedAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIndex", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimeFrame", + "type": "error" + }, + { + "inputs": [], + "name": "NoToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonZero", + "type": "error" + }, + { + "inputs": [], + "name": "NotStaked", + "type": "error" + }, + { + "inputs": [], + "name": "NotSubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyCreator", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + } + ], + "name": "IncentiveCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "changeAmount", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newStartTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEndTime", + "type": "uint256" + } + ], + "name": "IncentiveUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Subscribe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Unsubscribe", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "accrueRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "datas", + "type": "bytes[]" + } + ], + "name": "batch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint112", + "name": "rewardAmount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "startTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + } + ], + "name": "createIncentive", + "outputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "incentiveCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "incentives", + "outputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "rewardPerLiquidity", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "lastRewardTime", + "type": "uint32" + }, + { + "internalType": "uint112", + "name": "rewardRemaining", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "liquidityStaked", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardPerLiquidityLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeAndSubscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "subscribeToIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "unstakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "incentiveIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "ignoreRewards", + "type": "bool" + } + ], + "name": "unsubscribeFromIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + }, + { + "internalType": "int112", + "name": "changeAmount", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "newStartTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "newEndTime", + "type": "uint32" + } + ], + "name": "updateIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userStakes", + "outputs": [ + { + "internalType": "uint112", + "name": "liquidity", + "type": "uint112" + }, + { + "internalType": "uint144", + "name": "subscribedIncentiveIds", + "type": "uint144" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x3f3cc1c2188430c998e1684963b41d6323a1d545d51e9314acfcf12aff5d335d", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0x474Dd6564155004863c39B6b0928D4219bE4F70B", + "transactionIndex": 0, + "gasUsed": "119087", + "logsBloom": "0x00000000001400000008000000000000000000000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000040000000008000040000000000000000000000000000000080400000000000000000000000000000000000000000000000000000010000000000000000000000000000004000000000000000100000000000008000000000000000000200000100000000000800000000000000000000000002000010000000000000002008000000000000000000000000000000100000000000000000000000200000000010000000000000000000000000000000000000000000000000000", + "blockHash": "0x6267b31722b8e0e5604fda5b721f61b0b6cad667d0cd25ea8f1deb872a528a50", + "transactionHash": "0x3f3cc1c2188430c998e1684963b41d6323a1d545d51e9314acfcf12aff5d335d", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 1644, + "transactionHash": "0x3f3cc1c2188430c998e1684963b41d6323a1d545d51e9314acfcf12aff5d335d", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x00000000000000000000000000000000000000000000000000000c1d49850632", + "logIndex": 0, + "blockHash": "0x6267b31722b8e0e5604fda5b721f61b0b6cad667d0cd25ea8f1deb872a528a50" + }, + { + "transactionIndex": 0, + "blockNumber": 1644, + "transactionHash": "0x3f3cc1c2188430c998e1684963b41d6323a1d545d51e9314acfcf12aff5d335d", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x00000000000000000000000000000000000000000000000000000291319ad69c", + "logIndex": 1, + "blockHash": "0x6267b31722b8e0e5604fda5b721f61b0b6cad667d0cd25ea8f1deb872a528a50" + }, + { + "transactionIndex": 0, + "blockNumber": 1644, + "transactionHash": "0x3f3cc1c2188430c998e1684963b41d6323a1d545d51e9314acfcf12aff5d335d", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x010004b9dd2b924a8be23e34ac58a1d026f893da4fc4d9bafa98daa6311a0473", + "0x000000000000000000000000474dd6564155004863c39b6b0928d4219be4f70b" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0x6267b31722b8e0e5604fda5b721f61b0b6cad667d0cd25ea8f1deb872a528a50" + }, + { + "transactionIndex": 0, + "blockNumber": 1644, + "transactionHash": "0x3f3cc1c2188430c998e1684963b41d6323a1d545d51e9314acfcf12aff5d335d", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x000000000000000000000000000000000000000000000000000003b06b56fca1", + "logIndex": 3, + "blockHash": "0x6267b31722b8e0e5604fda5b721f61b0b6cad667d0cd25ea8f1deb872a528a50" + } + ], + "blockNumber": 1644, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 3, + "solcInputHash": "29575f9c42d79da7d15102bbf5192733", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "name": "AlreadySubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyUnsubscribed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "innerErorr", + "type": "bytes" + } + ], + "name": "BatchError", + "type": "error" + }, + { + "inputs": [], + "name": "FullyPacked", + "type": "error" + }, + { + "inputs": [], + "name": "IncentiveOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientStakedAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIndex", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimeFrame", + "type": "error" + }, + { + "inputs": [], + "name": "NoToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonZero", + "type": "error" + }, + { + "inputs": [], + "name": "NotStaked", + "type": "error" + }, + { + "inputs": [], + "name": "NotSubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyCreator", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + } + ], + "name": "IncentiveCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "changeAmount", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newStartTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEndTime", + "type": "uint256" + } + ], + "name": "IncentiveUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Subscribe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Unsubscribe", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "accrueRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "datas", + "type": "bytes[]" + } + ], + "name": "batch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint112", + "name": "rewardAmount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "startTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + } + ], + "name": "createIncentive", + "outputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "incentiveCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "incentives", + "outputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "rewardPerLiquidity", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "lastRewardTime", + "type": "uint32" + }, + { + "internalType": "uint112", + "name": "rewardRemaining", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "liquidityStaked", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardPerLiquidityLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeAndSubscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "subscribeToIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "unstakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "incentiveIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "ignoreRewards", + "type": "bool" + } + ], + "name": "unsubscribeFromIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + }, + { + "internalType": "int112", + "name": "changeAmount", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "newStartTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "newEndTime", + "type": "uint32" + } + ], + "name": "updateIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userStakes", + "outputs": [ + { + "internalType": "uint112", + "name": "liquidity", + "type": "uint112" + }, + { + "internalType": "uint144", + "name": "subscribedIncentiveIds", + "type": "uint144" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "unsubscribeFromIncentive(address,uint256,bool)": { + "params": { + "incentiveIndex": "∈ [0,5]" + } + } + }, + "stateVariables": { + "rewardPerLiquidityLast": { + "details": "rewardPerLiquidityLast[user][incentiveId]Semantic overload: if value is zero user isn't subscribed to the incentive." + }, + "userStakes": { + "details": "userStakes[user][stakedToken]" + } + }, + "title": "Fork of https://github.com/sushiswap/StakingContract", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Permissionless staking contract that allows any number of incentives to be running for any token (erc20). Incentives can be created by anyone, the total reward amount must be sent at creation. Incentives can be updated (change reward rate / duration). Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.", + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Rewards/StakingContractMainnet.sol": "StakingContractMainnet" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Rewards/StakingContractMainnet.sol": { + "keccak256": "0x946dc24d08f781be4b0315986f13b390e79cac563074458fdf3a5dc2b76cce04", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://430b6f68a3993dc68ddf28d1f3f21e3a206eb32481dfac29f77ed3614ecc96b2", + "dweb:/ipfs/QmebFypNY7hea9nMuwG9ANPQCwktH5Sc13VtSanNWCuUJ8" + ] + }, + "contracts/Rewards/libraries/FullMath.sol": { + "keccak256": "0x9dd1081af9b9bf8d535e524847985fc4255d44e243e3b5afe770c9ee0557d032", + "license": "MIT", + "urls": [ + "bzz-raw://5976d20e5ee4054b47fdfbf561f8df7ae74e06046d06ce52ca47c536af7a06a1", + "dweb:/ipfs/QmSw2SkeE56p7u28N38aRynWy4ZoxNsXTk4eNrkGMmoyC7" + ] + }, + "contracts/Rewards/libraries/PackedUint144.sol": { + "keccak256": "0x71a853b74959948bbf3ba496130ce4b34e6047f35567651c846d8c7454f0efec", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://6771a5f0e7c12d87d17abe9234737e7bc8636256f28114d1c19d2f93139ffd58", + "dweb:/ipfs/QmU2GQm7X5zAat3XkS3i8kLSNWAagME1VoRGBeAVrR4Do3" + ] + }, + "lib/solmate/src/tokens/ERC20.sol": { + "keccak256": "0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35", + "dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97" + ] + }, + "lib/solmate/src/utils/ReentrancyGuard.sol": { + "keccak256": "0xb282dd78aa7375d6b200b9a5d8dd214b2e5df1004f8217a4b4c2b07f0c5bfd01", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://5fca62eb8d3dbd2b3b7e4bb051f6da16f4d0ff9cee61c39cebb80f031f6a8800", + "dweb:/ipfs/QmbrsXPK91iBFwHKwJs2HLRud2KzMoBDRiWYMUtyV5H57j" + ] + }, + "lib/solmate/src/utils/SafeTransferLib.sol": { + "keccak256": "0xbadf3d708cf532b12f75f78a1d423135954b63774a6d4ba15914a551d348db8a", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://88ac8256bd520d1b8e6f9c4ac9e8777bffdc4a6c8afb1a848f596665779a55b4", + "dweb:/ipfs/QmXx7X1dxe6f5VM91vgQ5BA4r2eF97GWDcQDrgHytcvfjU" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0003000000000002000e000000000002000000000c01034f00020000000c035500000000010c001900000060011002700000044e0010019d000000800d0000390000004000d0043f0000000100200190000000570000c13d0000044e03100197000000040030008c0000081a0000413d00000000010c043b000000e002100270000004500020009c000000610000213d00000000013c034f0000045a0020009c0000007e0000a13d0000045b0020009c000000e70000213d0000045e0020009c000001670000613d0000045f0020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b000000000102041a0000007004100272000007bd0000613d0000046a0010009c0000069d0000813d00000001030000390000078a0000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000010041b0000002001000039000001000010044300000120000004430000044f01000041000011350001042e000004510020009c000000c40000a13d000004520020009c0000014a0000213d000004550020009c000001a80000613d000004560020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d000000000010043f0000000301000039000000200010043f000e0000000c0353113411180000040f0000000e0200035f0000002402200370000000000202043b000000000020043f000000200010043f113411180000040f000002040000013d000004600020009c000002000000613d000004610020009c000002080000613d000004620020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d000000060230006c000006a40000813d000000400100043d000004b002000041000007bf0000013d000004570020009c000002240000613d000004580020009c000003ad0000613d000004590020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d0000002402c00370000000000202043b000e00000002001d000004630020009c0000081a0000213d000000000010043f0000000401000039000000200010043f113411180000040f0000000e02000029000000000020043f000000200010043f113411180000040f000000000101041a0000046402100197000000800020043f0000007001100270000000a00010043f0000048201000041000011350001042e0000045c0020009c000004110000613d0000045d0020009c0000081a0000c13d000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000002401c00370000000000301043b0000049000300198000004910100004100000000010060190000049202300197000000000121019f0000000402c00370000000000202043b000e00000002001d000d00000003001d000000000013004b0000081a0000c13d0000004401c00370000000000101043b000c00000001001d0000044e0010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000301043b000000000103041a00000463011001970000000002000411000000000012004b0000052e0000c13d0000000401300039000600000003001d0000000202300039000700000002001d000000000202041a000800000002001d000a00000001001d000000000101041a000900000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d00000009050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000004720050009c000006c00000413d000000000521004b000006c00000a13d0000000a03000029000000000303041a0000009006300272000006d80000c13d0000049e01000041000000000010043f0000001201000039000000040010043f0000049f010000410000113600010430000004530020009c000004380000613d000004540020009c0000081a0000c13d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000200041a000000010020008c0000045f0000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b000004690000813d000000000010043f000000200020043f113411180000040f11340f760000040f0000000101000039000000000010041b0000000001000019000011350001042e000000a40030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d000004630010009c0000081a0000213d0000004401c00370000000000101043b000c00000001001d000004640010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d0000008401c00370000000000101043b000a00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000c0000006b000004690000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000b0010006b0000000b02008029000b00000002001d0000000a0020006c0000074a0000813d0000000102000039000000000102041a0000000101100039000000000012041b000900000001001d000004a40010009c000008250000413d000000400100043d000004ab02000041000007bf0000013d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010100002900000006020000291134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d0000000602300029000004640020009c000008b60000213d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000006c70000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000481040000410000000105000029000008160000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000101041a000000800010043f0000046601000041000011350001042e000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000f02043b0000048700f0009c0000081a0000213d0000002302f00039000000000032004b0000081a0000813d0000000402f0003900000000022c034f000000000202043b000c00000002001d000004870020009c0000081a0000213d000e002400f0003d0000000c0200002900000005022002100000000e02200029000000000032004b0000081a0000213d0000000c0000006b0000046d0000c13d0000000001000019000011350001042e000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000004640010009c0000081a0000213d0000004402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000504043b000004870050009c000004320000213d00000005045002100000003f064000390000048806600197000004890060009c000004320000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b0000081a0000213d000000000005004b000002530000613d000000a00300003900000000052c034f000000000505043b00000000035304360000002002200039000000000042004b0000024d0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b0000081a0000c13d000000000200041a000000010020008c000006d10000c13d0000000202000039000000000020041b00000464021001970000000e01000029000600000002001d1134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046302200197000200000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000500000003001d0000000602300029000004640020009c000008b60000213d0000046803100197000000000232019f0000000703000029000000000023041b000004690020009c00000aea0000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004810400004100000002050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b000000800100043d000700000001001d000000000001004b000002220000613d0000000004000019000000800100043d000000000041004b00008010030000390000081f0000a13d000900000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b000e00000004001d000000010140008a000000000202041a000000000021004b0000081c0000813d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700000000020300191134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000800000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000040e0000613d0000000d020000290000000201200039000000000101041a000a00000001001d0000000401200039000c00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b070000290000044e037001970000000a02000029000000a0022002700000044e04200197000000000501043b000000000045004b00000000020400190000000002054019000004720070009c0000000d0100002900000003011000390000033e0000413d000000000632004b0000033e0000a13d0000000c09000029000000000509041a0000009007500272000001440000613d00000000033400490000002004500270000004640840019700000000066800a900000000033600d900000464063000d100000000067600d9000000000701041a0000000006670019000000000061041b0000000003340049000000200330021000000473033001970000047404500197000000000334019f000000000223019f000000000029041b000003460000013d000004750070009c000003460000213d000000000053004b000003460000813d0000047603700197000000000232019f0000000c03000029000000000023041b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000802000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000ae70000613d000000000301041a0000046e0030009c0000000c0500002900000f580000813d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000015041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d02000039000000030300003900000486040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b00000009040000290000000104400039000000070040006c000002a80000413d000002220000013d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000301043b000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b000004690000813d000e00000003001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000c00000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000074d0000c13d000000400100043d0000048f02000041000007bf0000013d000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000404043b000600000004001d000004870040009c0000081a0000213d000500240020003d000000060200002900000005022002100000000504200029000000000034004b0000081a0000213d000000000300041a000000010030008c0000045f0000c13d0000000203000039000000000030041b0000003f032000390000048803300197000004890030009c000005040000a13d0000049e01000041000000000010043f0000004101000039000000040010043f0000049f010000410000113600010430000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f113411180000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a0000046301100197000000800010043f0000046301500197000000a00010043f0000046301400197000000c00010043f000000a0014002700000044e01100197000000e00010043f000001000030043f0000044e01200197000001200010043f00000020012002700000046401100197000001400010043f0000009001200270000001600010043f0000046501000041000011350001042e0000047d01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000048a01000041000000c40010043f000004ad0100004100001136000104300000049d01000041000000800010043f000004ac010000410000113600010430000000200e00008a0000000005000019000b0000000f001d0000000004f30049000d00000005001d00000005025002100000000e0220002900000000022c034f000000000202043b000000430440008a0000049a054001970000049a06200197000000000756013f000000000056004b00000000050000190000049a05002041000000000042004b00000000040000190000049a040040410000049a0070009c000000000504c019000000000005004b0000081a0000613d0000000e0420002900000000024c034f000000000b02043b0000048700b0009c0000081a0000213d0000000005b3004900000020044000390000049a065001970000049a07400197000000000867013f000000000067004b00000000060000190000049a06004041000000000054004b00000000050000190000049a050020410000049a0080009c000000000605c019000000000006004b0000081a0000c13d00000000064c034f0000000007eb0170000000400400043d0000000005740019000004a30000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b0000049f0000c13d0000001f08b00190000004b00000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000004b90000c13d00000001060000310000000102000039000004cf0000013d0000044e00b0009c0000044e0b0080410000006001b002100000044e0040009c0000044e040080410000004003400210000000000113019f0000044e0050009c0000044e05008041000000c003500210000000000113019f1134112f0000040f0000000b0f000029000000200e00008a000000800d0000390000000003000031000000020c000367000000010220018f000000000401001900000060044002700001044e0040019d0000044e06400197000000000006004b00000000040d00190000006005000039000004fa0000613d000004b10060009c000004320000813d0000001f046000390000000004e4016f0000003f044000390000000004e4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000004870040009c000004320000213d0000000100700190000004320000c13d000000400040043f00000000046504360000000008e601700000000007840019000004ed0000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000004e90000c13d0000001f06600190000004fa0000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b0000067c0000613d0000000d0500002900000001055000390000000c0050006c000004700000413d000002220000013d000000400100043d0000048b02000041000007bf0000013d0000008003300039000000400030043f0000000603000029000000800030043f0000001f0320018f000000000002004b000005110000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000050d0000c13d000000000003004b000000060000006b000005310000c13d0000000101000039000000000010041b0000002002000039000000400100043d0000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005250000613d000000a0040000390000000005000019000000004604043400000000026204360000000105500039000000000035004b000005200000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e000000400100043d0000049302000041000007bf0000013d0000000002000019000900000002001d0000000502200210000700000002001d0000000501200029000e00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b0000081c0000813d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000b00000001001d000d00000002001d0000000401200039000a00000001001d000000000101041a000c00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000c060000290000044e026001970000000b03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000d070000290000000308700039000b00000008001d000005850000413d000000000521004b000005850000a13d0000000a09000029000000000409041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000019041b0000058d0000013d000004750060009c0000000a030000290000058d0000213d000000000042004b0000058d0000813d0000047602600197000000000121019f000000000013041b0000000e010000290000000201100367000000000101043b000e00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000d0100002900000464011001970000000b03000029000000000303041a000c00000003001d0000000002230049000004b30020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000005ed0000c13d000004640130012a000005f50000013d000004780040009c0000081a0000213d000004641010012a000004642020012a00000000011200a9000004641010012a000000000113004900000479011000d1000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000d0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c000006270000c13d0000000001010433000000000010043f000000010300003100000001020000390000064d0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c0000002005000039000000000503401900000020045001900000063e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000063a0000c13d0000001f055001900000064b0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000d0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d000000800100043d0000000902000029000000000021004b0000081f0000a13d0000000701000029000000a0011000390000000d0300002900000000003104350000000102200039000000060020006c000005320000413d000005140000013d000000400100043d000004b20200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000006900000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000006890000413d0000001f042000390000000004e4016f0000000002230019000000000002043500000044024000390000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f00001136000104300000046b0010009c00000002030000390000078a0000413d0000046c0010009c000007840000813d00000003030000390000078a0000013d000004690020009c000008b60000813d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000007c50000813d000000400100043d0000002402100039000000060300002900000000003204350000047a020000410000000000210435000000040210003900000000030004110000000000320435000000000200041400000001030000290000046303300197000e00000003001d000000040030008c000007cf0000c13d00000001020000390000000001010433000000000010043f0000000103000031000007f70000013d000004750060009c000006ec0000213d000000000032004b000006ec0000813d0000047602600197000000000121019f000006ea0000013d000300010000003d0000046a0010009c000009080000413d0000046b0010009c000300020000003d000009080000413d0000046c0010009c000009010000813d0000000301000039000009070000013d000000400100043d00000044021000390000048a03000041000000000032043500000024021000390000000a0300003900000d460000013d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000006060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f0000000a02000029000000000012041b0000000c01000029000c044e0010019c000007030000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000c0010006b0000000c020080290000000a03000029000000000103041a0000047601100197000000000121019f000000000013041b0000000b0000006b000007080000c13d0000000701000029000000000101041a0000071d0000013d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000000b0010006b0000000b01008029000000a00110021000000494011001970000000703000029000000000203041a0000049502200197000000000121019f000000000013041b000000a0021002700000044e032001970000000a02000029000000000202041a0000044e04200197000000000034004b0000074a0000813d0000000d03000029000004960030009c000008b00000213d0000000d0000006b000008b00000613d0000000d030000290000046404300197000000200320027000000464033001970000000003430019000004640030009c000008b60000213d000004970220019700000020033002100000047303300197000000000223019f0000000a03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000049802000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cb10000c13d00000001020000390000000001030433000000000010043f000000010300003100000cd80000013d000000400100043d000004a302000041000007bf0000013d0000000d020000290000000201200039000000000101041a000900000001001d0000000401200039000a00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000903000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000a9c0000413d000000000521004b00000a9c0000a13d0000000a03000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d90000000d060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000aa40000013d0000046d0010009c00000004030000390000078a0000413d0000046e0010009c000000060300003900000005030040390000000d0030006b000007bd0000813d000b00000004001d000a00000002001d0000000d01000029000e0018001000cd000000000001004b000007960000613d0000000e020000290000000d012000fa000000180010008c000008b60000c13d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000e040000290000000b0340024f0000046f03300197000000ff0040008c0000000003002019000e00000003001d00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000008bc0000c13d000000400100043d000004a102000041000007bf0000013d000000400100043d000004a20200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c70000113600010430000300010000003d0000046a0010009c00000afb0000413d0000046b0010009c000300020000003d00000afb0000413d0000046c0010009c00000af40000813d000000030100003900000afa0000013d0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000047b011001c70000000e02000029113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007e40000c13d000000000005004b000007f50000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004af040000410000000e050000290000000006000411113411250000040f0000000100200190000001630000c13d00000000010000190000113600010430000000400100043d0000049d02000041000007bf0000013d0000049e01000041000000000010043f0000003201000039000000040010043f0000049f0100004100001136000104300000000d010000290000000c020000291134109f0000040f000000400100043d000800000001001d000004a50010009c000004320000213d00000008030000290000010001300039000000400010043f000000c0023000390000000c01000029000600000002001d0000000000120435000000a0023000390000000b01000029000700000002001d000000000012043500000080023000390000049601000041000500000002001d000000000012043500000060023000390000000a01000029000400000002001d000000000012043500000040023000390000000d01000029000200000002001d000000000012043500000020023000390000000e01000029000100000002001d000000000012043500000000010004110000000000130435000000e001300039000300000001001d00000000000104350000000901000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000080200002900000000020204330000046302200197000000000101043b000000000301041a000004a603300197000000000223019f000000000021041b0000000102000029000000000202043300000463022001970000000103100039000000000403041a000004a604400197000000000224019f000000000023041b0000000202000029000000000202043300000463022001970000000203100039000000000403041a000004a704400197000000000224019f00000004040000290000000004040433000000a0044002100000049404400197000000000242019f000000000023041b000000050200002900000000020204330000000303100039000000000023041b0000000302000029000000000202043300000090022002100000000603000029000000000303043300000020033002100000047303300197000000000232019f000000070300002900000000030304330000044e03300197000000000232019f0000000401100039000000000021041b000000400100043d00000060021000390000000a03000029000000000032043500000040021000390000000b03000029000000000032043500000020021000390000000c030000290000000000320435000000090200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a8011001c70000800d020000390000000403000039000004a9040000410000000e050000290000000d060000290000000007000411113411250000040f00000001002001900000081a0000613d0000000101000039000000000010041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e010080410000004001100210000004aa011001c7000011350001042e0000000d030000290000049a0030009c00000d240000413d0000000d03000029000004910030009c00000c920000c13d0000049e01000041000000000010043f0000001101000039000000040010043f0000049f0100004100001136000104300000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000000000101041a000800000001001d000700000002001d0000000401200039000900000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000d510000413d000000000521004b00000d510000a13d0000000903000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000007060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000d590000013d0000046d0010009c000300040000003d000009080000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c050000290000000308500039000009590000413d000000000521004b000009590000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f0000095f0000013d000004750060009c000009610000213d000000000042004b000009610000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d0000000001000411000000000010043f0000000301000039000000200010043f000000050000006b0000099e0000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b000009d90000c13d000004640120012a000009e00000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000a5c0000c13d000004640330012a00000464023000d1000000000003004b00000a660000c13d00000a690000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000a120000c13d0000000001010433000000000010043f0000000103000031000000010200003900000a380000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000a290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000a250000c13d0000001f0550019000000a360000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000a8c0000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000a690000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000030020006c0000090c0000413d000001ef0000013d0000000b04000029000004750040009c00000aa60000213d000000000032004b00000aa60000813d0000000b020000290000047602200197000000000121019f0000000a02000029000000000012041b0000000d010000290000000301100039000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000f550000c13d000000400100043d0000048e02000041000007bf0000013d000400010000003d0000046a0020009c00000dba0000413d0000046b0020009c000400020000003d00000dba0000413d0000046c0020009c00000db30000813d000000030100003900000db90000013d0000046d0010009c000300040000003d00000afb0000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000e00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000d00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030950003900000b4d0000413d000000000521004b00000b4d0000a13d0000000d08000029000000000408041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000609041a0000000005560019000000000059041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000018041b00000b550000013d000004750060009c0000000d0300002900000b550000213d000000000042004b00000b550000813d0000047602600197000000000121019f000000000013041b000c00000009001d000000050000006b00000c150000613d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b00000b920000c13d000004640120012a00000b990000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000bcb0000c13d0000000001010433000000000010043f0000000103000031000000010200003900000bf10000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000be20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000bde0000c13d0000001f0550019000000bef0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f000000010020019000000c830000c13d0000081a0000013d0000000701000029000000000101041a000004640110019800000b580000613d000b00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000c560000c13d000004640230012a00000464032000d1000000000002004b00000c600000c13d00000c630000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479022000d100000464032000d1000000000002004b00000c630000613d00000000022300d9000004640020009c000008b60000c13d0000000b023000fa000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000d04000029000000000104041a0000009002100270000000060220006a000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000014041b00000009020000290000000102200039000000030020006c00000aff0000413d000006ac0000013d0000000d030000290000000003300089000004640430019700000020032002700000046405300197000000000054004b00000000040580190000000003430049000000200330021000000473033001970000049702200197000000000223019f0000000a03000029000000000023041b000000400300043d000000240230003900000000004204350000047a02000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cee0000c13d00000001020000390000000001030433000000000010043f000000010300003100000d150000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000cc90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000cc50000c13d000000000005004b00000cd60000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000ce70000613d000000000141016f000000000113019f000000010010019000000d240000c13d000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000d460000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000d060000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d020000c13d000000000005004b00000d130000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d0000000701000029000000000101041a0000000a02000029000000000202041a0000044e02200197000000400300043d00000020043000390000000000240435000000a0011002700000044e01100197000000400230003900000000001204350000000d0100002900000000001304350000044e0030009c0000044e03008041000000400130021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000049b011001c70000800d0200003900000002030000390000049c040000410000000e05000029000008170000013d000000400100043d00000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300000000b04000029000004750040009c00000d5b0000213d000000000032004b00000d5b0000813d0000000b020000290000047602200197000000000121019f0000000902000029000000000012041b0000000c0000006b00000d630000c13d0000000a01000029000000000101041a000004640310019700000007010000290000000e0200002911340fbe0000040f0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000001041b0000000a01000029000000000101041a00000464021001970000000901000029000000000101041a00000090031002700000000002230049000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000902000029000000000012041b0000000a01000029000000000101041a00000070021002700000000d03000029000000050030008c00000da50000213d0000049a03000041000000010400008a0000049a0030009c000000000400c0190000000d03000029000000060330008900000018033000ca000001000530008900000000045401cf000004740530027f000000000445019f0000047404006041000004750330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f00000464011001970000007002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d020000390000000303000039000004a004000041000008150000013d0000046d0020009c000400040000003d00000dba0000413d0000046e0010009c00000006010000390000000501004039000400000001001d0000000501000029000004641010012a000300000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030850003900000e0b0000413d000000000521004b00000e0b0000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f00000e110000013d000004750060009c00000e130000213d000000000042004b00000e130000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b00000e530000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000005322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000005021000b9000000000323004b00000000040000390000000104004039000000000343004b00000e8e0000c13d000004640120012a00000e950000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000005433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000005032000b9000000000434004b00000000050000390000000105004039000000000454004b00000f110000c13d000004640330012a00000464023000d1000000000003004b00000f1b0000c13d00000f1e0000013d000004780030009c0000081a0000213d000004641010012a00000003011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000ec70000c13d0000000001010433000000000010043f0000000103000031000000010200003900000eed0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000ede0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000eda0000c13d0000001f0550019000000eeb0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000f410000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000003022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000f1e0000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000040020006c00000dbe0000413d0000028d0000013d000000000001042f000000400100043d000004ae02000041000007bf0000013d000000000301041a000004830030009c00000f5b0000a13d000000400100043d0000048d02000041000007bf0000013d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b0000000a01000029000000000101041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d0200003900000003030000390000048604000041000008150000013d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000fb70000613d00000003060000290000044e026001970000000203000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720060009c00000fae0000413d000000000521004b00000fae0000a13d0000000408000029000000000308041a000000900630027200000fb80000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000fb50000013d000004750060009c000000040800002900000fb60000213d000000000032004b00000fb60000813d0000047602600197000000000121019f000000000018041b000000000001042d000000000001042f0000049e01000041000000000010043f0000001201000039000000040010043f0000049f0100004100001136000104300004000000000002000200000003001d000400000002001d000300000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b000000000101041a000000000001004b000010870000613d00000003020000290000000302200039000000000202041a000100000002001d0000000001120049000004b30010009c000000000301001900000000030060190000000202000029000004640220019700000000432300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000032100a9000000000434004b00000000050000390000000105004039000000000454004b00000fff0000c13d000004640130012a000010070000013d000004780040009c000010850000213d000004642020012a000004641010012a00000000012100a9000004641010012a000000000113004900000479011000d1000200000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000102000029000000000021041b00000003010000290000000201100039000000000201041a000000400100043d0000002403100039000000020400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c0000103a0000c13d00000001020000390000000001010433000000000010043f0000000103000031000010610000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010520000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000104e0000c13d000000000005004b0000105f0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d00000001002001900000108f0000613d000000000254016f000000000223019f00000001002001900000108f0000613d000000020200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004800400004100000004050000290000000006000411113411250000040f0000000100200190000010850000613d000000000001042d00000000010000190000113600010430000000400100043d000004ae0200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c7000011360001043000000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300002000000000002000100000002001d000004b4020000410000000000200443000200000001001d000000040010044300000000010004140000044e0010009c0000044e01008041000000c001100210000004b5011001c700008002020000391134112a0000040f0000000100200190000010fe0000613d000000400300043d000000000101043b000000000001004b000010ff0000613d00000044013000390000000102000029000000000021043500000024013000390000000002000410000000000021043500000498010000410000000000130435000000040130003900000000020004110000000000210435000000000100041400000002020000290000046302200197000000040020008c000010c70000c13d00000001020000390000000001030433000000000010043f0000000103000031000010ee0000013d0000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010df0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010db0000c13d000000000005004b000010ec0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011060000613d000000000141016f000000000113019f0000000100100190000011060000613d000000000001042d000000000001042f000004b60100004100000000001304350000044e0030009c0000044e0300804100000040013002100000048c011001c70000113600010430000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c70000113600010430000000000001042f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000011230000613d000000000101043b000000000001042d0000000001000019000011360001043000001128002104210000000102000039000000000001042d0000000002000019000000000001042d0000112d002104230000000102000039000000000001042d0000000002000019000000000001042d00001132002104250000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000711c316a0000000000000000000000000000000000000000000000000000000093d1692e00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b90000000000000000000000000000000000000000000000000000000093d1692f00000000000000000000000000000000000000000000000000000000cc40105800000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000045a2cab0000000000000000000000000000000000000000000000000000000005eac6238000000000000000000000000000000000000000000000000000000005eac623900000000000000000000000000000000000000000000000000000000647211910000000000000000000000000000000000000000000000000000000045a2cab10000000000000000000000000000000000000000000000000000000058ff9fe500000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb0000000000000000000000000000000000000000000000000000000022e0772c000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff000000000000000000000000000000000000010000000080000000000000000000000000000000000000000000000000000000200000008000000000000000000200000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000005452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30399039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000040000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c1000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f5245454e5452414e4359000000000000000000000000000000000000000000005fd8a132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc8000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712ab4fa3fb3000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df81710000000000000000000000000000000000000000000000000000000008571217000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffeffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000000000000002000000000000000000000000000000000000800000000000000000000000008eabfc2cee883d317bfa1bc6b35c8ed8b90a9288dd10822f462da02177f2a1be0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce932d6d97084c2163485b42b77d74f52baf2e14b443d9c511dfc52958a1290c", + "deployedBytecode": "0x0003000000000002000e000000000002000000000c01034f00020000000c035500000000010c001900000060011002700000044e0010019d000000800d0000390000004000d0043f0000000100200190000000570000c13d0000044e03100197000000040030008c0000081a0000413d00000000010c043b000000e002100270000004500020009c000000610000213d00000000013c034f0000045a0020009c0000007e0000a13d0000045b0020009c000000e70000213d0000045e0020009c000001670000613d0000045f0020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b000000000102041a0000007004100272000007bd0000613d0000046a0010009c0000069d0000813d00000001030000390000078a0000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000010041b0000002001000039000001000010044300000120000004430000044f01000041000011350001042e000004510020009c000000c40000a13d000004520020009c0000014a0000213d000004550020009c000001a80000613d000004560020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d000000000010043f0000000301000039000000200010043f000e0000000c0353113411180000040f0000000e0200035f0000002402200370000000000202043b000000000020043f000000200010043f113411180000040f000002040000013d000004600020009c000002000000613d000004610020009c000002080000613d000004620020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d000000060230006c000006a40000813d000000400100043d000004b002000041000007bf0000013d000004570020009c000002240000613d000004580020009c000003ad0000613d000004590020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d0000002402c00370000000000202043b000e00000002001d000004630020009c0000081a0000213d000000000010043f0000000401000039000000200010043f113411180000040f0000000e02000029000000000020043f000000200010043f113411180000040f000000000101041a0000046402100197000000800020043f0000007001100270000000a00010043f0000048201000041000011350001042e0000045c0020009c000004110000613d0000045d0020009c0000081a0000c13d000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000002401c00370000000000301043b0000049000300198000004910100004100000000010060190000049202300197000000000121019f0000000402c00370000000000202043b000e00000002001d000d00000003001d000000000013004b0000081a0000c13d0000004401c00370000000000101043b000c00000001001d0000044e0010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000301043b000000000103041a00000463011001970000000002000411000000000012004b0000052e0000c13d0000000401300039000600000003001d0000000202300039000700000002001d000000000202041a000800000002001d000a00000001001d000000000101041a000900000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d00000009050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000004720050009c000006c00000413d000000000521004b000006c00000a13d0000000a03000029000000000303041a0000009006300272000006d80000c13d0000049e01000041000000000010043f0000001201000039000000040010043f0000049f010000410000113600010430000004530020009c000004380000613d000004540020009c0000081a0000c13d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000200041a000000010020008c0000045f0000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b000004690000813d000000000010043f000000200020043f113411180000040f11340f760000040f0000000101000039000000000010041b0000000001000019000011350001042e000000a40030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d000004630010009c0000081a0000213d0000004401c00370000000000101043b000c00000001001d000004640010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d0000008401c00370000000000101043b000a00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000c0000006b000004690000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000b0010006b0000000b02008029000b00000002001d0000000a0020006c0000074a0000813d0000000102000039000000000102041a0000000101100039000000000012041b000900000001001d000004a40010009c000008250000413d000000400100043d000004ab02000041000007bf0000013d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010100002900000006020000291134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d0000000602300029000004640020009c000008b60000213d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000006c70000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000481040000410000000105000029000008160000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000101041a000000800010043f0000046601000041000011350001042e000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000f02043b0000048700f0009c0000081a0000213d0000002302f00039000000000032004b0000081a0000813d0000000402f0003900000000022c034f000000000202043b000c00000002001d000004870020009c0000081a0000213d000e002400f0003d0000000c0200002900000005022002100000000e02200029000000000032004b0000081a0000213d0000000c0000006b0000046d0000c13d0000000001000019000011350001042e000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000004640010009c0000081a0000213d0000004402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000504043b000004870050009c000004320000213d00000005045002100000003f064000390000048806600197000004890060009c000004320000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b0000081a0000213d000000000005004b000002530000613d000000a00300003900000000052c034f000000000505043b00000000035304360000002002200039000000000042004b0000024d0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b0000081a0000c13d000000000200041a000000010020008c000006d10000c13d0000000202000039000000000020041b00000464021001970000000e01000029000600000002001d1134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046302200197000200000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000500000003001d0000000602300029000004640020009c000008b60000213d0000046803100197000000000232019f0000000703000029000000000023041b000004690020009c00000aea0000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004810400004100000002050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b000000800100043d000700000001001d000000000001004b000002220000613d0000000004000019000000800100043d000000000041004b00008010030000390000081f0000a13d000900000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b000e00000004001d000000010140008a000000000202041a000000000021004b0000081c0000813d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700000000020300191134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000800000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000040e0000613d0000000d020000290000000201200039000000000101041a000a00000001001d0000000401200039000c00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b070000290000044e037001970000000a02000029000000a0022002700000044e04200197000000000501043b000000000045004b00000000020400190000000002054019000004720070009c0000000d0100002900000003011000390000033e0000413d000000000632004b0000033e0000a13d0000000c09000029000000000509041a0000009007500272000001440000613d00000000033400490000002004500270000004640840019700000000066800a900000000033600d900000464063000d100000000067600d9000000000701041a0000000006670019000000000061041b0000000003340049000000200330021000000473033001970000047404500197000000000334019f000000000223019f000000000029041b000003460000013d000004750070009c000003460000213d000000000053004b000003460000813d0000047603700197000000000232019f0000000c03000029000000000023041b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000802000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000ae70000613d000000000301041a0000046e0030009c0000000c0500002900000f580000813d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000015041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d02000039000000030300003900000486040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b00000009040000290000000104400039000000070040006c000002a80000413d000002220000013d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000301043b000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b000004690000813d000e00000003001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000c00000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000074d0000c13d000000400100043d0000048f02000041000007bf0000013d000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000404043b000600000004001d000004870040009c0000081a0000213d000500240020003d000000060200002900000005022002100000000504200029000000000034004b0000081a0000213d000000000300041a000000010030008c0000045f0000c13d0000000203000039000000000030041b0000003f032000390000048803300197000004890030009c000005040000a13d0000049e01000041000000000010043f0000004101000039000000040010043f0000049f010000410000113600010430000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f113411180000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a0000046301100197000000800010043f0000046301500197000000a00010043f0000046301400197000000c00010043f000000a0014002700000044e01100197000000e00010043f000001000030043f0000044e01200197000001200010043f00000020012002700000046401100197000001400010043f0000009001200270000001600010043f0000046501000041000011350001042e0000047d01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000048a01000041000000c40010043f000004ad0100004100001136000104300000049d01000041000000800010043f000004ac010000410000113600010430000000200e00008a0000000005000019000b0000000f001d0000000004f30049000d00000005001d00000005025002100000000e0220002900000000022c034f000000000202043b000000430440008a0000049a054001970000049a06200197000000000756013f000000000056004b00000000050000190000049a05002041000000000042004b00000000040000190000049a040040410000049a0070009c000000000504c019000000000005004b0000081a0000613d0000000e0420002900000000024c034f000000000b02043b0000048700b0009c0000081a0000213d0000000005b3004900000020044000390000049a065001970000049a07400197000000000867013f000000000067004b00000000060000190000049a06004041000000000054004b00000000050000190000049a050020410000049a0080009c000000000605c019000000000006004b0000081a0000c13d00000000064c034f0000000007eb0170000000400400043d0000000005740019000004a30000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b0000049f0000c13d0000001f08b00190000004b00000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000004b90000c13d00000001060000310000000102000039000004cf0000013d0000044e00b0009c0000044e0b0080410000006001b002100000044e0040009c0000044e040080410000004003400210000000000113019f0000044e0050009c0000044e05008041000000c003500210000000000113019f1134112f0000040f0000000b0f000029000000200e00008a000000800d0000390000000003000031000000020c000367000000010220018f000000000401001900000060044002700001044e0040019d0000044e06400197000000000006004b00000000040d00190000006005000039000004fa0000613d000004b10060009c000004320000813d0000001f046000390000000004e4016f0000003f044000390000000004e4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000004870040009c000004320000213d0000000100700190000004320000c13d000000400040043f00000000046504360000000008e601700000000007840019000004ed0000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000004e90000c13d0000001f06600190000004fa0000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b0000067c0000613d0000000d0500002900000001055000390000000c0050006c000004700000413d000002220000013d000000400100043d0000048b02000041000007bf0000013d0000008003300039000000400030043f0000000603000029000000800030043f0000001f0320018f000000000002004b000005110000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000050d0000c13d000000000003004b000000060000006b000005310000c13d0000000101000039000000000010041b0000002002000039000000400100043d0000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005250000613d000000a0040000390000000005000019000000004604043400000000026204360000000105500039000000000035004b000005200000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e000000400100043d0000049302000041000007bf0000013d0000000002000019000900000002001d0000000502200210000700000002001d0000000501200029000e00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b0000081c0000813d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000b00000001001d000d00000002001d0000000401200039000a00000001001d000000000101041a000c00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000c060000290000044e026001970000000b03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000d070000290000000308700039000b00000008001d000005850000413d000000000521004b000005850000a13d0000000a09000029000000000409041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000019041b0000058d0000013d000004750060009c0000000a030000290000058d0000213d000000000042004b0000058d0000813d0000047602600197000000000121019f000000000013041b0000000e010000290000000201100367000000000101043b000e00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000d0100002900000464011001970000000b03000029000000000303041a000c00000003001d0000000002230049000004b30020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000005ed0000c13d000004640130012a000005f50000013d000004780040009c0000081a0000213d000004641010012a000004642020012a00000000011200a9000004641010012a000000000113004900000479011000d1000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000d0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c000006270000c13d0000000001010433000000000010043f000000010300003100000001020000390000064d0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c0000002005000039000000000503401900000020045001900000063e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000063a0000c13d0000001f055001900000064b0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000d0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d000000800100043d0000000902000029000000000021004b0000081f0000a13d0000000701000029000000a0011000390000000d0300002900000000003104350000000102200039000000060020006c000005320000413d000005140000013d000000400100043d000004b20200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000006900000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000006890000413d0000001f042000390000000004e4016f0000000002230019000000000002043500000044024000390000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f00001136000104300000046b0010009c00000002030000390000078a0000413d0000046c0010009c000007840000813d00000003030000390000078a0000013d000004690020009c000008b60000813d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000007c50000813d000000400100043d0000002402100039000000060300002900000000003204350000047a020000410000000000210435000000040210003900000000030004110000000000320435000000000200041400000001030000290000046303300197000e00000003001d000000040030008c000007cf0000c13d00000001020000390000000001010433000000000010043f0000000103000031000007f70000013d000004750060009c000006ec0000213d000000000032004b000006ec0000813d0000047602600197000000000121019f000006ea0000013d000300010000003d0000046a0010009c000009080000413d0000046b0010009c000300020000003d000009080000413d0000046c0010009c000009010000813d0000000301000039000009070000013d000000400100043d00000044021000390000048a03000041000000000032043500000024021000390000000a0300003900000d460000013d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000006060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f0000000a02000029000000000012041b0000000c01000029000c044e0010019c000007030000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000c0010006b0000000c020080290000000a03000029000000000103041a0000047601100197000000000121019f000000000013041b0000000b0000006b000007080000c13d0000000701000029000000000101041a0000071d0000013d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000000b0010006b0000000b01008029000000a00110021000000494011001970000000703000029000000000203041a0000049502200197000000000121019f000000000013041b000000a0021002700000044e032001970000000a02000029000000000202041a0000044e04200197000000000034004b0000074a0000813d0000000d03000029000004960030009c000008b00000213d0000000d0000006b000008b00000613d0000000d030000290000046404300197000000200320027000000464033001970000000003430019000004640030009c000008b60000213d000004970220019700000020033002100000047303300197000000000223019f0000000a03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000049802000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cb10000c13d00000001020000390000000001030433000000000010043f000000010300003100000cd80000013d000000400100043d000004a302000041000007bf0000013d0000000d020000290000000201200039000000000101041a000900000001001d0000000401200039000a00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000903000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000a9c0000413d000000000521004b00000a9c0000a13d0000000a03000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d90000000d060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000aa40000013d0000046d0010009c00000004030000390000078a0000413d0000046e0010009c000000060300003900000005030040390000000d0030006b000007bd0000813d000b00000004001d000a00000002001d0000000d01000029000e0018001000cd000000000001004b000007960000613d0000000e020000290000000d012000fa000000180010008c000008b60000c13d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000e040000290000000b0340024f0000046f03300197000000ff0040008c0000000003002019000e00000003001d00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000008bc0000c13d000000400100043d000004a102000041000007bf0000013d000000400100043d000004a20200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c70000113600010430000300010000003d0000046a0010009c00000afb0000413d0000046b0010009c000300020000003d00000afb0000413d0000046c0010009c00000af40000813d000000030100003900000afa0000013d0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000047b011001c70000000e02000029113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007e40000c13d000000000005004b000007f50000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004af040000410000000e050000290000000006000411113411250000040f0000000100200190000001630000c13d00000000010000190000113600010430000000400100043d0000049d02000041000007bf0000013d0000049e01000041000000000010043f0000003201000039000000040010043f0000049f0100004100001136000104300000000d010000290000000c020000291134109f0000040f000000400100043d000800000001001d000004a50010009c000004320000213d00000008030000290000010001300039000000400010043f000000c0023000390000000c01000029000600000002001d0000000000120435000000a0023000390000000b01000029000700000002001d000000000012043500000080023000390000049601000041000500000002001d000000000012043500000060023000390000000a01000029000400000002001d000000000012043500000040023000390000000d01000029000200000002001d000000000012043500000020023000390000000e01000029000100000002001d000000000012043500000000010004110000000000130435000000e001300039000300000001001d00000000000104350000000901000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000080200002900000000020204330000046302200197000000000101043b000000000301041a000004a603300197000000000223019f000000000021041b0000000102000029000000000202043300000463022001970000000103100039000000000403041a000004a604400197000000000224019f000000000023041b0000000202000029000000000202043300000463022001970000000203100039000000000403041a000004a704400197000000000224019f00000004040000290000000004040433000000a0044002100000049404400197000000000242019f000000000023041b000000050200002900000000020204330000000303100039000000000023041b0000000302000029000000000202043300000090022002100000000603000029000000000303043300000020033002100000047303300197000000000232019f000000070300002900000000030304330000044e03300197000000000232019f0000000401100039000000000021041b000000400100043d00000060021000390000000a03000029000000000032043500000040021000390000000b03000029000000000032043500000020021000390000000c030000290000000000320435000000090200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a8011001c70000800d020000390000000403000039000004a9040000410000000e050000290000000d060000290000000007000411113411250000040f00000001002001900000081a0000613d0000000101000039000000000010041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e010080410000004001100210000004aa011001c7000011350001042e0000000d030000290000049a0030009c00000d240000413d0000000d03000029000004910030009c00000c920000c13d0000049e01000041000000000010043f0000001101000039000000040010043f0000049f0100004100001136000104300000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000000000101041a000800000001001d000700000002001d0000000401200039000900000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000d510000413d000000000521004b00000d510000a13d0000000903000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000007060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000d590000013d0000046d0010009c000300040000003d000009080000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c050000290000000308500039000009590000413d000000000521004b000009590000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f0000095f0000013d000004750060009c000009610000213d000000000042004b000009610000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d0000000001000411000000000010043f0000000301000039000000200010043f000000050000006b0000099e0000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b000009d90000c13d000004640120012a000009e00000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000a5c0000c13d000004640330012a00000464023000d1000000000003004b00000a660000c13d00000a690000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000a120000c13d0000000001010433000000000010043f0000000103000031000000010200003900000a380000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000a290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000a250000c13d0000001f0550019000000a360000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000a8c0000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000a690000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000030020006c0000090c0000413d000001ef0000013d0000000b04000029000004750040009c00000aa60000213d000000000032004b00000aa60000813d0000000b020000290000047602200197000000000121019f0000000a02000029000000000012041b0000000d010000290000000301100039000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000f550000c13d000000400100043d0000048e02000041000007bf0000013d000400010000003d0000046a0020009c00000dba0000413d0000046b0020009c000400020000003d00000dba0000413d0000046c0020009c00000db30000813d000000030100003900000db90000013d0000046d0010009c000300040000003d00000afb0000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000e00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000d00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030950003900000b4d0000413d000000000521004b00000b4d0000a13d0000000d08000029000000000408041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000609041a0000000005560019000000000059041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000018041b00000b550000013d000004750060009c0000000d0300002900000b550000213d000000000042004b00000b550000813d0000047602600197000000000121019f000000000013041b000c00000009001d000000050000006b00000c150000613d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b00000b920000c13d000004640120012a00000b990000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000bcb0000c13d0000000001010433000000000010043f0000000103000031000000010200003900000bf10000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000be20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000bde0000c13d0000001f0550019000000bef0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f000000010020019000000c830000c13d0000081a0000013d0000000701000029000000000101041a000004640110019800000b580000613d000b00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000c560000c13d000004640230012a00000464032000d1000000000002004b00000c600000c13d00000c630000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479022000d100000464032000d1000000000002004b00000c630000613d00000000022300d9000004640020009c000008b60000c13d0000000b023000fa000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000d04000029000000000104041a0000009002100270000000060220006a000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000014041b00000009020000290000000102200039000000030020006c00000aff0000413d000006ac0000013d0000000d030000290000000003300089000004640430019700000020032002700000046405300197000000000054004b00000000040580190000000003430049000000200330021000000473033001970000049702200197000000000223019f0000000a03000029000000000023041b000000400300043d000000240230003900000000004204350000047a02000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cee0000c13d00000001020000390000000001030433000000000010043f000000010300003100000d150000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000cc90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000cc50000c13d000000000005004b00000cd60000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000ce70000613d000000000141016f000000000113019f000000010010019000000d240000c13d000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000d460000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000d060000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d020000c13d000000000005004b00000d130000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d0000000701000029000000000101041a0000000a02000029000000000202041a0000044e02200197000000400300043d00000020043000390000000000240435000000a0011002700000044e01100197000000400230003900000000001204350000000d0100002900000000001304350000044e0030009c0000044e03008041000000400130021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000049b011001c70000800d0200003900000002030000390000049c040000410000000e05000029000008170000013d000000400100043d00000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300000000b04000029000004750040009c00000d5b0000213d000000000032004b00000d5b0000813d0000000b020000290000047602200197000000000121019f0000000902000029000000000012041b0000000c0000006b00000d630000c13d0000000a01000029000000000101041a000004640310019700000007010000290000000e0200002911340fbe0000040f0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000001041b0000000a01000029000000000101041a00000464021001970000000901000029000000000101041a00000090031002700000000002230049000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000902000029000000000012041b0000000a01000029000000000101041a00000070021002700000000d03000029000000050030008c00000da50000213d0000049a03000041000000010400008a0000049a0030009c000000000400c0190000000d03000029000000060330008900000018033000ca000001000530008900000000045401cf000004740530027f000000000445019f0000047404006041000004750330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f00000464011001970000007002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d020000390000000303000039000004a004000041000008150000013d0000046d0020009c000400040000003d00000dba0000413d0000046e0010009c00000006010000390000000501004039000400000001001d0000000501000029000004641010012a000300000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030850003900000e0b0000413d000000000521004b00000e0b0000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f00000e110000013d000004750060009c00000e130000213d000000000042004b00000e130000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b00000e530000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000005322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000005021000b9000000000323004b00000000040000390000000104004039000000000343004b00000e8e0000c13d000004640120012a00000e950000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000005433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000005032000b9000000000434004b00000000050000390000000105004039000000000454004b00000f110000c13d000004640330012a00000464023000d1000000000003004b00000f1b0000c13d00000f1e0000013d000004780030009c0000081a0000213d000004641010012a00000003011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000ec70000c13d0000000001010433000000000010043f0000000103000031000000010200003900000eed0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000ede0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000eda0000c13d0000001f0550019000000eeb0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000f410000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000003022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000f1e0000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000040020006c00000dbe0000413d0000028d0000013d000000000001042f000000400100043d000004ae02000041000007bf0000013d000000000301041a000004830030009c00000f5b0000a13d000000400100043d0000048d02000041000007bf0000013d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b0000000a01000029000000000101041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d0200003900000003030000390000048604000041000008150000013d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000fb70000613d00000003060000290000044e026001970000000203000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720060009c00000fae0000413d000000000521004b00000fae0000a13d0000000408000029000000000308041a000000900630027200000fb80000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000fb50000013d000004750060009c000000040800002900000fb60000213d000000000032004b00000fb60000813d0000047602600197000000000121019f000000000018041b000000000001042d000000000001042f0000049e01000041000000000010043f0000001201000039000000040010043f0000049f0100004100001136000104300004000000000002000200000003001d000400000002001d000300000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b000000000101041a000000000001004b000010870000613d00000003020000290000000302200039000000000202041a000100000002001d0000000001120049000004b30010009c000000000301001900000000030060190000000202000029000004640220019700000000432300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000032100a9000000000434004b00000000050000390000000105004039000000000454004b00000fff0000c13d000004640130012a000010070000013d000004780040009c000010850000213d000004642020012a000004641010012a00000000012100a9000004641010012a000000000113004900000479011000d1000200000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000102000029000000000021041b00000003010000290000000201100039000000000201041a000000400100043d0000002403100039000000020400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c0000103a0000c13d00000001020000390000000001010433000000000010043f0000000103000031000010610000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010520000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000104e0000c13d000000000005004b0000105f0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d00000001002001900000108f0000613d000000000254016f000000000223019f00000001002001900000108f0000613d000000020200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004800400004100000004050000290000000006000411113411250000040f0000000100200190000010850000613d000000000001042d00000000010000190000113600010430000000400100043d000004ae0200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c7000011360001043000000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300002000000000002000100000002001d000004b4020000410000000000200443000200000001001d000000040010044300000000010004140000044e0010009c0000044e01008041000000c001100210000004b5011001c700008002020000391134112a0000040f0000000100200190000010fe0000613d000000400300043d000000000101043b000000000001004b000010ff0000613d00000044013000390000000102000029000000000021043500000024013000390000000002000410000000000021043500000498010000410000000000130435000000040130003900000000020004110000000000210435000000000100041400000002020000290000046302200197000000040020008c000010c70000c13d00000001020000390000000001030433000000000010043f0000000103000031000010ee0000013d0000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010df0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010db0000c13d000000000005004b000010ec0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011060000613d000000000141016f000000000113019f0000000100100190000011060000613d000000000001042d000000000001042f000004b60100004100000000001304350000044e0030009c0000044e0300804100000040013002100000048c011001c70000113600010430000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c70000113600010430000000000001042f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000011230000613d000000000101043b000000000001042d0000000001000019000011360001043000001128002104210000000102000039000000000001042d0000000002000019000000000001042d0000112d002104230000000102000039000000000001042d0000000002000019000000000001042d00001132002104250000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000711c316a0000000000000000000000000000000000000000000000000000000093d1692e00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b90000000000000000000000000000000000000000000000000000000093d1692f00000000000000000000000000000000000000000000000000000000cc40105800000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000045a2cab0000000000000000000000000000000000000000000000000000000005eac6238000000000000000000000000000000000000000000000000000000005eac623900000000000000000000000000000000000000000000000000000000647211910000000000000000000000000000000000000000000000000000000045a2cab10000000000000000000000000000000000000000000000000000000058ff9fe500000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb0000000000000000000000000000000000000000000000000000000022e0772c000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff000000000000000000000000000000000000010000000080000000000000000000000000000000000000000000000000000000200000008000000000000000000200000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000005452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30399039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000040000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c1000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f5245454e5452414e4359000000000000000000000000000000000000000000005fd8a132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc8000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712ab4fa3fb3000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df81710000000000000000000000000000000000000000000000000000000008571217000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffeffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000000000000002000000000000000000000000000000000000800000000000000000000000008eabfc2cee883d317bfa1bc6b35c8ed8b90a9288dd10822f462da02177f2a1be0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce932d6d97084c2163485b42b77d74f52baf2e14b443d9c511dfc52958a1290c", + "devdoc": { + "kind": "dev", + "methods": { + "unsubscribeFromIncentive(address,uint256,bool)": { + "params": { + "incentiveIndex": "∈ [0,5]" + } + } + }, + "stateVariables": { + "rewardPerLiquidityLast": { + "details": "rewardPerLiquidityLast[user][incentiveId]Semantic overload: if value is zero user isn't subscribed to the incentive." + }, + "userStakes": { + "details": "userStakes[user][stakedToken]" + } + }, + "title": "Fork of https://github.com/sushiswap/StakingContract", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Permissionless staking contract that allows any number of incentives to be running for any token (erc20). Incentives can be created by anyone, the total reward amount must be sent at creation. Incentives can be updated (change reward rate / duration). Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 90174, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "locked", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 34, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "incentiveCount", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 39, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "incentives", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_struct(Incentive)32_storage)" + }, + { + "astId": 46, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardPerLiquidityLast", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))" + }, + { + "astId": 54, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "userStakes", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_mapping(t_address,t_struct(UserStake)59_storage))" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_struct(UserStake)59_storage))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => struct StakingContractMainnet.UserStake))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_struct(UserStake)59_storage)" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_uint256,t_uint256)" + }, + "t_mapping(t_address,t_struct(UserStake)59_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct StakingContractMainnet.UserStake)", + "numberOfBytes": "32", + "value": "t_struct(UserStake)59_storage" + }, + "t_mapping(t_uint256,t_struct(Incentive)32_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct StakingContractMainnet.Incentive)", + "numberOfBytes": "32", + "value": "t_struct(Incentive)32_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(Incentive)32_storage": { + "encoding": "inplace", + "label": "struct StakingContractMainnet.Incentive", + "members": [ + { + "astId": 17, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "creator", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 19, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "token", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 21, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardToken", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 23, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "endTime", + "offset": 20, + "slot": "2", + "type": "t_uint32" + }, + { + "astId": 25, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardPerLiquidity", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 27, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "lastRewardTime", + "offset": 0, + "slot": "4", + "type": "t_uint32" + }, + { + "astId": 29, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardRemaining", + "offset": 4, + "slot": "4", + "type": "t_uint112" + }, + { + "astId": 31, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "liquidityStaked", + "offset": 18, + "slot": "4", + "type": "t_uint112" + } + ], + "numberOfBytes": "160" + }, + "t_struct(UserStake)59_storage": { + "encoding": "inplace", + "label": "struct StakingContractMainnet.UserStake", + "members": [ + { + "astId": 56, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "liquidity", + "offset": 0, + "slot": "0", + "type": "t_uint112" + }, + { + "astId": 58, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "subscribedIncentiveIds", + "offset": 14, + "slot": "0", + "type": "t_uint144" + } + ], + "numberOfBytes": "32" + }, + "t_uint112": { + "encoding": "inplace", + "label": "uint112", + "numberOfBytes": "14" + }, + "t_uint144": { + "encoding": "inplace", + "label": "uint144", + "numberOfBytes": "18" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + } + } + }, + "factoryDeps": [ + "0x0003000000000002000e000000000002000000000c01034f00020000000c035500000000010c001900000060011002700000044e0010019d000000800d0000390000004000d0043f0000000100200190000000570000c13d0000044e03100197000000040030008c0000081a0000413d00000000010c043b000000e002100270000004500020009c000000610000213d00000000013c034f0000045a0020009c0000007e0000a13d0000045b0020009c000000e70000213d0000045e0020009c000001670000613d0000045f0020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b000000000102041a0000007004100272000007bd0000613d0000046a0010009c0000069d0000813d00000001030000390000078a0000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000010041b0000002001000039000001000010044300000120000004430000044f01000041000011350001042e000004510020009c000000c40000a13d000004520020009c0000014a0000213d000004550020009c000001a80000613d000004560020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d000000000010043f0000000301000039000000200010043f000e0000000c0353113411180000040f0000000e0200035f0000002402200370000000000202043b000000000020043f000000200010043f113411180000040f000002040000013d000004600020009c000002000000613d000004610020009c000002080000613d000004620020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d000000060230006c000006a40000813d000000400100043d000004b002000041000007bf0000013d000004570020009c000002240000613d000004580020009c000003ad0000613d000004590020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d0000002402c00370000000000202043b000e00000002001d000004630020009c0000081a0000213d000000000010043f0000000401000039000000200010043f113411180000040f0000000e02000029000000000020043f000000200010043f113411180000040f000000000101041a0000046402100197000000800020043f0000007001100270000000a00010043f0000048201000041000011350001042e0000045c0020009c000004110000613d0000045d0020009c0000081a0000c13d000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000002401c00370000000000301043b0000049000300198000004910100004100000000010060190000049202300197000000000121019f0000000402c00370000000000202043b000e00000002001d000d00000003001d000000000013004b0000081a0000c13d0000004401c00370000000000101043b000c00000001001d0000044e0010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000301043b000000000103041a00000463011001970000000002000411000000000012004b0000052e0000c13d0000000401300039000600000003001d0000000202300039000700000002001d000000000202041a000800000002001d000a00000001001d000000000101041a000900000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d00000009050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000004720050009c000006c00000413d000000000521004b000006c00000a13d0000000a03000029000000000303041a0000009006300272000006d80000c13d0000049e01000041000000000010043f0000001201000039000000040010043f0000049f010000410000113600010430000004530020009c000004380000613d000004540020009c0000081a0000c13d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000200041a000000010020008c0000045f0000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b000004690000813d000000000010043f000000200020043f113411180000040f11340f760000040f0000000101000039000000000010041b0000000001000019000011350001042e000000a40030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d000004630010009c0000081a0000213d0000004401c00370000000000101043b000c00000001001d000004640010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d0000008401c00370000000000101043b000a00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000c0000006b000004690000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000b0010006b0000000b02008029000b00000002001d0000000a0020006c0000074a0000813d0000000102000039000000000102041a0000000101100039000000000012041b000900000001001d000004a40010009c000008250000413d000000400100043d000004ab02000041000007bf0000013d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010100002900000006020000291134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d0000000602300029000004640020009c000008b60000213d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000006c70000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000481040000410000000105000029000008160000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000101041a000000800010043f0000046601000041000011350001042e000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000f02043b0000048700f0009c0000081a0000213d0000002302f00039000000000032004b0000081a0000813d0000000402f0003900000000022c034f000000000202043b000c00000002001d000004870020009c0000081a0000213d000e002400f0003d0000000c0200002900000005022002100000000e02200029000000000032004b0000081a0000213d0000000c0000006b0000046d0000c13d0000000001000019000011350001042e000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000004640010009c0000081a0000213d0000004402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000504043b000004870050009c000004320000213d00000005045002100000003f064000390000048806600197000004890060009c000004320000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b0000081a0000213d000000000005004b000002530000613d000000a00300003900000000052c034f000000000505043b00000000035304360000002002200039000000000042004b0000024d0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b0000081a0000c13d000000000200041a000000010020008c000006d10000c13d0000000202000039000000000020041b00000464021001970000000e01000029000600000002001d1134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046302200197000200000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000500000003001d0000000602300029000004640020009c000008b60000213d0000046803100197000000000232019f0000000703000029000000000023041b000004690020009c00000aea0000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004810400004100000002050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b000000800100043d000700000001001d000000000001004b000002220000613d0000000004000019000000800100043d000000000041004b00008010030000390000081f0000a13d000900000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b000e00000004001d000000010140008a000000000202041a000000000021004b0000081c0000813d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700000000020300191134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000800000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000040e0000613d0000000d020000290000000201200039000000000101041a000a00000001001d0000000401200039000c00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b070000290000044e037001970000000a02000029000000a0022002700000044e04200197000000000501043b000000000045004b00000000020400190000000002054019000004720070009c0000000d0100002900000003011000390000033e0000413d000000000632004b0000033e0000a13d0000000c09000029000000000509041a0000009007500272000001440000613d00000000033400490000002004500270000004640840019700000000066800a900000000033600d900000464063000d100000000067600d9000000000701041a0000000006670019000000000061041b0000000003340049000000200330021000000473033001970000047404500197000000000334019f000000000223019f000000000029041b000003460000013d000004750070009c000003460000213d000000000053004b000003460000813d0000047603700197000000000232019f0000000c03000029000000000023041b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000802000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000ae70000613d000000000301041a0000046e0030009c0000000c0500002900000f580000813d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000015041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d02000039000000030300003900000486040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b00000009040000290000000104400039000000070040006c000002a80000413d000002220000013d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000301043b000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b000004690000813d000e00000003001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000c00000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000074d0000c13d000000400100043d0000048f02000041000007bf0000013d000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000404043b000600000004001d000004870040009c0000081a0000213d000500240020003d000000060200002900000005022002100000000504200029000000000034004b0000081a0000213d000000000300041a000000010030008c0000045f0000c13d0000000203000039000000000030041b0000003f032000390000048803300197000004890030009c000005040000a13d0000049e01000041000000000010043f0000004101000039000000040010043f0000049f010000410000113600010430000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f113411180000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a0000046301100197000000800010043f0000046301500197000000a00010043f0000046301400197000000c00010043f000000a0014002700000044e01100197000000e00010043f000001000030043f0000044e01200197000001200010043f00000020012002700000046401100197000001400010043f0000009001200270000001600010043f0000046501000041000011350001042e0000047d01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000048a01000041000000c40010043f000004ad0100004100001136000104300000049d01000041000000800010043f000004ac010000410000113600010430000000200e00008a0000000005000019000b0000000f001d0000000004f30049000d00000005001d00000005025002100000000e0220002900000000022c034f000000000202043b000000430440008a0000049a054001970000049a06200197000000000756013f000000000056004b00000000050000190000049a05002041000000000042004b00000000040000190000049a040040410000049a0070009c000000000504c019000000000005004b0000081a0000613d0000000e0420002900000000024c034f000000000b02043b0000048700b0009c0000081a0000213d0000000005b3004900000020044000390000049a065001970000049a07400197000000000867013f000000000067004b00000000060000190000049a06004041000000000054004b00000000050000190000049a050020410000049a0080009c000000000605c019000000000006004b0000081a0000c13d00000000064c034f0000000007eb0170000000400400043d0000000005740019000004a30000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b0000049f0000c13d0000001f08b00190000004b00000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000004b90000c13d00000001060000310000000102000039000004cf0000013d0000044e00b0009c0000044e0b0080410000006001b002100000044e0040009c0000044e040080410000004003400210000000000113019f0000044e0050009c0000044e05008041000000c003500210000000000113019f1134112f0000040f0000000b0f000029000000200e00008a000000800d0000390000000003000031000000020c000367000000010220018f000000000401001900000060044002700001044e0040019d0000044e06400197000000000006004b00000000040d00190000006005000039000004fa0000613d000004b10060009c000004320000813d0000001f046000390000000004e4016f0000003f044000390000000004e4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000004870040009c000004320000213d0000000100700190000004320000c13d000000400040043f00000000046504360000000008e601700000000007840019000004ed0000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000004e90000c13d0000001f06600190000004fa0000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b0000067c0000613d0000000d0500002900000001055000390000000c0050006c000004700000413d000002220000013d000000400100043d0000048b02000041000007bf0000013d0000008003300039000000400030043f0000000603000029000000800030043f0000001f0320018f000000000002004b000005110000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000050d0000c13d000000000003004b000000060000006b000005310000c13d0000000101000039000000000010041b0000002002000039000000400100043d0000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005250000613d000000a0040000390000000005000019000000004604043400000000026204360000000105500039000000000035004b000005200000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e000000400100043d0000049302000041000007bf0000013d0000000002000019000900000002001d0000000502200210000700000002001d0000000501200029000e00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b0000081c0000813d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000b00000001001d000d00000002001d0000000401200039000a00000001001d000000000101041a000c00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000c060000290000044e026001970000000b03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000d070000290000000308700039000b00000008001d000005850000413d000000000521004b000005850000a13d0000000a09000029000000000409041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000019041b0000058d0000013d000004750060009c0000000a030000290000058d0000213d000000000042004b0000058d0000813d0000047602600197000000000121019f000000000013041b0000000e010000290000000201100367000000000101043b000e00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000d0100002900000464011001970000000b03000029000000000303041a000c00000003001d0000000002230049000004b30020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000005ed0000c13d000004640130012a000005f50000013d000004780040009c0000081a0000213d000004641010012a000004642020012a00000000011200a9000004641010012a000000000113004900000479011000d1000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000d0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c000006270000c13d0000000001010433000000000010043f000000010300003100000001020000390000064d0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c0000002005000039000000000503401900000020045001900000063e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000063a0000c13d0000001f055001900000064b0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000d0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d000000800100043d0000000902000029000000000021004b0000081f0000a13d0000000701000029000000a0011000390000000d0300002900000000003104350000000102200039000000060020006c000005320000413d000005140000013d000000400100043d000004b20200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000006900000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000006890000413d0000001f042000390000000004e4016f0000000002230019000000000002043500000044024000390000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f00001136000104300000046b0010009c00000002030000390000078a0000413d0000046c0010009c000007840000813d00000003030000390000078a0000013d000004690020009c000008b60000813d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000007c50000813d000000400100043d0000002402100039000000060300002900000000003204350000047a020000410000000000210435000000040210003900000000030004110000000000320435000000000200041400000001030000290000046303300197000e00000003001d000000040030008c000007cf0000c13d00000001020000390000000001010433000000000010043f0000000103000031000007f70000013d000004750060009c000006ec0000213d000000000032004b000006ec0000813d0000047602600197000000000121019f000006ea0000013d000300010000003d0000046a0010009c000009080000413d0000046b0010009c000300020000003d000009080000413d0000046c0010009c000009010000813d0000000301000039000009070000013d000000400100043d00000044021000390000048a03000041000000000032043500000024021000390000000a0300003900000d460000013d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000006060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f0000000a02000029000000000012041b0000000c01000029000c044e0010019c000007030000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000c0010006b0000000c020080290000000a03000029000000000103041a0000047601100197000000000121019f000000000013041b0000000b0000006b000007080000c13d0000000701000029000000000101041a0000071d0000013d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000000b0010006b0000000b01008029000000a00110021000000494011001970000000703000029000000000203041a0000049502200197000000000121019f000000000013041b000000a0021002700000044e032001970000000a02000029000000000202041a0000044e04200197000000000034004b0000074a0000813d0000000d03000029000004960030009c000008b00000213d0000000d0000006b000008b00000613d0000000d030000290000046404300197000000200320027000000464033001970000000003430019000004640030009c000008b60000213d000004970220019700000020033002100000047303300197000000000223019f0000000a03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000049802000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cb10000c13d00000001020000390000000001030433000000000010043f000000010300003100000cd80000013d000000400100043d000004a302000041000007bf0000013d0000000d020000290000000201200039000000000101041a000900000001001d0000000401200039000a00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000903000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000a9c0000413d000000000521004b00000a9c0000a13d0000000a03000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d90000000d060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000aa40000013d0000046d0010009c00000004030000390000078a0000413d0000046e0010009c000000060300003900000005030040390000000d0030006b000007bd0000813d000b00000004001d000a00000002001d0000000d01000029000e0018001000cd000000000001004b000007960000613d0000000e020000290000000d012000fa000000180010008c000008b60000c13d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000e040000290000000b0340024f0000046f03300197000000ff0040008c0000000003002019000e00000003001d00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000008bc0000c13d000000400100043d000004a102000041000007bf0000013d000000400100043d000004a20200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c70000113600010430000300010000003d0000046a0010009c00000afb0000413d0000046b0010009c000300020000003d00000afb0000413d0000046c0010009c00000af40000813d000000030100003900000afa0000013d0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000047b011001c70000000e02000029113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007e40000c13d000000000005004b000007f50000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004af040000410000000e050000290000000006000411113411250000040f0000000100200190000001630000c13d00000000010000190000113600010430000000400100043d0000049d02000041000007bf0000013d0000049e01000041000000000010043f0000003201000039000000040010043f0000049f0100004100001136000104300000000d010000290000000c020000291134109f0000040f000000400100043d000800000001001d000004a50010009c000004320000213d00000008030000290000010001300039000000400010043f000000c0023000390000000c01000029000600000002001d0000000000120435000000a0023000390000000b01000029000700000002001d000000000012043500000080023000390000049601000041000500000002001d000000000012043500000060023000390000000a01000029000400000002001d000000000012043500000040023000390000000d01000029000200000002001d000000000012043500000020023000390000000e01000029000100000002001d000000000012043500000000010004110000000000130435000000e001300039000300000001001d00000000000104350000000901000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000080200002900000000020204330000046302200197000000000101043b000000000301041a000004a603300197000000000223019f000000000021041b0000000102000029000000000202043300000463022001970000000103100039000000000403041a000004a604400197000000000224019f000000000023041b0000000202000029000000000202043300000463022001970000000203100039000000000403041a000004a704400197000000000224019f00000004040000290000000004040433000000a0044002100000049404400197000000000242019f000000000023041b000000050200002900000000020204330000000303100039000000000023041b0000000302000029000000000202043300000090022002100000000603000029000000000303043300000020033002100000047303300197000000000232019f000000070300002900000000030304330000044e03300197000000000232019f0000000401100039000000000021041b000000400100043d00000060021000390000000a03000029000000000032043500000040021000390000000b03000029000000000032043500000020021000390000000c030000290000000000320435000000090200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a8011001c70000800d020000390000000403000039000004a9040000410000000e050000290000000d060000290000000007000411113411250000040f00000001002001900000081a0000613d0000000101000039000000000010041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e010080410000004001100210000004aa011001c7000011350001042e0000000d030000290000049a0030009c00000d240000413d0000000d03000029000004910030009c00000c920000c13d0000049e01000041000000000010043f0000001101000039000000040010043f0000049f0100004100001136000104300000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000000000101041a000800000001001d000700000002001d0000000401200039000900000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000d510000413d000000000521004b00000d510000a13d0000000903000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000007060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000d590000013d0000046d0010009c000300040000003d000009080000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c050000290000000308500039000009590000413d000000000521004b000009590000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f0000095f0000013d000004750060009c000009610000213d000000000042004b000009610000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d0000000001000411000000000010043f0000000301000039000000200010043f000000050000006b0000099e0000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b000009d90000c13d000004640120012a000009e00000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000a5c0000c13d000004640330012a00000464023000d1000000000003004b00000a660000c13d00000a690000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000a120000c13d0000000001010433000000000010043f0000000103000031000000010200003900000a380000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000a290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000a250000c13d0000001f0550019000000a360000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000a8c0000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000a690000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000030020006c0000090c0000413d000001ef0000013d0000000b04000029000004750040009c00000aa60000213d000000000032004b00000aa60000813d0000000b020000290000047602200197000000000121019f0000000a02000029000000000012041b0000000d010000290000000301100039000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000f550000c13d000000400100043d0000048e02000041000007bf0000013d000400010000003d0000046a0020009c00000dba0000413d0000046b0020009c000400020000003d00000dba0000413d0000046c0020009c00000db30000813d000000030100003900000db90000013d0000046d0010009c000300040000003d00000afb0000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000e00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000d00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030950003900000b4d0000413d000000000521004b00000b4d0000a13d0000000d08000029000000000408041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000609041a0000000005560019000000000059041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000018041b00000b550000013d000004750060009c0000000d0300002900000b550000213d000000000042004b00000b550000813d0000047602600197000000000121019f000000000013041b000c00000009001d000000050000006b00000c150000613d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b00000b920000c13d000004640120012a00000b990000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000bcb0000c13d0000000001010433000000000010043f0000000103000031000000010200003900000bf10000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000be20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000bde0000c13d0000001f0550019000000bef0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f000000010020019000000c830000c13d0000081a0000013d0000000701000029000000000101041a000004640110019800000b580000613d000b00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000c560000c13d000004640230012a00000464032000d1000000000002004b00000c600000c13d00000c630000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479022000d100000464032000d1000000000002004b00000c630000613d00000000022300d9000004640020009c000008b60000c13d0000000b023000fa000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000d04000029000000000104041a0000009002100270000000060220006a000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000014041b00000009020000290000000102200039000000030020006c00000aff0000413d000006ac0000013d0000000d030000290000000003300089000004640430019700000020032002700000046405300197000000000054004b00000000040580190000000003430049000000200330021000000473033001970000049702200197000000000223019f0000000a03000029000000000023041b000000400300043d000000240230003900000000004204350000047a02000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cee0000c13d00000001020000390000000001030433000000000010043f000000010300003100000d150000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000cc90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000cc50000c13d000000000005004b00000cd60000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000ce70000613d000000000141016f000000000113019f000000010010019000000d240000c13d000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000d460000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000d060000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d020000c13d000000000005004b00000d130000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d0000000701000029000000000101041a0000000a02000029000000000202041a0000044e02200197000000400300043d00000020043000390000000000240435000000a0011002700000044e01100197000000400230003900000000001204350000000d0100002900000000001304350000044e0030009c0000044e03008041000000400130021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000049b011001c70000800d0200003900000002030000390000049c040000410000000e05000029000008170000013d000000400100043d00000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300000000b04000029000004750040009c00000d5b0000213d000000000032004b00000d5b0000813d0000000b020000290000047602200197000000000121019f0000000902000029000000000012041b0000000c0000006b00000d630000c13d0000000a01000029000000000101041a000004640310019700000007010000290000000e0200002911340fbe0000040f0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000001041b0000000a01000029000000000101041a00000464021001970000000901000029000000000101041a00000090031002700000000002230049000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000902000029000000000012041b0000000a01000029000000000101041a00000070021002700000000d03000029000000050030008c00000da50000213d0000049a03000041000000010400008a0000049a0030009c000000000400c0190000000d03000029000000060330008900000018033000ca000001000530008900000000045401cf000004740530027f000000000445019f0000047404006041000004750330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f00000464011001970000007002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d020000390000000303000039000004a004000041000008150000013d0000046d0020009c000400040000003d00000dba0000413d0000046e0010009c00000006010000390000000501004039000400000001001d0000000501000029000004641010012a000300000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030850003900000e0b0000413d000000000521004b00000e0b0000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f00000e110000013d000004750060009c00000e130000213d000000000042004b00000e130000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b00000e530000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000005322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000005021000b9000000000323004b00000000040000390000000104004039000000000343004b00000e8e0000c13d000004640120012a00000e950000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000005433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000005032000b9000000000434004b00000000050000390000000105004039000000000454004b00000f110000c13d000004640330012a00000464023000d1000000000003004b00000f1b0000c13d00000f1e0000013d000004780030009c0000081a0000213d000004641010012a00000003011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000ec70000c13d0000000001010433000000000010043f0000000103000031000000010200003900000eed0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000ede0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000eda0000c13d0000001f0550019000000eeb0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000f410000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000003022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000f1e0000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000040020006c00000dbe0000413d0000028d0000013d000000000001042f000000400100043d000004ae02000041000007bf0000013d000000000301041a000004830030009c00000f5b0000a13d000000400100043d0000048d02000041000007bf0000013d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b0000000a01000029000000000101041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d0200003900000003030000390000048604000041000008150000013d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000fb70000613d00000003060000290000044e026001970000000203000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720060009c00000fae0000413d000000000521004b00000fae0000a13d0000000408000029000000000308041a000000900630027200000fb80000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000fb50000013d000004750060009c000000040800002900000fb60000213d000000000032004b00000fb60000813d0000047602600197000000000121019f000000000018041b000000000001042d000000000001042f0000049e01000041000000000010043f0000001201000039000000040010043f0000049f0100004100001136000104300004000000000002000200000003001d000400000002001d000300000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b000000000101041a000000000001004b000010870000613d00000003020000290000000302200039000000000202041a000100000002001d0000000001120049000004b30010009c000000000301001900000000030060190000000202000029000004640220019700000000432300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000032100a9000000000434004b00000000050000390000000105004039000000000454004b00000fff0000c13d000004640130012a000010070000013d000004780040009c000010850000213d000004642020012a000004641010012a00000000012100a9000004641010012a000000000113004900000479011000d1000200000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000102000029000000000021041b00000003010000290000000201100039000000000201041a000000400100043d0000002403100039000000020400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c0000103a0000c13d00000001020000390000000001010433000000000010043f0000000103000031000010610000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010520000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000104e0000c13d000000000005004b0000105f0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d00000001002001900000108f0000613d000000000254016f000000000223019f00000001002001900000108f0000613d000000020200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004800400004100000004050000290000000006000411113411250000040f0000000100200190000010850000613d000000000001042d00000000010000190000113600010430000000400100043d000004ae0200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c7000011360001043000000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300002000000000002000100000002001d000004b4020000410000000000200443000200000001001d000000040010044300000000010004140000044e0010009c0000044e01008041000000c001100210000004b5011001c700008002020000391134112a0000040f0000000100200190000010fe0000613d000000400300043d000000000101043b000000000001004b000010ff0000613d00000044013000390000000102000029000000000021043500000024013000390000000002000410000000000021043500000498010000410000000000130435000000040130003900000000020004110000000000210435000000000100041400000002020000290000046302200197000000040020008c000010c70000c13d00000001020000390000000001030433000000000010043f0000000103000031000010ee0000013d0000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010df0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010db0000c13d000000000005004b000010ec0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011060000613d000000000141016f000000000113019f0000000100100190000011060000613d000000000001042d000000000001042f000004b60100004100000000001304350000044e0030009c0000044e0300804100000040013002100000048c011001c70000113600010430000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c70000113600010430000000000001042f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000011230000613d000000000101043b000000000001042d0000000001000019000011360001043000001128002104210000000102000039000000000001042d0000000002000019000000000001042d0000112d002104230000000102000039000000000001042d0000000002000019000000000001042d00001132002104250000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000711c316a0000000000000000000000000000000000000000000000000000000093d1692e00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b90000000000000000000000000000000000000000000000000000000093d1692f00000000000000000000000000000000000000000000000000000000cc40105800000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000045a2cab0000000000000000000000000000000000000000000000000000000005eac6238000000000000000000000000000000000000000000000000000000005eac623900000000000000000000000000000000000000000000000000000000647211910000000000000000000000000000000000000000000000000000000045a2cab10000000000000000000000000000000000000000000000000000000058ff9fe500000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb0000000000000000000000000000000000000000000000000000000022e0772c000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff000000000000000000000000000000000000010000000080000000000000000000000000000000000000000000000000000000200000008000000000000000000200000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000005452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30399039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000040000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c1000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f5245454e5452414e4359000000000000000000000000000000000000000000005fd8a132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc8000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712ab4fa3fb3000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df81710000000000000000000000000000000000000000000000000000000008571217000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffeffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000000000000002000000000000000000000000000000000000800000000000000000000000008eabfc2cee883d317bfa1bc6b35c8ed8b90a9288dd10822f462da02177f2a1be0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce932d6d97084c2163485b42b77d74f52baf2e14b443d9c511dfc52958a1290c" + ] +} \ No newline at end of file diff --git a/deployments/treasureTopaz/UniswapV2Factory.json b/deployments/treasureTopaz/UniswapV2Factory.json new file mode 100644 index 0000000..28dadb0 --- /dev/null +++ b/deployments/treasureTopaz/UniswapV2Factory.json @@ -0,0 +1,2041 @@ +{ + "address": "0x129A3Fe403c94000A89136ABDffce7C98FbDaB8a", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_defaultProtocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_defaultLpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_protocolFeeBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "fees", + "type": "tuple" + } + ], + "name": "DefaultFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "LpFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "PairCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "ProtocolFeeBeneficiarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "ProtocolFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + } + ], + "name": "RoyaltiesFeesSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "allPairs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairs", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairsLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + } + ], + "name": "createPair", + "outputs": [ + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "defaultFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFees", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFeesAndRecipients", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "protocolBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getPair", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getTotalFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "pairFees", + "outputs": [ + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "protocolFeeOverride", + "type": "bool" + }, + { + "internalType": "bool", + "name": "lpFeeOverride", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeBeneficiary", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "_fees", + "type": "tuple" + } + ], + "name": "setDefaultFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setLpFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_protocolFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setProtocolFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + } + ], + "name": "setProtocolFeeBeneficiary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_royaltiesFee", + "type": "uint256" + } + ], + "name": "setRoyaltiesFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0x129A3Fe403c94000A89136ABDffce7C98FbDaB8a", + "transactionIndex": 0, + "gasUsed": "159901", + "logsBloom": "0x00000000008400000800000000000000000000000000000000800000400000000020000000000000000020000000000000000000000000000000000000000000000000000000040000000008000040000101000000000000000000000000080400000000020000000000000004000800000000000000000000000010000000400000000000000000000004000000000000000100000000001000000000000000000000000000100002000000800000000000000000000000102000010002000000800002008000000042000000000100000000000100000000000000000020000200000000010000000000000000000000000000000000000000000000000000", + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595", + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 1641, + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x00000000000000000000000000000000000000000000000000000e0d14fd73b4", + "logIndex": 0, + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595" + }, + { + "transactionIndex": 0, + "blockNumber": 1641, + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x000000000000000000000000000000000000000000000000000002f14f11fec0", + "logIndex": 1, + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595" + }, + { + "transactionIndex": 0, + "blockNumber": 1641, + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "address": "0x129A3Fe403c94000A89136ABDffce7C98FbDaB8a", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595" + }, + { + "transactionIndex": 0, + "blockNumber": 1641, + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "address": "0x129A3Fe403c94000A89136ABDffce7C98FbDaB8a", + "topics": [ + "0xddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b7" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e", + "logIndex": 3, + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595" + }, + { + "transactionIndex": 0, + "blockNumber": 1641, + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "address": "0x129A3Fe403c94000A89136ABDffce7C98FbDaB8a", + "topics": [ + "0x867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c03" + ], + "data": "0x0000000000000000000000000eb5b03c0303f2f47cd81d7be4275af8ed347576", + "logIndex": 4, + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595" + }, + { + "transactionIndex": 0, + "blockNumber": 1641, + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x01000215c679199dcb92c87dfc356cf6aa5198d06dcdd9b73412e2d32c2b0bd0", + "0x000000000000000000000000129a3fe403c94000a89136abdffce7c98fbdab8a" + ], + "data": "0x", + "logIndex": 5, + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595" + }, + { + "transactionIndex": 0, + "blockNumber": 1641, + "transactionHash": "0x665858418da8bae431073b8a5ae27e9c11ce271072cdcefcbe3d6e1b280985f3", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x0000000000000000000000000000000000000000000000000000033e1fd55b65", + "logIndex": 6, + "blockHash": "0xdd948a8ed51512a6ab0d212083e07a93cb73195ea07d6da5d41c4258ea48d595" + } + ], + "blockNumber": 1641, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [ + "30", + "30", + "0x0eB5B03c0303f2F47cD81d7BE4275AF8Ed347576" + ], + "numDeployments": 3, + "solcInputHash": "29575f9c42d79da7d15102bbf5192733", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_defaultProtocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_defaultLpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_protocolFeeBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "fees", + "type": "tuple" + } + ], + "name": "DefaultFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "LpFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "PairCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "ProtocolFeeBeneficiarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "ProtocolFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + } + ], + "name": "RoyaltiesFeesSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "allPairs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairs", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairsLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + } + ], + "name": "createPair", + "outputs": [ + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "defaultFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFees", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFeesAndRecipients", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "protocolBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getPair", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getTotalFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "pairFees", + "outputs": [ + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "protocolFeeOverride", + "type": "bool" + }, + { + "internalType": "bool", + "name": "lpFeeOverride", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeBeneficiary", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "_fees", + "type": "tuple" + } + ], + "name": "setDefaultFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setLpFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_protocolFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setProtocolFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + } + ], + "name": "setProtocolFeeBeneficiary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_royaltiesFee", + "type": "uint256" + } + ], + "name": "setRoyaltiesFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "getFees(address)": { + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getFeesAndRecipients(address)": { + "details": "Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied by priority: 1. lp fee 2. royalties 3. protocol fee If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then effective fees will be allocated acording to the fee priority up to MAX_FEE value. In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.", + "params": { + "pair": "address of pair for which to calculate fees and beneficiaries" + }, + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolBeneficiary": "address that gets protocol fees", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesBeneficiary": "address that gets royalties", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getTotalFee(address)": { + "details": "Fee is capped at MAX_FEE", + "params": { + "pair": "address of pair for which to calculate fees" + }, + "returns": { + "_0": "total fee amount denominated in basis points" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setDefaultFees((uint256,uint256))": { + "params": { + "fees": "struct with default fees" + } + }, + "setLpFee(address,uint256,bool)": { + "params": { + "lpFee": "amount of lp fee denominated in basis points", + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee" + } + }, + "setProtocolFee(address,uint256,bool)": { + "params": { + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee", + "protocolFee": "amount of protocol fee denominated in basis points" + } + }, + "setProtocolFeeBeneficiary(address)": { + "params": { + "_beneficiary": "address that gets protocol fees" + } + }, + "setRoyaltiesFee(address,address,uint256)": { + "params": { + "beneficiary": "address that gets royalties", + "pair": "address of pair for which to set fee", + "royaltiesFee": "amount of royalties fee denominated in basis points" + } + }, + "transferOwnership(address)": { + "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner." + } + }, + "stateVariables": { + "MAX_FEE": { + "details": "Fee is denominated in basis points so 5000 / 10000 = 50%" + }, + "protocolFeeBeneficiary": { + "return": "address that gets protocol fees", + "returns": { + "_0": "address that gets protocol fees" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getFees(address)": { + "notice": "Returns all fees for pair" + }, + "getFeesAndRecipients(address)": { + "notice": "Returns all fees for pair and beneficiaries" + }, + "getTotalFee(address)": { + "notice": "Returns total fee pair charges" + }, + "pairFees(address)": { + "notice": "Internal mapping to store fees for pair. It is exposed for advanced integrations and in most cases contracts should use fee getters." + }, + "setDefaultFees((uint256,uint256))": { + "notice": "Sets default fees for all pairs" + }, + "setLpFee(address,uint256,bool)": { + "notice": "Sets lp fee for pair" + }, + "setProtocolFee(address,uint256,bool)": { + "notice": "Sets protocol fee for pair" + }, + "setProtocolFeeBeneficiary(address)": { + "notice": "Sets protocol fee beneficiary" + }, + "setRoyaltiesFee(address,address,uint256)": { + "notice": "Sets royalties fee and beneficiary for pair" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/UniswapV2/core/UniswapV2Factory.sol": "UniswapV2Factory" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "keccak256": "0x706cf64058eb9a12b7757e2fddfc63cc754741d7f47a87b1b964b210de6ca499", + "license": "MIT", + "urls": [ + "bzz-raw://cbe9c54f97f57ca00ba6e7fb9ab5205959846d23e68700d97d3db5f7c2dbc7fc", + "dweb:/ipfs/QmYDT5x2wqPME2WfuHjy8D6M2Rx8xewTdmsKok2a1nnbnG" + ] + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "keccak256": "0xdd15427b6e71d8e88ad7580b0789b6f5ce7eeaf321bde7256a1550b76fc6552e", + "license": "MIT", + "urls": [ + "bzz-raw://243086f49d4d6a97ea8ce437b4020c1c9f23fff7ce495cebdfa2c68c1cb34edc", + "dweb:/ipfs/QmZMS4EPXLCmV2jhJTHgkRA1P8dkcfW2wa9hp3UDvnyNaL" + ] + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "keccak256": "0x01f995b855719954faacf2c400e98267faf03d8f4581d8d279c3ebb3c5cf4adc", + "license": "MIT", + "urls": [ + "bzz-raw://3584cd788fe138aa2fb9dd9fb79992a1766ec7b0bf8fedfeec44a94912347c4d", + "dweb:/ipfs/QmciMrWS1WY1hnDdzYxg2Kq4gf36ZoHJbCYwHgFL8js6EU" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "keccak256": "0xd8d0de3bc69be9bb5106a5d83f2d6ce2fb523d763b03f2986fce0d355fce6d2a", + "license": "MIT", + "urls": [ + "bzz-raw://bd591385f6f6f94f62c2b519663fa00933d8f2f7d462cea3145e896986e53564", + "dweb:/ipfs/QmRK4x93DxKuyDdgE5PAPWrJzVrQcnBGPiTdBhwKcXanZn" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "keccak256": "0x581635a3e35ab2ae2ce040810296921859b606e19a83f5277396f8b51cb548a1", + "license": "MIT", + "urls": [ + "bzz-raw://61e91d41aa083b0d41f1c30780efbc0259c0c717c122fc11b69ee249362b2330", + "dweb:/ipfs/QmdHsKrcno9mmXAj3zotSLQqX4K6BYFxxJuzxUBGAwVKzi" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "keccak256": "0xb96650151113d4a4224a66aba18c59560b6558375b7eda755abb73f5095c233f", + "license": "MIT", + "urls": [ + "bzz-raw://254aba5995bf05b6d8a1268a9bdbe7d02a86ff4f1cd32a4104977be7384d6c20", + "dweb:/ipfs/QmRNZX4Z8m7QkBvEEbAQhs85cM3wxQ6tNDpCjuoYipZ3zE" + ] + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "keccak256": "0xc0011e89f99cc2eb22b0e55fa22f8d681ee7e24138cd97f51122cb3abbea5802", + "license": "MIT", + "urls": [ + "bzz-raw://2938d2bc18e5c497946a1ade92bed65e0e05182cb66853d80e37eea728989bd0", + "dweb:/ipfs/QmNmjqe2caUNcPc3zRViVqPJnxox4FhVj4iCnyMf2YHs6r" + ] + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "keccak256": "0xc8075f02390b9bc257755e15590b56a51e2db779350bfbb5f50ab5b6ebf2e9cc", + "license": "MIT", + "urls": [ + "bzz-raw://34ea022d70255fce6141d5eca24f81096ca371dc4a3297ebe13dd89dc6d119c5", + "dweb:/ipfs/QmXWJuuwv3S8ePZdJUbifD33VqjGng1kkbXk2bzmFcPjez" + ] + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "keccak256": "0x0821c0bd0c22253889479dbfc9ff1f418675f7eee70c2643ac9ac66c99ab4608", + "license": "MIT", + "urls": [ + "bzz-raw://944437bde1a62d1a38debca71ec0ef5353ddcbfc7dd6369f87497b7c23b788e2", + "dweb:/ipfs/QmVRh9Y34Wbxmmaue8YnxycHDDenmgpe7jRiU9xcRFc8Hk" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673", + "license": "MIT", + "urls": [ + "bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2", + "dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "keccak256": "0x5c879356795cc563440408404a52eaf672d4547949e0a5920fb17642303d9e1b", + "license": "MIT", + "urls": [ + "bzz-raw://fb210cdef017f9813af368e17ea1573bc26094dd8dba8b5db8bec4cc90883d0a", + "dweb:/ipfs/QmdixQwckiNVVWHaJD9ps5ALWsHkZGRAePkuUPw1ZhhJhM" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", + "license": "MIT", + "urls": [ + "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", + "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0xc3ff3f5c4584e1d9a483ad7ced51ab64523201f4e3d3c65293e4ca8aeb77a961", + "license": "MIT", + "urls": [ + "bzz-raw://d7d3dd6067a994690471b5fc71b6f81fac3847798b37d404f74db00b4d3c3d0e", + "dweb:/ipfs/QmRHF1RarifjNi93RttouNPkYZGyu6CD926PgRDzD5iL35" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498", + "deployedBytecode": "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498", + "devdoc": { + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "getFees(address)": { + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getFeesAndRecipients(address)": { + "details": "Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied by priority: 1. lp fee 2. royalties 3. protocol fee If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then effective fees will be allocated acording to the fee priority up to MAX_FEE value. In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.", + "params": { + "pair": "address of pair for which to calculate fees and beneficiaries" + }, + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolBeneficiary": "address that gets protocol fees", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesBeneficiary": "address that gets royalties", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getTotalFee(address)": { + "details": "Fee is capped at MAX_FEE", + "params": { + "pair": "address of pair for which to calculate fees" + }, + "returns": { + "_0": "total fee amount denominated in basis points" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setDefaultFees((uint256,uint256))": { + "params": { + "fees": "struct with default fees" + } + }, + "setLpFee(address,uint256,bool)": { + "params": { + "lpFee": "amount of lp fee denominated in basis points", + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee" + } + }, + "setProtocolFee(address,uint256,bool)": { + "params": { + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee", + "protocolFee": "amount of protocol fee denominated in basis points" + } + }, + "setProtocolFeeBeneficiary(address)": { + "params": { + "_beneficiary": "address that gets protocol fees" + } + }, + "setRoyaltiesFee(address,address,uint256)": { + "params": { + "beneficiary": "address that gets royalties", + "pair": "address of pair for which to set fee", + "royaltiesFee": "amount of royalties fee denominated in basis points" + } + }, + "transferOwnership(address)": { + "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner." + } + }, + "stateVariables": { + "MAX_FEE": { + "details": "Fee is denominated in basis points so 5000 / 10000 = 50%" + }, + "protocolFeeBeneficiary": { + "return": "address that gets protocol fees", + "returns": { + "_0": "address that gets protocol fees" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getFees(address)": { + "notice": "Returns all fees for pair" + }, + "getFeesAndRecipients(address)": { + "notice": "Returns all fees for pair and beneficiaries" + }, + "getTotalFee(address)": { + "notice": "Returns total fee pair charges" + }, + "pairFees(address)": { + "notice": "Internal mapping to store fees for pair. It is exposed for advanced integrations and in most cases contracts should use fee getters." + }, + "setDefaultFees((uint256,uint256))": { + "notice": "Sets default fees for all pairs" + }, + "setLpFee(address,uint256,bool)": { + "notice": "Sets lp fee for pair" + }, + "setProtocolFee(address,uint256,bool)": { + "notice": "Sets protocol fee for pair" + }, + "setProtocolFeeBeneficiary(address)": { + "notice": "Sets protocol fee beneficiary" + }, + "setRoyaltiesFee(address,address,uint256)": { + "notice": "Sets royalties fee and beneficiary for pair" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 82466, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 82579, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 22292, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFeeBeneficiary", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 22298, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "getPair", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_mapping(t_address,t_address))" + }, + { + "astId": 22301, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_allPairs", + "offset": 0, + "slot": "4", + "type": "t_struct(AddressSet)89493_storage" + }, + { + "astId": 22304, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "defaultFees", + "offset": 0, + "slot": "6", + "type": "t_struct(DefaultFees)24233_storage" + }, + { + "astId": 22309, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "pairFees", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_struct(Fees)24251_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "base": "t_bytes32", + "encoding": "dynamic_array", + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_address,t_mapping(t_address,t_address))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => address))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_address)" + }, + "t_mapping(t_address,t_struct(Fees)24251_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct IUniswapV2Factory.Fees)", + "numberOfBytes": "32", + "value": "t_struct(Fees)24251_storage" + }, + "t_mapping(t_bytes32,t_uint256)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(AddressSet)89493_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "astId": 89492, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_inner", + "offset": 0, + "slot": "0", + "type": "t_struct(Set)89178_storage" + } + ], + "numberOfBytes": "64" + }, + "t_struct(DefaultFees)24233_storage": { + "encoding": "inplace", + "label": "struct IUniswapV2Factory.DefaultFees", + "members": [ + { + "astId": 24229, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFee", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 24232, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "lpFee", + "offset": 0, + "slot": "1", + "type": "t_uint256" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Fees)24251_storage": { + "encoding": "inplace", + "label": "struct IUniswapV2Factory.Fees", + "members": [ + { + "astId": 24235, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "royaltiesBeneficiary", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 24238, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "royaltiesFee", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 24241, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFee", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 24244, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "lpFee", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 24247, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "protocolFeeOverride", + "offset": 0, + "slot": "4", + "type": "t_bool" + }, + { + "astId": 24250, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "lpFeeOverride", + "offset": 1, + "slot": "4", + "type": "t_bool" + } + ], + "numberOfBytes": "160" + }, + "t_struct(Set)89178_storage": { + "encoding": "inplace", + "label": "struct EnumerableSet.Set", + "members": [ + { + "astId": 89173, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_values", + "offset": 0, + "slot": "0", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "astId": 89177, + "contract": "contracts/UniswapV2/core/UniswapV2Factory.sol:UniswapV2Factory", + "label": "_indexes", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_uint256)" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + }, + "factoryDeps": [ + "0x00040000000000020010000000000002000000000301001900000060043002700000044e03400197000300000031035500020000000103550000044e0040019d0000008004000039000000400040043f0000000100200190000000340000c13d000000040030008c0000076d0000413d000000000201043b000000e0022002700000045b0020009c000000500000a13d0000045c0020009c000000b90000a13d0000045d0020009c000000cd0000a13d0000045e0020009c000001220000a13d0000045f0020009c0000036c0000613d000004600020009c0000023b0000613d000004610020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000003900000c13d0000000104000031000000200040008c0000002004008039000003b60000013d0000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000c01000039000000800010043f0000044f01000041000000a00010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000450011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000201043b000000400100043d000004510010009c0000005f0000413d000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000004740020009c000000aa0000213d000004800020009c000000f40000213d000004860020009c0000012c0000213d000004890020009c000002420000613d0000048a0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000a01000039000003530000013d001000000002001d0000004002100039000000400020043f00000001020000390000000001210436000004520200004100000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000121019f00000453011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000400300043d00000060023000390000000000120435000000400130003900000010020000290000000000210435001000000003001d00000020023000390000045401000041000f00000002001d00000000001204350000045501000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d000000000101043b0000001004000029000000a0024000390000000003000410000000000032043500000080024000390000000000120435000000a0010000390000000000140435000004570040009c0000004a0000213d000000c001400039000000400010043f00000000020404330000000f01000029113411080000040f0000000302000039000000000012041b00000458010000410000000102000039000000000021041b0000000601000039000000000201041a00000459022001970000000003000411000000000232019f000000000021041b0000002001000039000001000010044300000120000004430000045a01000041000011350001042e000004750020009c000000ff0000213d0000047b0020009c0000013c0000213d0000047e0020009c000002740000613d0000047f0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a0000001001100270000001ed0000013d000004690020009c0000010a0000213d0000046f0020009c000001880000213d000004720020009c000002fe0000613d000004730020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000048c0010009c0000076d0000213d000000000010043f00000001010000390000034f0000013d000004640020009c000001190000213d000004670020009c000001f10000613d000004680020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000801000039000000000101041a000f00000001001d0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000e00000002001d000003d70000c13d0000000104000031000000200040008c0000002004008039000003fd0000013d000004810020009c000001470000213d000004840020009c0000028d0000613d000004850020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000701000039000001fc0000013d000004760020009c0000017f0000213d000004790020009c0000029b0000613d0000047a0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000301000039000003530000013d0000046a0020009c000001e30000213d0000046d0020009c0000031f0000613d0000046e0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000802000039000000800020043f000004a002000041000002c00000013d000004650020009c000001f80000613d000004660020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000801000039000001fc0000013d000004620020009c000002010000613d000004630020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a000001ed0000013d000004870020009c000002b80000613d000004880020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d11340f850000040f0000049001100197000000800010043f0000049001200197000000a00010043f0000044e01300197000000c00010043f000004be01000041000011350001042e0000047c0020009c000002c90000613d0000047d0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000001201000039000000800010043f0000049101000041000011350001042e000004820020009c000002d00000613d000004830020009c0000076d0000c13d000000640030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b001000000002001d0000048c0020009c0000076d0000213d0000002402100370000000000202043b000f00000002001d0000048c0020009c0000076d0000213d0000004401100370000000000101043b000e00000001001d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000004cf0010009c000006f50000c13d00000010010000290000000f020000290000000e03000029000003630000013d000004770020009c000002d70000613d000004780020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000501000039000003530000013d000004700020009c000003440000613d000004710020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000049e0020009c0000076d0000213d0000002304200039000000000034004b0000076d0000813d0000000404200039000000000141034f000000000101043b001000000001001d0000049e0010009c0000076d0000213d00000024012000390000001002000029000f0005002002180000000f02100029000000000032004b0000076d0000213d000d00000002001d000e00000001001d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d0000000a02000039000000000202041a000400000002001d0000000b02000039000000000202041a000000000101043b000300000001001d0000000f010000290000003f01100039000004aa01100197000000400300043d0000000001130019000b00000003001d000000000031004b000000000300003900000001030040390000049e0010009c0000004a0000213d00000001003001900000004a0000c13d000000400010043f0000000b0100002900000010030000290000000001310436000a00000001001d000000000003004b0000000e050000290000000d06000029000001d90000613d00000002010003670000000b03000029000000000451034f000000000404043b000004ab0040009c0000076d0000813d000000200330003900000000004304350000002005500039000000000065004b000001d00000413d00000010012002700000ffff06100190000007e40000c13d000000400100043d0000004402100039000004ae030000410000000000320435000000240210003900000001030000390000022f0000013d0000046b0020009c000003570000613d0000046c0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a00000020011002700000ffff0110018f000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d000003e801000039000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d0000000601000039000000000101041a0000048c01100197000000800010043f0000049101000041000011350001042e000000e40030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b001000000002001d0000048c0020009c0000076d0000213d0000002402100370000000000202043b000f00000002001d0000048c0020009c0000076d0000213d0000006402100370000000000202043b000e00000002001d0000004402100370000000000202043b000d00000002001d0000008401100370000000000101043b000c00000001001d000000ff0010008c0000076d0000213d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d000000000101043b0000000e0010006b0000063c0000813d000000400100043d00000044021000390000049d0300004100000000003204350000002402100039000000140300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c70000113600010430000000000001042f0000000001000416000000000001004b0000076d0000c13d0000271001000039000000800010043f0000049101000041000011350001042e000000840030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000004402100370000000000202043b0000048c0020009c0000076d0000213d0000006404100370000000000404043b0000049e0040009c0000076d0000213d0000002305400039000000000035004b0000076d0000813d0000000405400039000000000551034f000000000505043b0000049e0050009c0000076d0000213d00000000045400190000002404400039000000000034004b0000076d0000213d0000045803000041000000000403041a000000010040008c000003860000c13d000000000003041b0000000403100370000000000303043b000000000003004b000007870000c13d0000002404100370000000000404043b000000000004004b000007870000c13d0000049b01000041000000800010043f0000002001000039000000840010043f0000002701000039000000a40010043f000004cd01000041000000c40010043f000004ce01000041000000e40010043f000004c1010000410000113600010430000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000fffe0010008c0000076d0000213d00000003011000c90000000e02100039000000000202041a0000000d03100039000000000303041a0000000c01100039000000000101041a0000044e01100197000000800010043f000000a00030043f000000ff002001900000000001000039000000010100c039000000c00010043f000004be01000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000301043b000000000100041111340ee80000040f000003640000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000ffff0010008c0000076d0000213d0000045802000041000000000302041a000000010030008c000003860000c13d000000000002041b0000000b03000039000000000403041a00000020024002700000ffff02200190000004290000c13d0000049b01000041000000800010043f0000002001000039000000840010043f0000000101000039000000a40010043f000004ae01000041000000c40010043f000004b40100004100001136000104300000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000c02000039000000800020043f0000044f02000041000000a00020043f000000800200003911340ed30000040f000000c00110008a0000044e0010009c0000044e010080410000006001100210000004a1011001c7000011350001042e0000000001000416000000000001004b0000076d0000c13d0000049401000041000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d000000000100041a000000800010043f0000049101000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000101043b0000048c0010009c0000076d0000213d0000000603000039000000000303041a0000048c033001970000000004000411000000000034004b000004540000c13d0000000703000039000000000403041a0000045904400197000000000424019f000000000043041b0000000803000039000000000403041a0000045904400197000000000114019f000000000013041b000004b501000041000000800010043f0000000001000414000000040020008c000005700000c13d0000000103000031000000200030008c00000020040000390000000004034019000005960000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000901000039000000000301041a0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000e00000003001d0000045e0000c13d0000000103000031000000200030008c00000020040000390000000004034019000004840000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000901000039000000000101041a000c00000001001d0000000801000039000000000101041a000e00000001001d0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000d00000002001d000004cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000004f20000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000048c0010009c0000076d0000213d000000000010043f0000000401000039000000200010043f00000040020000390000000001000019113411080000040f000000000101041a000000800010043f0000049101000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000301043b000000000100041111340f210000040f0000000101000039000000400200043d00000000001204350000044e0020009c0000044e0200804100000040012002100000049f011001c7000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d000000000020043f0000000201000039000000200010043f00000040020000390000000001000019113411080000040f0000001002000029000000000020043f000000200010043f00000000010000190000004002000039000003520000013d0000049b01000041000000800010043f0000002001000039000000840010043f0000001301000039000000a40010043f000004bf01000041000000c40010043f000004b40100004100001136000104300000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000800a000039000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000003a50000613d000000000801034f000000008908043c000000000a9a043600000000005a004b000003a10000c13d000000000006004b000003b20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000041d0000613d0000001f01400039000000600110018f00000080021001bf001000000002001d000000400020043f000000200040008c0000076d0000413d0000000802000039000000000202041a000000800300043d000f00000003001d0000048b030000410000001004000029000000000034043500000084031001bf0000000005000410000000000053043500000000030004140000048c02200197000000040020008c000005340000c13d0000000001140019000000400010043f000000100100002900000000020104330000000901000039000000000101041a0000049003100197000000700110027000000490041001970000000f0100002911340f8c0000040f0000044f0000013d0000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000003ec0000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000003e80000c13d000000000006004b000003f90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005640000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200040008c0000076d0000413d0000000901000039000000000101041a0000049001100197000000800200043d000000000312004b00000b3d0000413d0000000f01000029000f048c0010019b0000000e0100002900000010020000291134107c0000040f0000048b01000041000000400b00043d00000000001b04350000000401b000390000000002000410000000000021043500000000010004140000000f02000029000000040020008c000007310000c13d0000000103000031000000200030008c000000200400003900000000040340190000075f0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004240000c13d000007d10000013d000000000021004b00000000050200190000043a0000a13d00000000040200190000ffff0040008c00000b200000813d00000003054000c90000000c05500039000000000605041a000004b70660019700000001066001bf000000000065041b0000000104400039000000000014004b0000042d0000413d000000000403041a0000000005010019000004ba014001970000002004500210000004bb04400197000000000114019f000000000013041b0000ffff0150018f000000000012004b0000044f0000613d000000800020043f000000a00010043f00000000010004140000044e0010009c0000044e01008041000000c001100210000004bc011001c70000800d020000390000000103000039000004bd040000411134112a0000040f00000001002001900000076d0000613d00000001010000390000045802000041000000000012041b0000000001000019000011350001042e0000049b01000041000000800010043f0000002001000039000000840010043f0000001601000039000000a40010043f000004b301000041000000c40010043f000004b40100004100001136000104300000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000004730000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b0000046f0000c13d000000000006004b000004800000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005b80000613d0000001f01400039000000600110018f00000080021001bf000f00000002001d000000400020043f000000200030008c0000076d0000413d0000000802000039000000000202041a000000800300043d000d00000003001d0000048b030000410000000f04000029000000000034043500000084031001bf0000000005000410000000000053043500000000030004140000048c02200197000000040020008c000005dc0000c13d0000000001140019000000400010043f0000000e0500002900000490045001970000000d0340006b00000b3d0000413d000000700250027000000490022001970000000f050000290000000005050433000e00000002001d000c00000005001d000f00000025005300000b3d0000413d000b00000004001d000a00000003001d000000000300041a000000000003004b000008430000c13d0000000c030000290000000e0030006c0000000a040000290000000b0500002900000b3d0000613d0000000f024000b90000000d0050006b000004b70000613d00000000034200d90000000f0030006c00000b3d0000c13d0000000f032000fa000000000043004b000008d20000c13d000000040020008c00000b3d0000413d00000001032002700000000103300039000000000023004b00000b320000813d000000000003004b0000052e0000613d00000000043200d9000000000034001a00000b3d0000413d00000000043400190000000105400270000000000035004b00000000040300190000000003050019000004c00000413d00000b330000013d0000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000004e10000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000004dd0000c13d000000000006004b000004ee0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005c40000613d0000001f01400039000000600110018f00000080021001bf000f00000002001d000000400020043f000000200030008c0000076d0000413d0000000e020000290000048c02200197000000800300043d000e00000003001d0000048b030000410000000f05000029000000000035043500000084041001bf000000000300041000000000003404350000000003000414000000040020008c000b00000002001d0000060c0000c13d0000000001150019000000400010043f0000000f010000290000000001010433000f00000001001d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000200041a000a00000002001d000000000101043b000000000401041a0000000e03000029000000000003004b00000000020000190000052a0000613d00000000023400a9000000000004004b000005270000613d00000000014200d9000000000031004b00000b3d0000c13d00000000013200d9000000000041004b000008ce0000c13d000e00000004001d000900000002001d0000000a0000006b000008220000c13d000004b201000041000000000010043f0000001201000039000000040010043f0000048f0100004100001136000104300000044e0030009c0000044e03008041000000c0013002100000004003400210000000000131019f0000048f011001c71134112f0000040f000000100b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000054c0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005480000c13d000000000006004b000005590000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005d00000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c000003cd0000813d0000076d0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000056b0000c13d000007d10000013d0000044e0010009c0000044e01008041000000c001100210000004b6011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000005850000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000005810000c13d000000000006004b000005920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000006e90000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200030008c0000076d0000413d000000800200043d000000ff0020008c0000076d0000213d0000000503000039000000000023041b11340ec80000040f00000492010000411134111d0000040f0000044e011001970000000c02000039000000000302041a000004b703300197000000000113019f000000000012041b0000000d01000039000000000001041b0000000e02000039000000000302041a000004d00130019700000001011001bf000000000012041b0000000b01000039000000000201041a000004b802200197000004b9022001c7000000000021041b0000000001000019000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005bf0000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005cb0000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005d70000c13d000007d10000013d0000044e0030009c0000044e03008041000000c0013002100000004003400210000000000131019f0000048f011001c71134112f0000040f0000000f0b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000005f40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005f00000c13d000000000006004b000006010000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000076f0000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c0000049b0000813d0000076d0000013d0000044e0030009c0000044e03008041000000c0013002100000004003500210000000000131019f0000048f011001c71134112f0000040f0000000f0b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000006240000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000006200000c13d000000000006004b000006310000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000077b0000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c000005090000813d0000076d0000013d0000000301000039000000000101041a000b00000001001d0000001001000029000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000201043b000000000102041a000000010310003a00000b3d0000613d000000000032041b000000400400043d000000c0024000390000000e030000290000000000320435000000a002400039000000000012043500000080014000390000000d02000029000000000021043500000060014000390000000f020000290000000000210435000000400140003900000010020000290000000000210435000000c001000039000000000114043600000494020000410000000000210435000e00000004001d000004950040009c0000004a0000213d0000000e02000029000000e003200039000a00000003001d000000400030043f0000044e0010009c0000044e01008041000000400110021000000000020204330000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000e030000290000012202300039000000000012043500000100013000390000049702000041000000000021043500000102023000390000000b03000029000000000032043500000042020000390000000a030000290000000000230435000004980030009c0000004a0000213d0000000e020000290000016002200039000000400020043f0000044e0010009c0000044e0100804100000040011002100000000a0200002900000000020204330000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000076d0000613d0000000c02000029000000ff0220018f000000000101043b000000400300043d0000002004300039000000000024043500000000001304350000000201000367000000a402100370000000000202043b00000040043000390000000000240435000000c401100370000000000101043b000000600230003900000000001204350000044e0030009c0000044e030080410000004001300210000000000000043f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000499011001c700000001020000391134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000006cd0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000006c90000c13d000000000005004b000006da0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000000b430000613d000000000100043d0000048c0110019800000bd20000613d000000100010006c00000bd20000c13d00000010010000290000000f020000290000000d0300002911340ee80000040f0000000001000019000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006f00000c13d000007d10000013d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000d000e0010007400000b3d0000413d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000d02000029000000000021041b0000017b0000013d0000044e00b0009c0000044e0200004100000000020b401900000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c70000000f02000029000e0000000b001d1134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0b0000290000000e057000290000074e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000074a0000c13d000000000006004b0000075b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000007c60000613d0000001f01400039000000600210018f00000000040b00190000000001b20019000000000021004b000000000200003900000001020040390000049e0010009c0000004a0000213d00000001002001900000004a0000c13d000000400010043f000000200030008c000008380000813d000000000100001900001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007760000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007820000c13d000007d10000013d0000000904000039000000000404041a001004900040019b000000100030006c000007ba0000813d0000007004400270000f04900040019b0000002404100370000000000404043b0000000f0040006c000007ba0000813d0000000705000039000000000505041a000e048c0050019b0000000e0020006c000008e00000613d0000000805000039000000000505041a000c048c0050019b0000000c0020006c000008e00000613d000000000003004b000007a30000613d0000000e010000291134107c0000040f00000002010003670000002402100370000000000402043b000000000004004b000007aa0000613d0000004401100370000000000201043b0000000c0100002900000000030400191134107c0000040f000000400200043d0000048b010000410000000000120435000d00000002001d00000004012000390000000002000410000000000021043500000000010004140000000e02000029000000040020008c000008ea0000c13d0000000103000031000000200030008c00000020040000390000000004034019000009160000013d0000049b01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f000004a801000041000000c40010043f000004c001000041000000e40010043f000004c10100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007cd0000c13d000000000005004b000007de0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500000060013002100000044e0020009c0000044e020080410000004002200210000000000112019f00001136000104300000000b0100002900000000030104330000049e0030009c0000004a0000213d00000005013002100000003f04100039000004aa04400197000000400500043d0000000004450019000900000005001d000000000054004b000000000500003900000001050040390000049e0040009c0000004a0000213d00000001005001900000004a0000c13d001000000006001d000000400040043f000000090400002900000000053404360000001f0310018f000000000001004b000008040000613d0000000001150019000000000400003100000002044003670000000006050019000000004704043c0000000006760436000000000016004b000008000000c13d000000000003004b0000000b010000290000000001010433000000000001004b000000100f000029000009970000c13d000000400100043d000000200200003900000000022104360000000903000029000000000303043300000000003204350000004002100039000000000003004b000008190000613d0000000004000019000000005605043400000000026204360000000104400039000000000034004b000008140000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e0000000f0000006b000008680000c13d000000400100043d0000006402100039000004a70300004100000000003204350000004402100039000004a803000041000000000032043500000024021000390000002a0300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e010080410000004001100210000004a9011001c7000011360001043000000000010404330000000902000039000000000202041a00000070022002700000049002200197000000000321004b00000b3d0000413d0000000f0100002900000010020000291134107c0000040f0000044f0000013d0000000a0500002900000000025300a90000000b060000290000000d0060006b0000084b0000613d00000000045200d9000000000034004b00000b3d0000c13d00000000043200d9000000000054004b000008d20000c13d0000000b0000006b0000052e0000613d0000000f043000b90000000c060000290000000e0060006c000008570000613d0000000f054000fa000000000035004b00000b3d0000c13d00000000033400d90000000f0030006c000008d20000c13d0000000e0000006b0000000b010000290000052e0000613d00000000021200d90000000e014000fa000000000012004b0000000002018019000900000002001d000000090000006b00000b4f0000c13d000000400100043d0000006402100039000004b103000041000008270000013d0000000e030000290008000f003000bd000000000003004b0000000902000029000008700000613d00000008013000f90000000f0010006c00000b3d0000c13d0000000f0400002900000008014000f9000000000031004b000008ce0000c13d0000000a0020006b000008240000213d00000008020000290000000a0020006b000008240000213d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000f000e0010007400000b3d0000413d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000f02000029000000000021041b000000000100041a0000000e02000029000000000121004b00000b3d0000413d000000000010041b000000400100043d00000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500041000000000060000191134112a0000040f00000001002001900000076d0000613d00000009020000290000000a032000fa0000000802000029000e000a002001020000000d010000290000001002000029000a00000003001d1134107c0000040f0000000b0100002900000010020000290000000e030000291134107c0000040f0000048b01000041000000400200043d0000000000120435000f00000002001d00000004012000390000000002000410000000000021043500000000010004140000000d030000290000000002030019000000040030008c00000bd90000c13d0000000104000031000000200040008c000000200400803900000c040000013d000000400100043d0000004402100039000004a2030000410000022c0000013d0000049b02000041000000000021043500000004021001bf000000200300003900000000003204350000004402100039000004a203000041000000000032043500000024021000390000001403000039000000000032043500000040011002100000049c011001c700001136000104300000049b01000041000000800010043f0000002001000039000000840010043f0000001701000039000000a40010043f000004cc01000041000000c40010043f000004b40100004100001136000104300000000d020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c70000000e020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d05700029000009050000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b000009010000c13d000000000006004b000009120000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000b260000613d0000001f01400039000000600110018f0000000d04100029000000000014004b00000000020000390000000102004039000e00000004001d0000049e0040009c0000004a0000213d00000001002001900000004a0000c13d0000000e02000029000000400020043f000000200030008c0000076d0000413d0000000d020000290000000002020433000900000002001d0000048b020000410000000e04000029000000000024043500000004024000390000000004000410000000000042043500000000020004140000000c04000029000000040040008c000009600000613d0000000e010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c70000000c020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e057000290000094d0000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000009490000c13d000000000006004b0000095a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000bb20000613d0000001f01400039000000600110018f0000000e02100029000d00000002001d0000049e0020009c0000004a0000213d0000000d02000029000000400020043f000000200030008c0000076d0000413d0000000e020000290000000002020433000c00000002001d00000002020003670000000404200370000000000404043b000e00100040007300000b3d0000413d0000000e05000029000000090450006b0000000004004019000b00000004001d0000002402200370000000000202043b0008000f0020007300000b3d0000413d00000008040000290000000c0240006b0000000002004019000a00000002001d0000000d0200002900000004022000390000000e05000029000000090050006b00000c510000213d00000008050000290000000c0050006b00000c510000213d0000049b010000410000000d030000290000000000130435000000200100003900000000001204350000006401300039000004ca0200004100000000002104350000004401300039000004cb0200004100000000002104350000002401300039000000260200003900000000002104350000044e0030009c0000044e030080410000004001300210000004a9011001c700001136000104300000ffff0320018f00000003010000290000044e091001970001000100f000920000000101200039000800000003001d00000003023000c90007000e0020003d0006000d0020003d0005000c0020003d0002ffff0010019300000000030000190000000502300210000c00000002001d0000000a0120002900000000010104330000044e01100198000d00000003001d00000a070000613d0000000002190049000f00000002001d0000044e0020009c00000b3d0000213d000000400200043d000004ac0020009c0000004a0000213d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000400700043d000004ac0070009c0000004a0000213d0000006002700039000000400020043f000000400270003900000000000204350000000002070436000000000002043500000008030000290000ffff0030008c00000b200000613d000000400300043d000004ac0030009c0000004a0000213d0000006004300039000000400040043f0000000504000029000000000804041a0000044e0c8001970000000004c304360000000606000029000000000606041a00000000006404350000004006300039000000070a000029000000000a0a041a000000ff00a00190000000000a000039000000010a00c0390000000000a60435000000000019004b00000a450000413d00000000009c004b00000a450000213d0000000f0b0000290000000000bc004b00000a4e0000213d0000000001b8013f0000044e0010019800000aef0000613d000000400100043d000004ac0010009c0000004a0000213d0000006002100039000000400020043f0000004002100039000000000002043500000020021000390000000000020435000000000001043500000000010304330000044e011001970000000f061000690000044e0060009c00000b3d0000213d00000004016000b90000000002040433000000040000006b000009f70000613d00000004071000fa000000000067004b00000b3d0000c13d000000000012001a00000b3d0000413d000000400700043d000004ac0070009c0000004a0000213d00000000011200190000006002700039000000400020043f0000004002700039000000010600003900000000006204350000000f0200002900000000022704360000000000120435000000000c03043300000aef0000013d00000008010000290000ffff0010008c00000b200000613d000000400200043d000004ac0020009c0000004a0000213d0000006001200039000000400010043f0000000501000029000000000401041a0000044e01400197000000000312043600000040062000390000000601000029000000000101041a00000000001304350000000707000029000000000707041a000000ff007001900000000007000039000000010700c0390000000000760435000000030440014f0000044e0040019800000b130000613d000000400100043d000004ac0010009c0000004a0000213d0000006004100039000000400040043f0000004004100039000000000004043500000020041000390000000000040435000000000001043500000000010204330000044e0110019700000000041900490000044e0040009c00000b3d0000213d00000004014000b90000000002030433000000040000006b00000a360000613d00000004031000fa000000000043004b00000b3d0000c13d000000000012001a00000b3d0000413d000000400300043d000004ac0030009c0000004a0000213d00000000011200190000006002300039000000400020043f00000040023000390000000104000039000000000042043500000020023000390000000000120435000000000093043500000b130000013d000000000019004b0000000f0b00002900000000060b0019000004ab066081c700000000009c004b000000000a0c0019000004ab0aa0a1c700000000006a004b000009de0000a13d000000400300043d000004ac0030009c0000004a0000213d00000002e0f000f90000006002300039000000400020043f0000000304e000c90000000c02400039000000000202041a0000044e0220019700000000062304360000000d07400039000000000707041a000000000076043500000040033000390000000e04400039000000000404041a000000ff004001900000000004000039000000010400c039000000000043043500000a770000c13d000000400300043d000004ac0030009c0000004a0000213d0000006002300039000000400020043f0000000c02000039000000000202041a0000044e0220019700000000042304360000000d06000039000000000606041a000000000064043500000040033000390000000e04000039000000000404041a000000ff004001900000000004000039000000010400c0390000000000430435000000000019004b00000a7d0000413d000000000092004b00000a7d0000213d0000000f0300002900000a820000013d000000000019004b0000000f03000029000004ab033081c7000000000092004b000004ab0220a1c7000000000032004b00000cdb0000213d000000400200043d000004ac0020009c0000004a0000213d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000400200043d000004ac0020009c0000004a0000213d000000000019004b0000000f03000029000004ab033081c7000e00000003001d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000010be00029000000000deb001900000aa30000013d000000000e030019000000000deb00190000000000eb001a00000b3d0000413d000000400c00043d000004ac00c0009c0000004a0000213d000000010ad002700000006002c00039000000400020043f0000000020fa00d900000003022000c90000000c03200039000000000303041a0000044e0330019700000000043c04360000000d03200039000000000303041a00000000003404350000000e022000390000004003c00039000000000202041a000000ff002001900000000002000039000000010200c03900000000002304350000000103a0003900000a9f0000613d000000400700043d000004ac0070009c0000004a0000213d0000006002700039000000400020043f0000000020f300d900000003062000c90000000c02600039000000000202041a0000044e0820019700000000028704360000000d0f600039000000000f0f041a0000000000f204350000000e06600039000000400f700039000000000606041a000000ff006001900000000006000039000000010600c03900000000006f0435000000000c0c04330000044e06c00197000000000019004b00000ae10000413d000000000096004b00000ae10000213d0000000f0060006c00000ae50000213d000000000019004b000000100f00002900000aea0000413d000000000098004b00000aea0000213d0000000f0080006b000000000e03001900000aa00000213d00000aef0000013d000000000096004b000004ab0660a1c70000000e0060006c00000ad80000a13d0000000200d0008c000000100f00002900000b3d0000413d000000010ba0008a00000aa00000013d000000000098004b000004ab0880a1c70000000e0080006b000000000e03001900000aa00000213d0000044e01c001970000000f0a00002900000000031a004b00000af50000c13d000000000104043300000b130000013d00000000060704330000044e0860019700000000008a004b00000afb0000c13d000000000102043300000b130000013d00000000071800490000044e0070009c00000b3d0000213d0000044e0030009c00000b3d0000213d00000000060204330000000002040433000000000626004b00000b3d0000413d000000000018004b0000052e0000613d00000000047600d900000000083400a90000000001280019000000000067004b00000b0e0000a13d000000000021004b00000b130000813d00000b3d0000013d000000000021004b00000b3d0000413d00000000024800d9000000000032004b00000b3d0000c13d000000090200002900000000020204330000000d03000029000000000032004b00000b200000a13d0000000c02500029000000000012043500000001033000390000000b010000290000000001010433000000000013004b000009a30000413d0000080a0000013d000004b201000041000000000010043f0000003201000039000000040010043f0000048f0100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b2d0000c13d000007d10000013d0000000004020019000903e80040009400000b3d0000413d000003e802000039000000000020041b0000000103000039000000200030043f000004af03000041000000000403041a000004d10040009c00000bbe0000a13d000004b201000041000000000010043f0000001101000039000000040010043f0000048f0100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b4a0000c13d000007d10000013d000000000100041a000000090010002a00000b3d0000413d0000000901100029000000000010041b00000010010000290000048c01100197001000000001001d000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000201041a000800000002001d000000090020002a00000b3d0000413d0000001001000029000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d00000009030000290000000802300029000000000101043b000000000021041b000000400100043d00000000003104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500001900000010060000291134112a0000040f00000001002001900000076d0000613d0000000d010000290000000c020000290000000b030000290000000e0400002911340f8c0000040f000000400100043d00000020021000390000000f0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d0200003900000002030000390000000005000411000004b0040000411134112a0000040f00000001002001900000076d0000613d00000458010000410000000102000039000000000021041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e0100804100000040011002100000049f011001c7000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000bb90000c13d000007d10000013d000000000000043f000003e804400039000000000043041b0000000000210435000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500001900000000060000191134112a0000040f00000001002001900000076d0000613d000008620000013d000000400100043d00000044021000390000049a03000041000000000032043500000024021000390000001e030000390000022f0000013d0000000f030000290000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000048f011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000f0570002900000bf30000613d000000000801034f0000000f09000029000000008a08043c0000000009a90436000000000059004b00000bef0000c13d000000000006004b00000c000000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000ccf0000613d0000001f01400039000000600110018f0000000f03100029000000000013004b00000000020000390000000102004039000d00000003001d0000049e0030009c0000004a0000213d00000001002001900000004a0000c13d0000000d02000029000000400020043f000000200040008c0000076d0000413d0000000f020000290000000002020433000f00000002001d0000048b020000410000000d03000029000000000023043500000004023000390000000003000410000000000032043500000000020004140000000b03000029000000040030008c00000cee0000c13d0000000d011000290000049e0010009c0000004a0000213d000000400010043f0000000c010000290000049003100197000000700110027000000490041001970000000d0100002900000000020104330000000f0100002911340f8c0000040f000000400100043d00000020021000390000000e0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d0200003900000003030000390000000005000411000004a50400004100000010060000291134112a0000040f00000001002001900000076d0000613d00000458010000410000000102000039000000000021041b000000400100043d00000020021000390000000e0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e010080410000004001100210000004a6011001c7000011350001042e0000000604000039000000000404041a000004c2050000410000000d0600002900000000005604350000000005000410000000000052043500000000020004140000048c04400197000700000004001d000000040040008c00000c8b0000613d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c700000007020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000c780000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000c740000c13d000000000006004b00000c850000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000ce20000613d0000001f01400039000000600110018f0000000d01100029000300000001001d0000049e0010009c0000004a0000213d0000000301000029000000400010043f000000200030008c0000076d0000413d000000090200002900002710012000c90000000d040000290000000004040433000000000002004b00000c9c0000613d00000009021000fa000027100020008c00000b3d0000c13d000027100210011a000000090020006c00000d490000c13d000000000004004b000000000200001900000d2f0000c13d0000000c0600002900002710056000c9000000000006004b00000ca90000613d0000000c065000fa000027100060008c00000b3d0000c13d000027100650011a0000000c0060006c00000d490000c13d000000000004004b000000000600001900000d3c0000c13d00020000002100510001000000650053000000000400001900000cbd0000613d000000020500002900000001045000b9000000000021004b00000cba0000613d00000002014000fa000000010010006c00000b3d0000c13d00000001014000fa000000020010006c00000d490000c13d0000000f0200002900000010022000b900000003010000290000000401100039000004c3022000d1000000000024004b00000d5a0000813d0000049b0200004100000003030000290000000000230435000000200200003900000000002104350000004401300039000004c902000041000000000021043500000024013000390000000e0200003900000d540000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000cd60000c13d000007d10000013d000000400100043d0000004402100039000004ad030000410000000000320435000000240210003900000003030000390000022f0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000ce90000c13d000007d10000013d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c70000000b020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000d090000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000d050000c13d000000000006004b00000d160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000d230000613d0000001f01400039000000600110018f0000000d011000290000049e0010009c0000004a0000213d000000400010043f000000200030008c0000076d0000413d00000c240000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000d2a0000c13d000007d10000013d0000000b024000b90000000e06000029000000090060006b00000d360000a13d0000000b052000fa000000000045004b00000b3d0000c13d00000000054200d90000000b0050006c00000d490000c13d000000000012004b00000b3d0000213d00000ca20000013d0000000a064000b900000008080000290000000c0080006b00000d430000a13d0000000a076000fa000000000047004b00000b3d0000c13d00000000044600d90000000a0040006c00000d490000c13d000000000056004b00000b3d0000213d00000caf0000013d00000003030000290000004401300039000004a20200004100000000002104350000002401300039000000140200003900000000002104350000049b0100004100000000001304350000000401300039000000200200003900000000002104350000044e0030009c0000044e0300804100000040013002100000049c011001c70000113600010430000004c40200004100000003040000290000000002240436000e00000002001d0000000002000410000000000021043500000000010004140000000702000029000000040020008c00000d680000c13d000000a00030008c000000a004000039000000000403401900000d940000013d00000003020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c700000007020000291134112f0000040f000000000301001900000060033002700000044e03300197000000a00030008c000000a00400003900000000040340190000001f0640018f000000e007400190000000030570002900000d830000613d000000000801034f0000000309000029000000008a08043c0000000009a90436000000000059004b00000d7f0000c13d000000000006004b00000d900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000dde0000613d0000001f01400039000001e00110018f00000003011000290000049e0010009c0000004a0000213d000000400010043f000000a00030008c0000076d0000413d0000000e010000290000000001010433000500000001001d0000048c0010009c0000076d0000213d000000030100002900000060011000390000000001010433000400000001001d0000048c0010009c0000076d0000213d0000000801000039000000000101041a0008048c0010019b0000000701000039000000000101041a0009048c0010019b000000030200002900000080012000390000000001010433000600000001001d00000040012000390000000001010433000700000001001d000e00000000001d00000dbc0000013d0000000e010000290000000101100039000000ff0110018f000e00000001001d000000010010008c00000dea0000213d0000000e0000006b000000090200002900000008010000290000000001026019000c00000001001d0000000a0200002900000000010200190000000b01006029000d00000001001d000000000001004b00000db60000613d0000000d0200002900000007012000b900000000022100d9000000070020006c00000b3d0000c13d000027100010008c00000dd20000413d000027100310011a0000000c0100002900000005020000291134107c0000040f0000000d0200002900000006012000b900000000022100d9000000060020006c00000b3d0000c13d000027100010008c00000db60000413d000027100310011a0000000c0100002900000004020000291134107c0000040f00000db60000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000de50000c13d000007d10000013d000000400200043d0000048b010000410000000000120435000e00000002001d00000004012000390000000002000410000000000021043500000000010004140000000902000029000000040020008c00000dfa0000c13d0000000103000031000000200030008c0000002004000039000000000403401900000e260000013d0000000e020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c700000009020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900000e150000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00000e110000c13d000000000006004b00000e220000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000e7d0000613d0000001f01400039000000600110018f0000000e04100029000000000014004b00000000020000390000000102004039000d00000004001d0000049e0040009c0000004a0000213d00000001002001900000004a0000c13d0000000d02000029000000400020043f000000200030008c0000076d0000413d0000000e020000290000000002020433000e00000002001d0000048b020000410000000d04000029000000000024043500000004024000390000000004000410000000000042043500000000020004140000000804000029000000040040008c00000e700000613d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c700000008020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000e5d0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000e590000c13d000000000006004b00000e6a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000e890000613d0000001f01400039000000600110018f0000000d011000290000049e0010009c0000004a0000213d000000400010043f000000200030008c0000076d0000413d0000000202000029000027100220011a0000000e0020006b00000e950000813d0000004402100039000004c80300004100000e9d0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e840000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e900000c13d000007d10000013d0000000d0200002900000000020204330000000103000029000027100330011a000000000032004b00000ea10000813d0000004402100039000004c703000041000000000032043500000024021000390000001d030000390000022f0000013d0000000e0100002900000010030000290000000f0400002911340f8c0000040f000000400100043d00000020021000390000000a0300002900000000003204350000000b02000029000000000021043500000002020003670000000403200370000000000303043b000000400410003900000000003404350000002403200370000000000303043b000000600410003900000000003404350000044e0010009c0000044e0100804100000040011002100000004402200370000000000202043b00000000030004140000044e0030009c0000044e03008041000000c003300210000000000113019f000004c5011001c70000048c062001970000800d0200003900000003030000390000000005000411000004c6040000411134112a0000040f00000001002001900000076d0000613d0000044f0000013d000004d20010009c00000ecd0000813d0000006001100039000000400010043f000000000001042d000004b201000041000000000010043f0000004101000039000000040010043f0000048f01000041000011360001043000000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000ee20000613d000000000400001900000000054100190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000edb0000413d000000000321001900000000000304350000001f02200039000004d3022001970000000001210019000000000001042d0003000000000002000100000003001d000300000002001d0000048c01100197000200000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f1f0000613d000000000101043b00000003020000290000048c02200197000300000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f1f0000613d000000000101043b0000000102000029000000000021041b000000400100043d00000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004d404000041000000020500002900000003060000291134112a0000040f000000010020019000000f1f0000613d000000000001042d000000000100001900001136000104300004000000000002000400000003001d000200000002001d0000048c01100197000300000001001d000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d000000000101043b000000000101041a000100040010007400000f7f0000413d0000000301000029000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d000000000101043b0000000102000029000000000021041b00000002010000290000048c01100197000200000001001d000000000010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d0000000202000029000000000101043b000000000301041a000100000003001d000000040030002a00000f7f0000413d000000000020043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d00000004030000290000000102300029000000000101043b000000000021041b000000400100043d00000000003104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000030500002900000002060000291134112a0000040f000000010020019000000f7d0000613d000000000001042d00000000010000190000113600010430000004b201000041000000000010043f0000001101000039000000040010043f0000048f0100004100001136000104300000000901000039000000000201041a0000049001200197000000e00320027000000070022002700000049002200197000000000001042d0004000000000002000100000004001d000200000003001d000400000001001d000004900010009c0000105c0000213d000004d50020009c0000105c0000813d000300000002001d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000106d0000613d000000000201043b0000000901000039000000000301041a000000e00330027000000000033200490000044e00300198000010320000613d00000002030000290000049003300198000010320000613d00000001040000290000049004400198000010320000613d0000000505000039000000000605041a0000004d0060008c000010500000213d000000000006004b00000fc00000613d0000000a070000390000000105000039000000010060019000000000087700a9000000010700603900000000055700a90000000106600272000000000708001900000fb50000c13d000000000005004b00000fc60000613d00000000074500a900000fc20000013d0000000105000039000000000704001900000000055700d9000000000045004b00000fc70000613d000010500000013d000000000700001900000000083700d90000000a04000039000000000084041b0000000b04000039000000000904041a0000ffff0690018f0000ffff0060008c000010700000613d000000400a00043d000004d200a0009c000010560000813d00000010059002700000ffff0550018f000000600ba000390000004000b0043f000000030c6000c90000000c0bc00039000000000d0b041a0000044e0bd00197000000000bba04360000000d0ec00039000000000e0e041a0000000000eb0435000000400ea000390000000e0cc00039000000000c0c041a000000ff00c00190000000000c000039000000010c00c0390000000000ce0435000000000c2d013f0000044e00c001980000102c0000613d000000200c9002700000ffff0cc0018f00000000005c004b00000ff30000a13d000000010d50008a0000ffff00d0008c000010500000213d00000000006d004b000000000c05c01900000000050c001900000ff50000013d000000000005004b000010760000613d0000ffff0650018f00000001099000390000ffff0990018f00000000606900d9000000400c00043d000004ac00c0009c000010560000213d0000044e09200197000000600dc000390000004000d0043f000000400dc0003900000000000d0435000000200dc0003900000000000d043500000000000c0435000000000a0a04330000044e0aa00197000000000ca900490000044e00c0009c000010500000213d000000000a8c00a9000000000b0b0433000000000073004b000010100000213d00000000038a00d90000000000c3004b000010500000c13d0000000000ab001a000010500000413d000000400300043d000004ac0030009c000010560000213d0000000007ab00190000006008300039000000400080043f0000004008300039000000010a0000390000000000a8043500000020083000390000000000780435000000000093043500000003036000c90000000c08300039000000000a08041a000004b70aa0019700000000099a019f000000000098041b0000000d08300039000000000078041b0000000e03300039000000000803041a000004d00780019700000001077001bf000000000073041b000000000904041a0000001003500210000004d703300197000000000363019f000004b705900197000000000353019f000000000034041b000000e00220021000000003040000290000007003400210000004d803300197000000000232019f00000004030000290000049003300197000000000232019f000000000021041b0000049001400197000000400200043d0000002004200039000000000014043500000000003204350000044e0020009c0000044e02008041000000400120021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d020000390000000103000039000004d9040000411134112a0000040f00000001002001900000106e0000613d000000000001042d000004b201000041000000000010043f0000001101000039000000040010043f0000048f010000410000113600010430000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000000400100043d0000004402100039000004d60300004100000000003204350000002402100039000000150300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c70000113600010430000000000001042f00000000010000190000113600010430000004b201000041000000000010043f0000003201000039000000040010043f0000048f010000410000113600010430000004b201000041000000000010043f0000001201000039000000040010043f0000048f0100004100001136000104300000000004010019000000400100043d000004510010009c000010ee0000813d0000004005100039000000400050043f0000002005100039000004da06000041000000000065043500000019050000390000000000510435000000400500043d000000440150003900000000003104350000002001500039000004db0300004100000000003104350000048c022001970000002403500039000000000023043500000044020000390000000000250435000004980050009c000010ee0000213d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000010c60000c13d00000001020000390000000104000031000000000004004b000010da0000613d0000001f01400039000004d3011001970000003f01100039000004d303100197000000400100043d0000000003310019000000000013004b000000000600003900000001060040390000049e0030009c000010ee0000213d0000000100600190000010ee0000c13d000000400030043f0000000003410436000004d3054001980000001f0640018f00000000045300190000000307000367000010b80000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000010b40000c13d000000000006004b000010dc0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000010dc0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e030080410000006003300210000000000113019f0000044e0020009c0000044e02008041000000c002200210000000000121019f00000000020400191134112a0000040f000000010220018f000300000001035500000060011002700001044e0010019d0000044e04100197000000000004004b0000109e0000c13d00000060010000390000008003000039000000000002004b000010f40000613d0000000001010433000000000001004b000010ed0000613d000004dc0010009c000011050000213d0000001f0010008c000011050000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000011050000c13d000000000001004b000010f40000613d000000000001042d000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000000400100043d0000004402100039000004dd03000041000000000032043500000024021000390000001c0300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c7000011360001043000000000010000190000113600010430000000000001042f0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000111b0000613d000000000101043b000000000001042d00000000010000190000113600010430000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f0000000100200190000011290000613d000000000101043b000000000001042d000000000001042f0000112d002104210000000102000039000000000001042d0000000002000019000000000001042d00001132002104230000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff4d61676963737761702056320000000000000000000000000000000000000000020000000000000000000000000000000000000c000000a00000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc0310000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000010000000000000000000000008b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b0200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f0000000000000000000000000000000000000000000000000000000000030009ffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000006a62784100000000000000000000000000000000000000000000000000000000ba9a7a5500000000000000000000000000000000000000000000000000000000d505acce00000000000000000000000000000000000000000000000000000000dd62ed3d00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000e1f1c4a700000000000000000000000000000000000000000000000000000000fff6cae900000000000000000000000000000000000000000000000000000000d505accf00000000000000000000000000000000000000000000000000000000d6cf0c3700000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000d21220a700000000000000000000000000000000000000000000000000000000ba9a7a5600000000000000000000000000000000000000000000000000000000bc25cf770000000000000000000000000000000000000000000000000000000089afcb4300000000000000000000000000000000000000000000000000000000a9059cba00000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000aab5497c0000000000000000000000000000000000000000000000000000000089afcb440000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000007ecebdff000000000000000000000000000000000000000000000000000000007ecebe0000000000000000000000000000000000000000000000000000000000883bdbfd000000000000000000000000000000000000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000252c09d60000000000000000000000000000000000000000000000000000000032148f6600000000000000000000000000000000000000000000000000000000485cc95400000000000000000000000000000000000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000004f1a47080000000000000000000000000000000000000000000000000000000032148f67000000000000000000000000000000000000000000000000000000003644e5150000000000000000000000000000000000000000000000000000000030adf81e0000000000000000000000000000000000000000000000000000000030adf81f00000000000000000000000000000000000000000000000000000000313ce56700000000000000000000000000000000000000000000000000000000252c09d7000000000000000000000000000000000000000000000000000000002b8e066600000000000000000000000000000000000000000000000000000000095ea7b20000000000000000000000000000000000000000000000000000000018160ddc0000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000dfe16810000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000000000000000000000000000000000000902f1ac00000000000000000000000000000000000000000000000000000000022c0d9f00000000000000000000000000000000000000000000000000000000053f14da70a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000002400000080000000000000000000000000000000000000000000000000000000000000000000000000ffffffe00000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000800000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913202000000000000000000000000000000000000400000000000000000000000006e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9000000000000000000000000000000000000000000000000ffffffffffffff1f02000000000000000000000000000000000000000000000000000000000000001901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f00000000000000000000000000000000000000800000000000000000000000004d616769637377617056323a20494e56414c49445f5349474e4154555245000008c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000004d616769637377617056323a2045585049524544000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000200000000000000000000000004d414749432d56320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000000200000000000000000000000000000000000020000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d8193649600000000000000000000000000000000000000400000000000000000000000004954595f4255524e4544000000000000000000000000000000000000000000004d616769637377617056323a20494e53554646494349454e545f4c495155494400000000000000000000000000000000000000840000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000ffffffffffffff9f4f4c4400000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000a6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb494c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f4954595f4d494e544544000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000004d616769637377617056323a20464f5242494444454e000000000000000000000000000000000000000000000000000000000064000000800000000000000000313ce567000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000100010000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff0000000000000000000000000000000000000000000000000000ffff000000000200000000000000000000000000000000000040000000800000000000000000ac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a00000000000000000000000000000000000000600000008000000000000000004d616769637377617056323a204c4f434b454400000000000000000000000000495459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000008000000000000000008c232838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f5e1009d836a6e000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000080000000000000000000000000d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8224d616769637377617056323a2062616c616e63653141646a75737465640000004d616769637377617056323a2062616c616e63653041646a75737465640000004d616769637377617056323a204b000000000000000000000000000000000000414d4f554e5400000000000000000000000000000000000000000000000000004d616769637377617056323a20494e53554646494349454e545f494e5055545f4d616769637377617056323a20494e56414c49445f544f0000000000000000004d616769637377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e5400000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17000000000000000000000000000000000000000000000000ffffffffffffffa0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92500000000000000000000000000000000000100000000000000000000000000004d616769637377617056323a204f564552464c4f57000000000000000000000000000000000000000000000000000000000000000000000000000000ffff000000000000ffffffffffffffffffffffffffff00000000000000000000000000001c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad17472616e7366657228616464726573732c75696e743235362900000000000000a9059cbb000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4d616769637377617056323a205452414e534645525f4641494c4544000000000b016bb9e76d006b75e00547a1918c0594a277a401bf8a467e042cfd0f2efa9f", + "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498" + ] +} \ No newline at end of file diff --git a/deployments/treasureTopaz/solcInputs/29575f9c42d79da7d15102bbf5192733.json b/deployments/treasureTopaz/solcInputs/29575f9c42d79da7d15102bbf5192733.json new file mode 100644 index 0000000..3c8a19f --- /dev/null +++ b/deployments/treasureTopaz/solcInputs/29575f9c42d79da7d15102bbf5192733.json @@ -0,0 +1,346 @@ +{ + "language": "Solidity", + "sources": { + "contracts/Rewards/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\n/// @dev Adapted to pragma solidity 0.8 from https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/FullMath.sol\nlibrary FullMath {\n /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n function mulDiv(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = a * b\n // Compute the product mod 2**256 and mod 2**256 - 1\n // then use the Chinese Remainder Theorem to reconstruct\n // the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2**256 + prod0\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(a, b, not(0))\n prod0 := mul(a, b)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division\n if (prod1 == 0) {\n require(denominator > 0);\n assembly {\n result := div(prod0, denominator)\n }\n return result;\n }\n\n // Make sure the result is less than 2**256.\n // Also prevents denominator == 0\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0]\n // Compute remainder using mulmod\n uint256 remainder;\n assembly {\n remainder := mulmod(a, b, denominator)\n }\n // Subtract 256 bit number from 512 bit number\n assembly {\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator\n // Compute largest power of two divisor of denominator.\n // Always >= 1.\n uint256 twos = (0 - denominator) & denominator;\n // Divide denominator by power of two\n assembly {\n denominator := div(denominator, twos)\n }\n\n // Divide [prod1 prod0] by the factors of two\n assembly {\n prod0 := div(prod0, twos)\n }\n // Shift in bits from prod1 into prod0. For this we need\n // to flip `twos` such that it is 2**256 / twos.\n // If twos is zero, then it becomes one\n assembly {\n twos := add(div(sub(0, twos), twos), 1)\n }\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2**256\n // Now that denominator is an odd number, it has an inverse\n // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n // Compute the inverse by starting with a seed that is correct\n // correct for four bits. That is, denominator * inv = 1 mod 2**4\n uint256 inv = (3 * denominator) ^ 2;\n // Now use Newton-Raphson iteration to improve the precision.\n // Thanks to Hensel's lifting lemma, this also works in modular\n // arithmetic, doubling the correct bits in each step.\n inv *= 2 - denominator * inv; // inverse mod 2**8\n inv *= 2 - denominator * inv; // inverse mod 2**16\n inv *= 2 - denominator * inv; // inverse mod 2**32\n inv *= 2 - denominator * inv; // inverse mod 2**64\n inv *= 2 - denominator * inv; // inverse mod 2**128\n inv *= 2 - denominator * inv; // inverse mod 2**256\n\n // Because the division is now exact we can divide by multiplying\n // with the modular inverse of denominator. This will give us the\n // correct result modulo 2**256. Since the precoditions guarantee\n // that the outcome is less than 2**256, this is the final result.\n // We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inv;\n return result;\n }\n }\n\n /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n function mulDivRoundingUp(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n result = mulDiv(a, b, denominator);\n if (mulmod(a, b, denominator) > 0) {\n require(result < type(uint256).max);\n result++;\n }\n }\n}" + }, + "contracts/Rewards/libraries/PackedUint144.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.0;\n\nlibrary PackedUint144 {\n\n uint256 private constant MAX_UINT24 = type(uint24).max;\n uint256 private constant MAX_UINT48 = type(uint48).max;\n uint256 private constant MAX_UINT72 = type(uint72).max;\n uint256 private constant MAX_UINT96 = type(uint96).max;\n uint256 private constant MAX_UINT120 = type(uint120).max;\n uint256 private constant MAX_UINT144 = type(uint144).max;\n\n error NonZero();\n error FullyPacked();\n\n function pushUint24Value(uint144 packedUint144, uint24 value) internal pure returns (uint144) {\n if (value == 0) revert NonZero(); // Not strictly necessairy for our use-case since value (incentiveId) can't be 0.\n if (packedUint144 > MAX_UINT120) revert FullyPacked();\n return (packedUint144 << 24) + value;\n }\n\n function countStoredUint24Values(uint144 packedUint144) internal pure returns (uint256) {\n if (packedUint144 == 0) return 0;\n if (packedUint144 <= MAX_UINT24) return 1;\n if (packedUint144 <= MAX_UINT48) return 2;\n if (packedUint144 <= MAX_UINT72) return 3;\n if (packedUint144 <= MAX_UINT96) return 4;\n if (packedUint144 <= MAX_UINT120) return 5;\n return 6;\n }\n\n function getUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint24) {\n return uint24(packedUint144 >> (i * 24));\n }\n\n function removeUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint144) {\n if (i > 5) return packedUint144;\n uint256 rightMask = MAX_UINT144 >> (24 * (6 - i));\n uint256 leftMask = (~rightMask) << 24;\n uint256 left = packedUint144 & leftMask;\n uint256 right = packedUint144 & rightMask;\n return uint144((left >> 24) | right);\n }\n\n}\n" + }, + "contracts/Rewards/StakingContractMainnet.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.11;\n\nimport \"lib/solmate/src/utils/SafeTransferLib.sol\";\nimport \"lib/solmate/src/utils/ReentrancyGuard.sol\";\nimport \"./libraries/PackedUint144.sol\";\nimport \"./libraries/FullMath.sol\";\n\n/// @title Fork of https://github.com/sushiswap/StakingContract\n/// @notice Permissionless staking contract that allows any number of incentives to be running for any token (erc20).\n/// Incentives can be created by anyone, the total reward amount must be sent at creation.\n/// Incentives can be updated (change reward rate / duration).\n/// Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.\ncontract StakingContractMainnet is ReentrancyGuard {\n\n using SafeTransferLib for ERC20;\n using PackedUint144 for uint144;\n\n struct Incentive {\n address creator; // 1st slot\n address token; // 2nd slot\n address rewardToken; // 3rd slot\n uint32 endTime; // 3rd slot\n uint256 rewardPerLiquidity; // 4th slot\n uint32 lastRewardTime; // 5th slot\n uint112 rewardRemaining; // 5th slot\n uint112 liquidityStaked; // 5th slot\n }\n\n uint256 public incentiveCount;\n\n // Starts with 1. Zero is an invalid incentive.\n mapping(uint256 => Incentive) public incentives;\n\n /// @dev rewardPerLiquidityLast[user][incentiveId]\n /// @dev Semantic overload: if value is zero user isn't subscribed to the incentive.\n mapping(address => mapping(uint256 => uint256)) public rewardPerLiquidityLast;\n\n /// @dev userStakes[user][stakedToken]\n mapping(address => mapping(address => UserStake)) public userStakes;\n\n // Incentive count won't be greater than type(uint24).max on mainnet.\n // This means we can use uint24 values to identify incentives.\n struct UserStake {\n uint112 liquidity;\n uint144 subscribedIncentiveIds; // Six packed uint24 values.\n }\n\n error InvalidTimeFrame();\n error IncentiveOverflow();\n error AlreadySubscribed();\n error AlreadyUnsubscribed();\n error NotSubscribed();\n error OnlyCreator();\n error NoToken();\n error InvalidInput();\n error BatchError(bytes innerErorr);\n error InsufficientStakedAmount();\n error NotStaked();\n error InvalidIndex();\n\n event IncentiveCreated(address indexed token, address indexed rewardToken, address indexed creator, uint256 id, uint256 amount, uint256 startTime, uint256 endTime);\n event IncentiveUpdated(uint256 indexed id, int256 changeAmount, uint256 newStartTime, uint256 newEndTime);\n event Stake(address indexed token, address indexed user, uint256 amount);\n event Unstake(address indexed token, address indexed user, uint256 amount);\n event Subscribe(uint256 indexed id, address indexed user);\n event Unsubscribe(uint256 indexed id, address indexed user);\n event Claim(uint256 indexed id, address indexed user, uint256 amount);\n\n function createIncentive(\n address token,\n address rewardToken,\n uint112 rewardAmount,\n uint32 startTime,\n uint32 endTime\n ) external nonReentrant returns (uint256 incentiveId) {\n\n if (rewardAmount <= 0) revert InvalidInput();\n\n if (startTime < block.timestamp) startTime = uint32(block.timestamp);\n\n if (startTime >= endTime) revert InvalidTimeFrame();\n\n unchecked { incentiveId = ++incentiveCount; }\n\n if (incentiveId > type(uint24).max) revert IncentiveOverflow();\n\n _saferTransferFrom(rewardToken, rewardAmount);\n\n incentives[incentiveId] = Incentive({\n creator: msg.sender,\n token: token,\n rewardToken: rewardToken,\n lastRewardTime: startTime,\n endTime: endTime,\n rewardRemaining: rewardAmount,\n liquidityStaked: 0,\n // Initial value of rewardPerLiquidity can be arbitrarily set to a non-zero value.\n rewardPerLiquidity: type(uint256).max / 2\n });\n\n emit IncentiveCreated(token, rewardToken, msg.sender, incentiveId, rewardAmount, startTime, endTime);\n\n }\n\n function updateIncentive(\n uint256 incentiveId,\n int112 changeAmount,\n uint32 newStartTime,\n uint32 newEndTime\n ) external nonReentrant {\n\n Incentive storage incentive = incentives[incentiveId];\n\n if (msg.sender != incentive.creator) revert OnlyCreator();\n\n _accrueRewards(incentive);\n\n if (newStartTime != 0) {\n\n if (newStartTime < block.timestamp) newStartTime = uint32(block.timestamp);\n\n incentive.lastRewardTime = newStartTime;\n\n }\n\n if (newEndTime != 0) {\n\n if (newEndTime < block.timestamp) newEndTime = uint32(block.timestamp);\n\n incentive.endTime = newEndTime;\n\n }\n\n if (incentive.lastRewardTime >= incentive.endTime) revert InvalidTimeFrame();\n\n if (changeAmount > 0) {\n\n incentive.rewardRemaining += uint112(changeAmount);\n\n ERC20(incentive.rewardToken).safeTransferFrom(msg.sender, address(this), uint112(changeAmount));\n\n } else if (changeAmount < 0) {\n\n uint112 transferOut = uint112(-changeAmount);\n\n if (transferOut > incentive.rewardRemaining) transferOut = incentive.rewardRemaining;\n\n unchecked { incentive.rewardRemaining -= transferOut; }\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, transferOut);\n\n }\n\n emit IncentiveUpdated(incentiveId, changeAmount, incentive.lastRewardTime, incentive.endTime);\n\n }\n\n function stakeAndSubscribeToIncentives(\n address token,\n uint112 amount,\n uint256[] memory incentiveIds,\n bool transferExistingRewards\n ) external {\n\n stakeToken(token, amount, transferExistingRewards);\n\n uint256 n = incentiveIds.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n subscribeToIncentive(incentiveIds[i]);\n\n }\n\n }\n\n function stakeToken(address token, uint112 amount, bool transferExistingRewards) public nonReentrant {\n\n _saferTransferFrom(token, amount);\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n userStake.liquidity += amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) { // Loop through already subscribed incentives.\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards) {\n\n _claimReward(incentive, incentiveId, previousLiquidity);\n\n } else {\n\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n\n }\n\n incentive.liquidityStaked += amount;\n\n }\n\n emit Stake(token, msg.sender, amount);\n\n }\n\n function unstakeToken(address token, uint112 amount, bool transferExistingRewards) external nonReentrant {\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n if (amount > previousLiquidity) revert InsufficientStakedAmount();\n\n userStake.liquidity -= amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards || userStake.liquidity == 0) {\n\n _claimReward(incentive, incentiveId, previousLiquidity);\n\n } else {\n\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n\n }\n\n incentive.liquidityStaked -= amount;\n\n }\n\n ERC20(token).safeTransfer(msg.sender, amount);\n\n emit Unstake(token, msg.sender, amount);\n\n }\n\n function subscribeToIncentive(uint256 incentiveId) public nonReentrant {\n\n if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput();\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] != 0) revert AlreadySubscribed();\n\n Incentive storage incentive = incentives[incentiveId];\n\n if (userStakes[msg.sender][incentive.token].liquidity <= 0) revert NotStaked();\n\n _accrueRewards(incentive);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity;\n\n UserStake storage userStake = userStakes[msg.sender][incentive.token];\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.pushUint24Value(uint24(incentiveId));\n\n incentive.liquidityStaked += userStake.liquidity;\n\n emit Subscribe(incentiveId, msg.sender);\n\n }\n\n /// @param incentiveIndex ∈ [0,5]\n function unsubscribeFromIncentive(address token, uint256 incentiveIndex, bool ignoreRewards) external nonReentrant {\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n if (incentiveIndex >= userStake.subscribedIncentiveIds.countStoredUint24Values()) revert InvalidIndex();\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(incentiveIndex);\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] == 0) revert AlreadyUnsubscribed();\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n /// In case there is a token specific issue we can ignore rewards.\n if (!ignoreRewards) _claimReward(incentive, incentiveId, userStake.liquidity);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = 0;\n\n incentive.liquidityStaked -= userStake.liquidity;\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.removeUint24ValueAt(incentiveIndex);\n\n emit Unsubscribe(incentiveId, msg.sender);\n\n }\n\n function accrueRewards(uint256 incentiveId) external nonReentrant {\n\n if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput();\n\n _accrueRewards(incentives[incentiveId]);\n\n }\n\n function claimRewards(uint256[] calldata incentiveIds) external nonReentrant returns (uint256[] memory rewards) {\n\n uint256 n = incentiveIds.length;\n\n rewards = new uint256[](n);\n\n for(uint256 i = 0; i < n; i = _increment(i)) {\n\n if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) revert InvalidInput();\n\n Incentive storage incentive = incentives[incentiveIds[i]];\n\n _accrueRewards(incentive);\n\n rewards[i] = _claimReward(incentive, incentiveIds[i], userStakes[msg.sender][incentive.token].liquidity);\n\n }\n\n }\n\n function _accrueRewards(Incentive storage incentive) internal {\n\n uint256 lastRewardTime = incentive.lastRewardTime;\n\n uint256 endTime = incentive.endTime;\n\n unchecked {\n\n uint256 maxTime = block.timestamp < endTime ? block.timestamp : endTime;\n\n if (incentive.liquidityStaked > 0 && lastRewardTime < maxTime) {\n\n uint256 totalTime = endTime - lastRewardTime;\n\n uint256 passedTime = maxTime - lastRewardTime;\n\n uint256 reward = uint256(incentive.rewardRemaining) * passedTime / totalTime;\n\n // Increments of less than type(uint224).max - overflow is unrealistic.\n incentive.rewardPerLiquidity += reward * type(uint112).max / incentive.liquidityStaked;\n\n incentive.rewardRemaining -= uint112(reward);\n\n incentive.lastRewardTime = uint32(maxTime);\n\n } else if (incentive.liquidityStaked == 0 && lastRewardTime < block.timestamp) {\n\n incentive.lastRewardTime = uint32(maxTime);\n\n }\n\n }\n\n }\n\n function _claimReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity) internal returns (uint256 reward) {\n\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity;\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, reward);\n\n emit Claim(incentiveId, msg.sender, reward);\n\n }\n\n // We offset the rewardPerLiquidityLast snapshot so that the current reward is included next time we call _claimReward.\n function _saveReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity, uint112 newLiquidity) internal returns (uint256 reward) {\n\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n uint256 rewardPerLiquidityDelta = reward * type(uint112).max / newLiquidity;\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity - rewardPerLiquidityDelta;\n\n }\n\n function _calculateReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity) internal view returns (uint256 reward) {\n\n uint256 userRewardPerLiquidtyLast = rewardPerLiquidityLast[msg.sender][incentiveId];\n\n if (userRewardPerLiquidtyLast == 0) revert NotSubscribed();\n\n uint256 rewardPerLiquidityDelta;\n\n unchecked { rewardPerLiquidityDelta = incentive.rewardPerLiquidity - userRewardPerLiquidtyLast; }\n\n reward = FullMath.mulDiv(rewardPerLiquidityDelta, usersLiquidity, type(uint112).max);\n\n }\n\n function _saferTransferFrom(address token, uint256 amount) internal {\n\n if (token.code.length == 0) revert NoToken();\n\n ERC20(token).safeTransferFrom(msg.sender, address(this), amount);\n\n }\n\n function _increment(uint256 i) internal pure returns (uint256) {\n\n unchecked { return i + 1; }\n\n }\n\n function batch(bytes[] calldata datas) external {\n\n uint256 n = datas.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n (bool success, bytes memory result) = address(this).delegatecall(datas[i]);\n\n if (!success) {\n\n revert BatchError(result);\n\n }\n\n }\n\n }\n\n}\n" + }, + "contracts/Rewards/test/Console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n function _sendLogPayload(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE_ADDRESS;\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function log() internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n\n function logInt(int p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(int)\", p0));\n }\n\n function logUint(uint p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function logString(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function log(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint)\", p0, p1));\n }\n\n function log(uint p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string)\", p0, p1));\n }\n\n function log(uint p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool)\", p0, p1));\n }\n\n function log(uint p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address)\", p0, p1));\n }\n\n function log(string memory p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n\n}" + }, + "contracts/Rewards/test/mock/Token.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"lib/solmate/src/tokens/ERC20.sol\";\n\ncontract Token is ERC20 {\n constructor() ERC20(\"\", \"\", 18) {}\n function mint(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n}\n" + }, + "contracts/Rewards/test/PackedUint144.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport { Test } from \"forge-std/Test.sol\";\nimport \"../libraries/PackedUint144.sol\";\n\ncontract PackedUintTest is Test {\n\n using PackedUint144 for uint144;\n\n function testCountStoredUint24Values(uint24 a) public {\n uint144 packed = 0;\n assertEq(packed.countStoredUint24Values(), 0);\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 1);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 2);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 3);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 4);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 5);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 6);\n }\n\n function proveFail_pushUint24Value(uint144 a, uint24 b) public pure {\n while (a.countStoredUint24Values() < 7) {\n a = a.pushUint24Value(b);\n }\n }\n\n function testPushUint24Value(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint24 nil = 0;\n uint144 packed = 0;\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, nil, a))));\n if (b == 0) return;\n packed = packed.pushUint24Value(b);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, a, b))));\n if (c == 0) return;\n packed = packed.pushUint24Value(c);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, a, b, c))));\n if (d == 0) return;\n packed = packed.pushUint24Value(d);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, a, b, c, d))));\n if (e == 0) return;\n packed = packed.pushUint24Value(e);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n if (f == 0) return;\n packed = packed.pushUint24Value(f);\n assertEq(packed, uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n\n function testGetUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n assertEq(packed.getUint24ValueAt(6), uint24(0));\n assertEq(packed.getUint24ValueAt(5), a);\n assertEq(packed.getUint24ValueAt(4), b);\n assertEq(packed.getUint24ValueAt(3), c);\n assertEq(packed.getUint24ValueAt(2), d);\n assertEq(packed.getUint24ValueAt(1), e);\n assertEq(packed.getUint24ValueAt(0), f);\n }\n\n function testRemoveUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n uint24 nil = 0;\n assertEq(packed.removeUint24ValueAt(0), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n assertEq(packed.removeUint24ValueAt(1), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, f))));\n assertEq(packed.removeUint24ValueAt(2), uint144(bytes18(abi.encodePacked(nil, a, b, c, e, f))));\n assertEq(packed.removeUint24ValueAt(3), uint144(bytes18(abi.encodePacked(nil, a, b, d, e, f))));\n assertEq(packed.removeUint24ValueAt(4), uint144(bytes18(abi.encodePacked(nil, a, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(5), uint144(bytes18(abi.encodePacked(nil, b, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(6), uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n\n}\n" + }, + "contracts/Rewards/test/StakingContractMainnet.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"./TestSetup.sol\";\n\ncontract CreateIncentiveTest is TestSetup {\n\n function testCreateIncentive(\n uint112 amount,\n uint32 startTime,\n uint32 endTime\n ) public {\n _createIncentive(address(tokenA), address(tokenB), amount, startTime, endTime);\n }\n\n function testFailCreateIncentiveInvalidRewardToken(uint32 startTime, uint32 endTime) public {\n _createIncentive(address(tokenA), zeroAddress, 1, startTime, endTime);\n }\n\n function testUpdateIncentive(\n int112 changeAmount0,\n int112 changeAmount1,\n uint32 startTime0,\n uint32 startTime1,\n uint32 endTime0,\n uint32 endTime1\n ) public {\n _updateIncentive(ongoingIncentive, changeAmount0, startTime0, endTime0);\n _updateIncentive(ongoingIncentive, changeAmount1, startTime1, endTime1);\n }\n\n function testStake(uint112 amount0, uint112 amount1) public {\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _stake(address(tokenA), amount1, johnDoe, true);\n }\n\n function testSubscribe() public {\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribeSeparate(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribe(uint112 amount) public {\n uint256[] memory idsToSubscribe = new uint256[](2);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n _stakeAndSubscribeToIncentives(address(tokenA), amount, idsToSubscribe, johnDoe, true);\n }\n\n function testAccrue(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n uint256 step = testIncentiveDuration / 2;\n vm.warp(block.timestamp + step);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n _accrueRewards(0);\n _accrueRewards(stakingContract.incentiveCount() + 1);\n }\n\n function testClaimRewards0() public {\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n }\n\n function testClaimRewards1(uint112 amount) public {\n if (amount == 0) return;\n _stake(address(tokenA), amount, johnDoe, true);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n vm.warp(incentive.endTime);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEqInexact(reward, totalReward, 1);\n incentive = _getIncentive(ongoingIncentive);\n assertEq(incentive.rewardRemaining, 0);\n }\n\n function testClaimRewards2(uint96 amount0, uint96 amount1) public {\n if (amount0 == 0 || amount1 == 0) return;\n uint256 maxRatio = 1000000;\n if (amount0 / amount1 > 1000000) return; // to avoid rounding innacuracies for easier testing\n if (amount1 / amount0 > 1000000) return;\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _stake(address(tokenA), amount0, johnDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n uint256 soloReward = _claimReward(ongoingIncentive, johnDoe);\n\n _subscribeToIncentive(ongoingIncentive, janeDoe);\n vm.warp(incentive.endTime);\n\n uint256 reward0 = _claimReward(ongoingIncentive, johnDoe);\n uint256 reward1 = _claimReward(ongoingIncentive, janeDoe);\n\n incentive = _getIncentive(ongoingIncentive);\n uint256 ratio;\n if (amount0 / amount1 > 0) {\n ratio = maxRatio * amount0 / amount1;\n assertEqInexact(maxRatio * reward0 / reward1, ratio, 10);\n }\n if (amount1 / amount0 > 0) {\n ratio = maxRatio * amount1 / amount0;\n assertEqInexact(maxRatio * reward1 / reward0, ratio, 10);\n }\n assertEqInexact(reward0 + reward1 + soloReward, totalReward, 10);\n }\n\n function testUnstakeSaveRewards() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 rewardRemaining = incentive.rewardRemaining;\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2 + 100);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp(incentive.endTime);\n _unstake(address(tokenA), 1, johnDoe, false);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, rewardRemaining);\n reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, 0);\n }\n\n function testFalseStakeAndSubscribe(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(0, johnDoe);\n _subscribeToIncentive(stakingContract.incentiveCount() + 1, johnDoe);\n }\n\n function testStakeInvalidToken() public {\n vm.prank(johnDoe);\n vm.expectRevert(noToken);\n stakingContract.stakeToken(janeDoe, 1, true);\n }\n\n function testRewardRate() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n uint256 oldRate = _rewardRate(ongoingIncentive);\n vm.warp(block.timestamp + testIncentiveDuration / 2);\n stakingContract.accrueRewards(ongoingIncentive);\n uint256 newRate = _rewardRate(ongoingIncentive);\n assertEq(oldRate, newRate);\n }\n\n function testBatch() public {\n bytes[] memory data = new bytes[](2);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n assertEq(liquidity, 1);\n assertEq(subscriptions, ongoingIncentive);\n }\n\n function testBatch2() public {\n bytes[] memory data = new bytes[](3);\n uint256[] memory idsToSubscribe = new uint256[](3);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n idsToSubscribe[2] = futureIncentive;\n\n data[0] = abi.encodeCall(stakingContract.stakeAndSubscribeToIncentives, (address(tokenA), 1, idsToSubscribe, true));\n data[1] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 1, false));\n data[2] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 0, false));\n\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n\n assertEq(liquidity, 1);\n assertEq(subscriptions, pastIncentive);\n }\n\n function testFailedBatchRaisesProperError() public {\n bytes[] memory data = new bytes[](3);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n data[2] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n vm.expectRevert(alreadySubscribed);\n stakingContract.batch(data);\n }\n\n}\n" + }, + "contracts/Rewards/test/TestSetup.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\nimport \"../StakingContractMainnet.sol\";\nimport \"./mock/Token.sol\";\n\ncontract TestSetup is Test {\n\n address johnDoe = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266;\n address janeDoe = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8;\n address zeroAddress = 0x0000000000000000000000000000000000000000;\n\n uint256 MAX_UINT256 = type(uint256).max;\n uint112 MAX_UINT112 = type(uint112).max;\n uint32 testIncentiveDuration = 2592000;\n uint112 testIncentiveAmount = 1e21;\n\n bytes4 invalidTimeFrame = bytes4(keccak256(\"InvalidTimeFrame()\"));\n bytes4 notSubscribed = bytes4(keccak256(\"NotSubscribed()\"));\n bytes4 alreadySubscribed = bytes4(keccak256(\"AlreadySubscribed()\"));\n bytes4 noToken = bytes4(keccak256(\"NoToken()\"));\n bytes4 invalidInput = bytes4(keccak256(\"InvalidInput()\"));\n bytes4 insufficientStakedAmount = bytes4(keccak256(\"InsufficientStakedAmount\"));\n bytes4 notStaked = bytes4(keccak256(\"NotStaked()\"));\n bytes4 invalidIndex = bytes4(keccak256(\"InvalidIndex()\"));\n bytes4 panic = 0x4e487b71;\n bytes overflow = abi.encodePacked(panic, bytes32(uint256(0x11)));\n\n StakingContractMainnet stakingContract = new StakingContractMainnet();\n\n Token tokenA = new Token();\n Token tokenB = new Token();\n Token tokenC = new Token();\n\n uint256 pastIncentive;\n uint256 ongoingIncentive;\n uint256 futureIncentive;\n\n function setUp() public {\n tokenA.mint(MAX_UINT256);\n tokenB.mint(MAX_UINT256);\n tokenC.mint(MAX_UINT256);\n\n tokenA.approve(address(stakingContract), MAX_UINT256);\n tokenB.approve(address(stakingContract), MAX_UINT256);\n tokenC.approve(address(stakingContract), MAX_UINT256);\n\n tokenA.transfer(johnDoe, MAX_UINT112);\n tokenA.transfer(janeDoe, MAX_UINT112);\n\n vm.prank(johnDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n vm.prank(janeDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n uint112 amount = testIncentiveAmount;\n uint256 currentTime = testIncentiveDuration * 30;\n uint256 duration = testIncentiveDuration;\n\n vm.warp(currentTime - duration);\n pastIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration));\n vm.warp(currentTime);\n ongoingIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration));\n futureIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp + duration), uint32(block.timestamp + duration * 2));\n }\n\n function testFail_basic_sanity() public {\n assertTrue(false);\n }\n\n function test_basic_sanity() public {\n assertTrue(true);\n }\n\n function _createIncentive(\n address token,\n address rewardToken,\n uint112 amount,\n uint32 startTime,\n uint32 endTime\n ) public returns(uint256) {\n uint256 count = stakingContract.incentiveCount();\n uint256 thisBalance = Token(rewardToken).balanceOf(address(this));\n uint256 stakingContractBalance = Token(rewardToken).balanceOf(address(stakingContract));\n\n if (amount <= 0) {\n vm.expectRevert(invalidInput);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n }\n\n if (endTime <= startTime || endTime <= block.timestamp) {\n vm.expectRevert(invalidTimeFrame);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n }\n\n uint256 id = stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(id);\n\n assertEq(incentive.creator, address(this));\n assertEq(incentive.token, token);\n assertEq(incentive.rewardToken, rewardToken);\n assertEq(incentive.lastRewardTime, startTime < block.timestamp ? uint32(block.timestamp) : startTime);\n assertEq(incentive.endTime, endTime);\n assertEq(incentive.rewardRemaining, amount);\n assertEq(incentive.liquidityStaked, 0);\n assertEq(incentive.rewardPerLiquidity, type(uint256).max / 2);\n assertEq(count + 1, id);\n assertEq(stakingContract.incentiveCount(), id);\n assertEq(thisBalance - amount, Token(rewardToken).balanceOf(address(this)));\n assertEq(stakingContractBalance + amount, Token(rewardToken).balanceOf(address(stakingContract)));\n return id;\n }\n\n function _updateIncentive(\n uint256 incentiveId,\n int112 changeAmount,\n uint32 startTime,\n uint32 endTime\n ) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n Token(incentive.rewardToken).balanceOf(address(this));\n Token(incentive.rewardToken).balanceOf(address(stakingContract));\n uint32 newStartTime = startTime == 0 ? incentive.lastRewardTime : (startTime < uint32(block.timestamp) ? uint32(block.timestamp) : startTime);\n uint32 newEndTime = endTime == 0 ? incentive.endTime : (endTime < uint32(block.timestamp) ? uint32(block.timestamp) : endTime);\n\n if (newStartTime >= newEndTime) {\n vm.expectRevert(invalidTimeFrame);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount == type(int112).min) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount > 0 && uint112(changeAmount) + uint256(incentive.rewardRemaining) > type(uint112).max) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n\n if (changeAmount < 0 && uint112(-changeAmount) > incentive.rewardRemaining) {\n changeAmount = -int112(incentive.rewardRemaining);\n }\n\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.lastRewardTime, newStartTime);\n assertEq(updatedIncentive.endTime, newEndTime);\n assertEq(updatedIncentive.rewardRemaining, changeAmount < 0 ? incentive.rewardRemaining - uint112(-changeAmount) : incentive.rewardRemaining + uint112(changeAmount));\n assertEq(updatedIncentive.creator, incentive.creator);\n assertEq(updatedIncentive.token, incentive.token);\n assertEq(updatedIncentive.rewardToken, incentive.rewardToken);\n assertEq(updatedIncentive.liquidityStaked, incentive.liquidityStaked);\n }\n\n function _stake(address token, uint112 amount, address from, bool transferRewards) public {\n // todo check if current incentives stakes got updates correctly\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(\"TRANSFER_FROM_FAILED\");\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n }\n\n function _unstake(address token, uint112 amount, address from, bool transferRewards) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userLiquidityBefore) {\n vm.expectRevert(insufficientStakedAmount);\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore + amount, userBalanceAfter);\n assertEq(userLiquidityBefore - amount, userLiquidityAfter);\n }\n\n function _subscribeToIncentive(uint256 incentiveId, address from) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint112 liquidity = _getUsersLiquidityStaked(from, incentive.token);\n\n (uint256 rpl) = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.prank(from);\n vm.expectRevert(invalidInput);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (rpl != 0) {\n vm.prank(from);\n vm.expectRevert(alreadySubscribed);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (liquidity == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n vm.prank(from);\n stakingContract.subscribeToIncentive(incentiveId);\n\n StakingContractMainnet.Incentive memory incentiveAfter = _getIncentive(incentiveId);\n uint144 subscribedIncentives = _getUsersSubscribedIncentives(from, incentive.token);\n\n assertEq(incentive.liquidityStaked + liquidity, incentiveAfter.liquidityStaked);\n assertEq(uint24(subscribedIncentives), uint24(incentiveId));\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), incentiveAfter.rewardPerLiquidity);\n if (block.timestamp > incentive.lastRewardTime) {\n assertEq(incentiveAfter.lastRewardTime, block.timestamp > incentiveAfter.endTime ? incentiveAfter.endTime : block.timestamp);\n } else {\n assertEq(incentiveAfter.lastRewardTime, incentive.lastRewardTime);\n }\n }\n\n function _stakeAndSubscribeToIncentives(address token, uint112 amount, uint256[] memory incentiveIds, address from, bool transferRewards) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesBefore = _getUsersSubscribedIncentives(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesAfter = _getUsersSubscribedIncentives(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n assertLt(subscribedIncentivesBefore, subscribedIncentivesAfter);\n }\n\n function _accrueRewards(uint256 incentiveId) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 rewardPerLiquidity;\n uint256 rewardRemaining;\n uint256 lastRewardTime;\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n if (\n incentive.liquidityStaked > 0 &&\n incentive.lastRewardTime < maxTime\n ) {\n (rewardPerLiquidity, rewardRemaining, lastRewardTime) = _calculateAccrueChange(incentiveId);\n } else {\n rewardPerLiquidity = incentive.rewardPerLiquidity;\n rewardRemaining = incentive.rewardRemaining;\n if (incentive.lastRewardTime < block.timestamp){\n lastRewardTime = maxTime;\n } else {\n lastRewardTime = incentive.lastRewardTime;\n }\n }\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.expectRevert(invalidInput);\n stakingContract.accrueRewards(incentiveId);\n return;\n }\n\n stakingContract.accrueRewards(incentiveId);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(updatedIncentive.lastRewardTime, lastRewardTime);\n assertEq(updatedIncentive.rewardRemaining, rewardRemaining);\n }\n\n function _calculateAccrueChange(uint256 incentiveId) public view returns (uint256 rewardPerLiquidity, uint256 rewardRemaining, uint256 lastRewardTime) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 totalTime = incentive.endTime - incentive.lastRewardTime;\n if (totalTime == 0 || incentive.liquidityStaked == 0 || block.timestamp < incentive.lastRewardTime) {\n return (incentive.rewardPerLiquidity, incentive.rewardRemaining, incentive.lastRewardTime);\n }\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n uint256 passedTime = maxTime - incentive.lastRewardTime;\n uint256 reward = uint256(passedTime) * incentive.rewardRemaining / totalTime;\n uint256 rplChange = reward * type(uint112).max / incentive.liquidityStaked;\n rewardPerLiquidity = incentive.rewardPerLiquidity + rplChange;\n rewardRemaining = incentive.rewardRemaining - reward;\n lastRewardTime = maxTime;\n }\n\n function _claimReward(uint256 incentiveId, address from) public returns(uint256 reward) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 oldBalance = Token(incentive.rewardToken).balanceOf(from);\n (uint256 rewardPerLiquidityLast, uint256 rewardPerLiquidity, uint256 expectedReward) = _calculateReward(incentiveId, from);\n uint256[] memory incentiveIds = new uint256[](1);\n incentiveIds[0] = incentiveId;\n if (rewardPerLiquidityLast == 0) {\n vm.prank(from);\n vm.expectRevert(notSubscribed);\n stakingContract.claimRewards(incentiveIds);\n return 0;\n }\n vm.prank(from);\n uint256[] memory rewards = stakingContract.claimRewards(incentiveIds);\n reward = rewards[0];\n assertEq(reward, expectedReward);\n uint256 newBalance = Token(incentive.rewardToken).balanceOf(from);\n assertEq(newBalance - oldBalance, reward);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), rewardPerLiquidity);\n }\n\n function _calculateReward(uint256 incentiveId, address from) internal view returns (uint256 rplLast, uint256 newRewardPerLiquidity, uint256 reward) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n (newRewardPerLiquidity,,) = _calculateAccrueChange(incentiveId);\n uint256 usersLiquidity = _getUsersLiquidityStaked(from, incentive.token);\n rplLast = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n if (rplLast != 0) {\n reward = (newRewardPerLiquidity - rplLast) * usersLiquidity / type(uint112).max;\n }\n }\n\n function _getUsersLiquidityStaked(address user, address token) public view returns (uint112) {\n (uint112 liquidity,) = stakingContract.userStakes(user, token);\n return liquidity;\n }\n\n function _getUsersSubscribedIncentives(address user, address token) public view returns (uint144) {\n (, uint144 incentiveIds) = stakingContract.userStakes(user, token);\n return incentiveIds;\n }\n\n function _rewardRate(uint256 incentiveId) public view returns (uint256) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n if (incentive.endTime != incentive.lastRewardTime) {\n return incentive.rewardRemaining * uint256(type(uint112).max) / (incentive.endTime - incentive.lastRewardTime);\n } else {\n return 0;\n }\n }\n\n function _getIncentive(uint256 id) public view returns (StakingContractMainnet.Incentive memory incentive) {\n (\n address creator,\n address token,\n address rewardToken,\n uint32 endTime,\n uint256 rewardPerLiquidity,\n uint32 lastRewardTime,\n uint112 rewardRemaining,\n uint112 liquidityStaked\n ) = stakingContract.incentives(id);\n incentive = StakingContractMainnet.Incentive(\n creator,\n token,\n rewardToken,\n endTime,\n rewardPerLiquidity,\n lastRewardTime,\n rewardRemaining,\n liquidityStaked\n );\n }\n\n function assertEqInexact(uint256 value, uint256 shouldBe, uint256 err) public {\n assertTrue(value <= shouldBe + err);\n assertTrue(value >= shouldBe - err);\n }\n}\n" + }, + "contracts/Router/IMagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol\";\nimport \"../Vault/INftVault.sol\";\n\n/// @title Router contract for swapping, managing liquidity and interacting with vaults\ninterface IMagicSwapV2Router is IUniswapV2Router01 {\n /// @dev Amounts does not match\n error MagicSwapV2WrongAmounts();\n error MagicSwapV2WrongAmountDeposited();\n error MagicSwapV2WrongAmountADeposited();\n error MagicSwapV2WrongAmountBDeposited();\n error MagicSwapV2InvalidPath();\n\n /// @notice Struct that specifies data for liquidity-related operations on vault.\n /// @param token address of NFT vault\n /// @param collection list of NFT addresses\n /// @param tokenId list of token IDs\n /// @param amount list of token amounts. For ERC721 amount is always 1.\n struct NftVaultLiquidityData {\n INftVault token;\n address[] collection;\n uint256[] tokenId;\n uint256[] amount;\n }\n\n /// @notice Emitted when NFT-ERC20 liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vault vault data of deposited NFTs\n event NFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vaultA vault data of deposited NFTs for first side\n /// @param vaultB vault data of deposited NFTs for second side\n event NFTNFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Emitted when NFT-ERC20 liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vault vault data of withdrawn NFTs\n event NFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vaultA vault data of withdrawn NFTs for first side\n /// @param vaultB vault data of withdrawn NFTs for second side\n event NFTNFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Deposit NFTs to vault\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to deposit\n /// @param _tokenId list of token IDs to deposit\n /// @param _amount list of token amounts to deposit. For ERC721 amount is always 1.\n /// @param _vault address of the vault where NFTs are deposited\n /// @param _to address that gets ERC20 for deposited NFTs\n /// @return amountMinted amount of ERC20 minted for deposited NFTs\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted);\n\n /// @dev Withdraw NFTs from vault\n /// @dev Vault token must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to withdraw\n /// @param _tokenId list of token IDs to withdraw\n /// @param _amount list of token amounts to withdraw. For ERC721 amount is always 1.\n /// @param _vault address of the vault to withdraw NFTs from\n /// @param _to address that gets withdrawn NFTs\n /// @return amountBurned amount of ERC20 redeemed for NFTs\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and second ERC20 token\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _tokenB address of token B\n /// @param _amountBDesired desired amount of token B to be added as liquidity\n /// @param _amountBMin minimum amount of token B to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and ETH\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _amountETHMin desired amount of ETH to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountToken amount of vault token added as liquidity\n /// @return amountETH amount of ETH added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using two NFT vaults\n /// @dev All NFTs must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to deposit as liquidity for first side\n /// @param _vaultB vault data for NFTs to deposit as liquidity for second side\n /// @param _amountAMin minimum amount of token A to be deposited\n /// @param _amountBMin minimum amount of token B to be deposited\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ERC20 token\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _tokenB address of token B\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to Token B\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ETH\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountTokenMin minimum amount of vault token to be redeemed\n /// @param _amountETHMin minimum amount of ETH to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to ETH\n /// @return amountToken amount of vault token redeemed\n /// @return amountETH amount of ETH redeemed\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs\n /// @dev Lp token must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to withdraw from liquidity for first side\n /// @param _vaultB vault data for NFTs to withdraw from liquidity for second side\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Swap NFTs for ERC20\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for token\n /// @param _tokenId list of token IDs to swap for token\n /// @param _amount list of token amounts to swap for token. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of output token expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets output token\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for ETH\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for ETH\n /// @param _tokenId list of token IDs to swap for ETH\n /// @param _amount list of token amounts to swap for ETH. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of ETH expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets ETH\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap ERC20 for NFTs\n /// @dev ERC20 must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for tokens\n /// @param _tokenId list of token IDs to receive for tokens\n /// @param _amount list of token amounts to receive for tokens. For ERC721 amount is always 1.\n /// @param _amountInMax maximum acceptable amount of token to swap for NFTs\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap ETH for NFTs\n /// @dev Does not require any approvals. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for ETH\n /// @param _tokenId list of token IDs to receive for ETH\n /// @param _amount list of token amounts to receive for ETH. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for NFTs\n /// @dev All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover\n /// during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn`\n /// as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.\n /// @param _collectionIn list of input NFT addresses\n /// @param _tokenIdIn list of input token IDs\n /// @param _amountIn list of input token amounts. For ERC721 amount is always 1.\n /// @param _collectionOut list of output NFT addresses\n /// @param _tokenIdOut list of output token IDs\n /// @param _amountOut list of output token amounts. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n}\n" + }, + "contracts/Router/MagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"./IMagicSwapV2Router.sol\";\nimport \"../UniswapV2/periphery/UniswapV2Router02.sol\";\nimport \"../UniswapV2/core/interfaces/IUniswapV2Pair.sol\";\n\n// ▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▒░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓\n\ncontract MagicSwapV2Router is IMagicSwapV2Router, UniswapV2Router02 {\n uint256 public constant ONE = 1e18;\n address public constant BURN_ADDRESS = address(0xdead);\n\n constructor(address _factory, address _WETH) UniswapV2Router02(_factory, _WETH) {}\n\n /// @inheritdoc IMagicSwapV2Router\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted) {\n amountMinted = _depositVault(_collection, _tokenId, _amount, _vault, _to);\n }\n\n function _depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) internal returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n INftVault.CollectionData memory collectionData = _vault.getAllowedCollectionData(_collection[i]);\n if (collectionData.nftType == INftVault.NftType.ERC721) {\n IERC721(_collection[i]).safeTransferFrom(msg.sender, address(_vault), _tokenId[i]);\n } else if (collectionData.nftType == INftVault.NftType.ERC1155) {\n IERC1155(_collection[i]).safeTransferFrom(\n msg.sender, address(_vault), _tokenId[i], _amount[i], bytes(\"\")\n );\n } else {\n revert INftVault.UnsupportedNft();\n }\n }\n\n amountMinted = _vault.depositBatch(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned) {\n amountBurned = _withdrawVault(_collection, _tokenId, _amount, _vault, msg.sender, _to);\n }\n\n function _withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _from,\n address _to\n ) internal returns (uint256 amountBurned) {\n IERC20 vaultToken = IERC20(address(_vault));\n uint256 amountToBurn = nftAmountToERC20(_amount);\n uint256 fromBalance = vaultToken.balanceOf(_from);\n uint256 totalSupply = vaultToken.totalSupply();\n\n /// @dev if user withdraws all NFT tokens but does not have totalSupply of ERC20 tokens (some are locked\n /// in UniV2 pool), we optimistically assume that user has enough and adjust `amountToBurn`\n /// to user balance. If user balance does not meet required minimum then Vault will revert anyway.\n if (amountToBurn == totalSupply && fromBalance < totalSupply) {\n amountToBurn = fromBalance;\n }\n\n if (_from == address(this)) _approveIfNeeded(address(_vault), amountToBurn);\n\n vaultToken.transferFrom(_from, address(_vault), amountToBurn);\n amountBurned = _vault.withdrawBatch(_to, _collection, _tokenId, _amount);\n\n if (amountToBurn != amountBurned) revert MagicSwapV2WrongAmounts();\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vault.token), _tokenB, amountAMinted, _amountBDesired, amountAMinted, _amountBMin);\n\n if(amountAMinted != amountA) revert MagicSwapV2WrongAmountDeposited();\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n TransferHelper.safeTransfer(address(_vault.token), pair, amountA);\n TransferHelper.safeTransferFrom(_tokenB, msg.sender, pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount) {\n uint256 amountMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n _approveIfNeeded(address(_vault.token), amountMinted);\n\n (amountToken, amountETH, lpAmount) =\n _addLiquidityETH(address(_vault.token), amountMinted, amountMinted, _amountETHMin, address(this), _to, _deadline);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this));\n uint256 amountBMinted = _depositVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vaultA.token), address(_vaultB.token), amountAMinted, amountBMinted, _amountAMin, _amountBMin);\n\n if (amountAMinted != amountA) {\n if (amountAMinted < amountA) {\n revert MagicSwapV2WrongAmountADeposited();\n }\n \n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountAMinted - amountA);\n }\n\n if (amountBMinted != amountB) {\n if (amountBMinted < amountB) {\n revert MagicSwapV2WrongAmountBDeposited();\n }\n\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountBMinted - amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n TransferHelper.safeTransfer(address(_vaultA.token), pair, amountA);\n TransferHelper.safeTransfer(address(_vaultB.token), pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTNFTLiquidityAdded(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vault.token), _tokenB, _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountA -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), _tokenB, amountA);\n\n amountA = 0;\n amountB += amountOut;\n } else if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountA);\n }\n\n TransferHelper.safeTransfer(_tokenB, _to, amountB);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(address(_vault.token), WETH, _lpAmount, _amountTokenMin, _amountETHMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountToken -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), WETH, amountToken);\n\n amountToken = 0;\n amountETH += amountOut;\n } else if (amountToken > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountToken);\n }\n\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(_to, amountETH);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vaultA.token), address(_vaultB.token), _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurnedA = _withdrawVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this), _to);\n uint256 amountBurnedB = _withdrawVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this), _to);\n\n amountA -= amountBurnedA;\n amountB -= amountBurnedB;\n\n if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountA);\n }\n\n if (amountB > 0) {\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n \n emit NFTNFTLiquidityRemoved(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), _to, _deadline);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n if(_path[_path.length - 1] != WETH) revert MagicSwapV2InvalidPath();\n\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), address(this), _deadline);\n\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(_to, amounts[amounts.length - 1]);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = _swapTokensForExactTokens(amountOut, _amountInMax, _path, msg.sender, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = swapETHForExactTokens(amountOut, _path, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collectionIn, _tokenIdIn, _amountIn, INftVault(_path[0]), address(this));\n address vaultOut = _path[_path.length - 1];\n uint256 amountOutMin = nftAmountToERC20(_amountOut);\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, _path, address(this), address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collectionOut, _tokenIdOut, _amountOut, INftVault(vaultOut), address(this), _to);\n\n uint256 dust = amounts[amounts.length - 1] - amountOutMin;\n\n // send leftover of input token back to the pool and sync\n if (dust > 0) {\n // refund user unused token\n address pair = UniswapV2Library.pairFor(factory, _path[_path.length - 2], vaultOut);\n TransferHelper.safeTransfer(vaultOut, pair, dust);\n IUniswapV2Pair(pair).sync();\n }\n }\n\n function swapLeftover(address _tokenA, address _tokenB, uint256 _amountIn) internal returns (uint256 amountOut) {\n if (_amountIn == 0) return 0;\n\n address[] memory path = new address[](2);\n path[0] = _tokenA;\n path[1] = _tokenB;\n\n _approveIfNeeded(_tokenA, _amountIn);\n\n // swap leftover to tokenB\n // TODO: can be front-run, issue?\n uint256[] memory amounts =\n _swapExactTokensForTokens(_amountIn, 1, path, address(this), address(this), block.timestamp);\n\n return amounts[1];\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal pure returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function _approveIfNeeded(address _token, uint256 _amount) internal {\n if (IERC20(_token).allowance(address(this), address(this)) < _amount) {\n SafeERC20.safeApprove(IERC20(_token), address(this), 0);\n SafeERC20.safeApprove(IERC20(_token), address(this), type(uint256).max);\n }\n }\n}\n" + }, + "contracts/Router/test/MagicSwapV2Router.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"./mock/WETH.sol\";\nimport \"../MagicSwapV2Router.sol\";\nimport \"../../UniswapV2/core/UniswapV2Factory.sol\";\nimport \"../../Vault/NftVaultFactory.sol\";\n\ncontract MagicSwapV2RouterTest is Test {\n WETH weth;\n UniswapV2Factory factory;\n MagicSwapV2Router magicSwapV2Router;\n NftVaultFactory nftVaultFactory;\n ERC721Mintable nft1;\n ERC1155Mintable nft2;\n\n uint256 ONE;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData[] public collections1;\n INftVault.CollectionData[] public collections2;\n\n INftVault vault1;\n INftVault vault2;\n\n address[] public collectionArray;\n uint256[] public tokenIdArray;\n uint256[] public amountArray;\n\n address[] public collectionArray1;\n uint256[] public tokenIdArray1;\n uint256[] public amountArray1;\n\n function setUp() public {\n weth = new WETH();\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n magicSwapV2Router = new MagicSwapV2Router(address(factory), address(weth));\n\n nftVaultFactory = new NftVaultFactory();\n\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections1.push(collectionERC721all);\n vault1 = nftVaultFactory.createVault(collections1);\n nft1 = ERC721Mintable(collectionERC721all.addr);\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections2.push(collectionERC721all);\n collections2.push(collectionERC1155all);\n vault2 = nftVaultFactory.createVault(collections2);\n nft2 = ERC1155Mintable(collectionERC1155all.addr);\n\n ONE = vault1.ONE();\n }\n\n function _dealWeth(address _user, uint256 _amount) public {\n vm.deal(_user, _amount);\n vm.prank(_user);\n weth.deposit{value: _amount}();\n vm.prank(_user);\n weth.approve(address(magicSwapV2Router), _amount);\n }\n\n function _copyStorage()\n public\n view\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n _collection = collectionArray;\n _tokenId = tokenIdArray;\n _amount = amountArray;\n }\n\n function _mintTokens(address _user)\n public\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n (_collection, _tokenId, _amount) = _copyStorage();\n\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n nft1.mint(_user, _tokenId[i]);\n vm.prank(_user);\n nft1.setApprovalForAll(address(magicSwapV2Router), true);\n } else {\n nft2.mint(_user, _tokenId[i], _amount[i]);\n vm.prank(_user);\n nft2.setApprovalForAll(address(magicSwapV2Router), true);\n }\n }\n }\n\n function _checkNftBalances(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address _owner\n ) public {\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n assertEq(nft1.ownerOf(_tokenId[i]), _owner);\n } else {\n assertEq(nft2.balanceOf(_owner, _tokenId[i]), _amount[i]);\n }\n }\n }\n\n function _checkERC20Balances(\n address[] memory _collection,\n uint256[] memory,\n uint256[] memory _amount,\n address _vault,\n address _owner,\n uint256 _prevBalance\n ) public {\n uint256 totalAmount;\n\n for (uint256 i = 0; i < _collection.length; i++) {\n totalAmount += _amount[i];\n }\n\n assertEq(IERC20(_vault).balanceOf(_owner), totalAmount * ONE + _prevBalance);\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal view returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function testDepositWithdrawVault(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 50);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint64).max);\n\n // deposit 1\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n vm.prank(user1);\n uint256 amountMinted1 = magicSwapV2Router.depositVault(_collection1, _tokenId1, _amount1, vault1, user1);\n\n assertEq(amountMinted1, nftAmountToERC20(_amount1));\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault1));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault1), user1, 0);\n\n // deposit 2\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n vm.prank(user2);\n uint256 amountMinted2 = magicSwapV2Router.depositVault(_collection2, _tokenId2, _amount2, vault2, user2);\n\n assertEq(amountMinted2, nftAmountToERC20(_amount2));\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), user2, 0);\n\n // withdraw 1\n vm.startPrank(user1);\n IERC20(address(vault1)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount1));\n\n uint256 amountBurned1 = magicSwapV2Router.withdrawVault(_collection1, _tokenId1, _amount1, vault1, user3);\n vm.stopPrank();\n\n assertEq(amountBurned1, amountMinted1);\n assertEq(IERC20(address(vault1)).balanceOf(user1), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(vault1)), 0);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user3);\n\n // withdraw 2\n\n collectionArray = [address(nft1), address(nft1), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n (address[] memory _collection3,,) = _mintTokens(user2);\n\n vm.startPrank(user2);\n IERC20(address(vault2)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount2));\n\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2WrongAmounts.selector);\n magicSwapV2Router.withdrawVault(_collection3, _tokenId2, _amount2, vault2, user4);\n\n uint256 leftover = vault2.ONE() - vault2.LAST_NFT_AMOUNT();\n IERC20(address(vault2)).transfer(user4, leftover + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n vm.stopPrank();\n\n vm.prank(user4);\n IERC20(address(vault2)).transfer(user2, 1);\n\n vm.prank(user2);\n uint256 amountBurned2 = magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n\n assertEq(amountBurned2 + leftover, amountMinted2);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(vault2)), 0);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, user4);\n }\n\n function testAddLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n // UniswapV2Pair balance is using uint112\n // and amount of NFTs is multiplied by 1e18 when transformed to ERC20\n // and we are depositing multple NFTs\n // so trying to avoid overflow revert\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testAddLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n console2.logBytes32(keccak256(type(UniswapV2Pair).creationCode));\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n vm.deal(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired1\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n vm.deal(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFTETH{value: amountBDesired2}(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired2\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testAddLiquidityNFTNFT(uint256 _tokenId) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1, 1, 1];\n\n (address[] memory _collectionA1, uint256[] memory _tokenIdA1, uint256[] memory _amountA1) = _mintTokens(user1);\n\n collectionArray = [address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++];\n amountArray = [5, 5];\n \n (address[] memory _collectionB1, uint256[] memory _tokenIdB1, uint256[] memory _amountB1) = _mintTokens(user1);\n\n vm.prank(user1);\n\n address pair;\n uint256 amountA1;\n uint256 amountB1;\n {\n (uint256 __amountA1, uint256 __amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA1,\n tokenId: _tokenIdA1,\n amount: _amountA1\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB1,\n tokenId: _tokenIdB1,\n amount: _amountB1\n }),\n nftAmountToERC20(_amountA1),\n nftAmountToERC20(_amountB1),\n user1,\n block.timestamp\n );\n\n amountA1 = __amountA1;\n amountB1 = __amountB1;\n\n // All amounts were used\n assertEq(amountA1, nftAmountToERC20(_amountA1));\n assertEq(amountB1, nftAmountToERC20(_amountB1));\n\n // All vault tokens were transferred to the pair\n pair = UniswapV2Library.pairFor(address(factory), address(vault1), address(vault2));\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA1, _tokenIdA1, _amountA1, address(vault1));\n _checkNftBalances(_collectionB1, _tokenIdB1, _amountB1, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n }\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1];\n\n (address[] memory _collectionA2, uint256[] memory _tokenIdA2, uint256[] memory _amountA2) = _mintTokens(user2);\n\n collectionArray = [address(nft2)];\n tokenIdArray = [_tokenId++];\n amountArray = [5];\n \n (address[] memory _collectionB2, uint256[] memory _tokenIdB2, uint256[] memory _amountB2) = _mintTokens(user2);\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA2,\n tokenId: _tokenIdA2,\n amount: _amountA2\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB2,\n tokenId: _tokenIdB2,\n amount: _amountB2\n }),\n nftAmountToERC20(_amountA2) - ONE,\n nftAmountToERC20(_amountB2),\n user2,\n block.timestamp\n );\n\n // Optimal amounts where used\n assertEq(amountA2, 2.5 * 10 ** 18);\n assertEq(amountB2, nftAmountToERC20(_amountB2));\n\n // Optimal vault tokens were transferred to the pair\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1 + amountA2);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1 + amountB2);\n\n // Leftover vault tokens were transferred to the burn address\n assertEq(IERC20(address(vault1)).balanceOf(address(0xdead)), nftAmountToERC20(_amountA2) - amountA2);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA2, _tokenIdA2, _amountA2, address(vault1));\n _checkNftBalances(_collectionB2, _tokenIdB2, _amountB2, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testRemoveLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevWETHBalance = weth.balanceOf(user1);\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, weth.balanceOf(user1) - prevWETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testRemoveLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevETHBalance = user1.balance;\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, user1.balance - prevETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(weth.balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function _seedLiquidity1(uint256 _tokenId) public returns (uint256 tokenId) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1)\n ];\n collectionArray1 = collectionArray;\n\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n tokenIdArray1 = tokenIdArray;\n\n amountArray = [uint256(1), 1, 1, 1, uint256(1), 1, 1, 1];\n amountArray1 = amountArray;\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18 / 2;\n uint256 amountBMin1 = 9500e18 / 2;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return _tokenId;\n }\n\n function _seedLiquidity2(uint256 _tokenId, uint256 _amount) public returns (uint256 tokenId, uint256 amount) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft2),\n address(nft2),\n address(nft2),\n address(nft2)\n ];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1, _amount++, _amount++, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18;\n uint256 amountBMin1 = 9500e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return (_tokenId, _amount);\n }\n\n function testSwapNftForTokens(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForTokens(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), amountOut);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n address[] memory wrongPath = new address[](2);\n wrongPath[0] = address(vault2);\n wrongPath[1] = address(vault1);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2InvalidPath.selector);\n magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, wrongPath, user2, block.timestamp\n );\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance + amountOut);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapTokensForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n uint256 amountInMax = amountIn;\n\n _dealWeth(user2, amountIn);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapTokensForNft(\n _collection1, _tokenId1, _amount1, amountInMax, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapETHForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n\n uint256 dust = 1e18;\n vm.deal(user2, amountIn + dust);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapETHForNft{value: amountIn + dust}(\n _collection1, _tokenId1, _amount1, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance - amountIn);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n _tokenId = _seedLiquidity1(_tokenId);\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[7]];\n tokenIdArray = [tokenIdArray[7]];\n amountArray = [amountArray[7]];\n\n address[] memory _collectionOut = collectionArray;\n uint256[] memory _tokenIdOut = tokenIdArray;\n uint256[] memory _amountOut = amountArray;\n\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1];\n\n (address[] memory _collectionIn, uint256[] memory _tokenIdIn, uint256[] memory _amountIn) = _mintTokens(user2);\n\n address[] memory path = new address[](3);\n path[0] = address(vault1);\n path[1] = address(weth);\n path[2] = address(vault2);\n\n uint256 amountIn;\n uint256 amountOut;\n {\n amountIn = nftAmountToERC20(_amountIn);\n uint256[] memory amounts = UniswapV2Library.getAmountsOut(address(factory), amountIn, path);\n amountOut = amounts[amounts.length - 1];\n console2.log(\"amountOut\", amountOut);\n }\n\n _amountOut[0] = amountOut / ONE;\n\n assertTrue(nftAmountToERC20(_amountOut) < amountOut);\n assertEq(nftAmountToERC20(_amountOut) / ONE, amountOut / ONE);\n\n uint256 prevPairVault2Balance;\n {\n address pair = UniswapV2Library.pairFor(address(factory), path[1], path[2]);\n prevPairVault2Balance = IERC20(address(vault2)).balanceOf(pair);\n }\n\n vm.prank(user2);\n uint256[] memory swapAmounts = magicSwapV2Router.swapNftForNft(\n _collectionIn, _tokenIdIn, _amountIn, _collectionOut, _tokenIdOut, _amountOut, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collectionIn, _tokenIdIn, _amountIn, address(vault1));\n _checkNftBalances(_collectionOut, _tokenIdOut, _amountOut, user2);\n assertEq(swapAmounts[0], amountIn);\n assertEq(swapAmounts[2], amountOut);\n\n uint256 dust = swapAmounts[swapAmounts.length - 1] - amountOut / ONE * ONE;\n console2.log(\"dust\", dust);\n assertTrue(dust > 0);\n assertEq(\n IERC20(address(vault2)).balanceOf(UniswapV2Library.pairFor(address(factory), path[1], path[2])),\n prevPairVault2Balance - amountOut + dust\n );\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(IERC20(address(vault1)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n}\n" + }, + "contracts/Router/test/mock/WETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ncontract WETH {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed src, address indexed guy, uint256 wad);\n event Transfer(address indexed src, address indexed dst, uint256 wad);\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n receive() external payable {\n deposit();\n }\n\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n emit Deposit(msg.sender, msg.value);\n }\n\n function withdraw(uint256 wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n (bool success,) = payable(msg.sender).call{value: wad}(\"\");\n require(success, \"Transfer failed\");\n emit Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint256) {\n return address(this).balance;\n }\n\n function approve(address guy, uint256 wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n emit Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint256 wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint256 wad) public returns (bool) {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n emit Transfer(src, dst, wad);\n\n return true;\n }\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Callee {\n function uniswapV2Call(address sender, uint256 amount0, uint256 amount1, bytes calldata data) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external pure returns (string memory);\n function symbol() external pure returns (string memory);\n function decimals() external pure returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint256);\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Factory {\n struct DefaultFees {\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n }\n\n struct Fees {\n address royaltiesBeneficiary;\n /// @dev in basis point, denominated by 10000\n uint256 royaltiesFee;\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n /// @dev if true, Fees.protocolFee is used even if set to 0\n bool protocolFeeOverride;\n /// @dev if true, Fees.lpFee is used even if set to 0\n bool lpFeeOverride;\n }\n\n event PairCreated(address indexed token0, address indexed token1, address pair, uint256);\n event DefaultFeesSet(DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(address indexed pair, address beneficiary, uint256 royaltiesFee);\n event ProtocolFeesSet(address indexed pair, uint256 protocolFee, bool overrideFee);\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n /// @notice Returns total fee pair charges\n /// @dev Fee is capped at MAX_FEE\n /// @param pair address of pair for which to calculate fees\n /// @return totalFee total fee amount denominated in basis points\n function getTotalFee(address pair) external view returns (uint256 totalFee);\n\n /// @notice Returns all fees for pair\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFees(address _pair) external view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee);\n\n /// @notice Returns all fees for pair and beneficiaries\n /// @dev Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract\n /// does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied\n /// by priority:\n /// 1. lp fee\n /// 2. royalties\n /// 3. protocol fee\n /// If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then\n /// effective fees will be allocated acording to the fee priority up to MAX_FEE value.\n /// In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.\n /// @param pair address of pair for which to calculate fees and beneficiaries\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesBeneficiary address that gets royalties\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolBeneficiary address that gets protocol fees\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFeesAndRecipients(address pair)\n external\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n );\n\n /// @return protocolFeeBeneficiary address that gets protocol fees\n function protocolFeeBeneficiary() external view returns (address protocolFeeBeneficiary);\n\n /// @notice Internal mapping to store fees for pair. It is exposed for advanced integrations\n /// and in most cases contracts should use fee getters.\n function pairFees(address pair) external view returns (address, uint256, uint256, uint256, bool, bool);\n\n function getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs() external view returns (address[] memory pairs);\n function allPairs(uint256) external view returns (address pair);\n function allPairsLength() external view returns (uint256);\n\n function createPair(address tokenA, address tokenB) external returns (address pair);\n\n /// @notice Sets default fees for all pairs\n /// @param fees struct with default fees\n function setDefaultFees(DefaultFees memory fees) external;\n\n /// @notice Sets royalties fee and beneficiary for pair\n /// @param pair address of pair for which to set fee\n /// @param beneficiary address that gets royalties\n /// @param royaltiesFee amount of royalties fee denominated in basis points\n function setRoyaltiesFee(address pair, address beneficiary, uint256 royaltiesFee) external;\n\n /// @notice Sets protocol fee for pair\n /// @param pair address of pair for which to set fee\n /// @param protocolFee amount of protocol fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setProtocolFee(address pair, uint256 protocolFee, bool overrideFee) external;\n\n /// @notice Sets lp fee for pair\n /// @param pair address of pair for which to set fee\n /// @param lpFee amount of lp fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setLpFee(address pair, uint256 lpFee, bool overrideFee) external;\n\n /// @notice Sets protocol fee beneficiary\n /// @param _beneficiary address that gets protocol fees\n function setProtocolFeeBeneficiary(address _beneficiary) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Pair {\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n /// @notice Emitted by the pool for increases to the number of observations that can be stored\n /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n /// just before a mint/swap/burn.\n /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n event IncreaseObservationCardinalityNext(\n uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew\n );\n\n function MINIMUM_LIQUIDITY() external pure returns (uint256);\n function factory() external view returns (address);\n function token0() external view returns (address);\n function token1() external view returns (address);\n function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\n function observations(uint256 index)\n external\n view\n returns (uint32 blockTimestamp, uint256 priceCumulative, bool initialized);\n\n function observe(uint32[] calldata secondsAgos) external view returns (uint256[] memory tickCumulatives);\n function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n\n function mint(address to) external returns (uint256 liquidity);\n function burn(address to) external returns (uint256 amount0, uint256 amount1);\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;\n function skim(address to) external;\n function sync() external;\n\n function initialize(address, address) external;\n}\n" + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Oracle (modifier version of Oracle.sol from UniswapV3)\n/// @notice Provides price data useful for a wide variety of system designs\n/// @dev Instances of stored oracle data, \"observations\", are collected in the oracle array\n/// Every pool is initialized with an oracle array length of 1. Anyone can pay the SSTOREs to increase the\n/// maximum length of the oracle array. New slots will be added when the array is fully populated.\n/// Observations are overwritten when the full length of the oracle array is populated.\n/// The most recent observation is available, independent of the length of the oracle array, by passing 0 to observe()\nlibrary Oracle {\n struct Observation {\n // the block timestamp of the observation\n uint32 blockTimestamp;\n // the price accumulator, i.e. price * time elapsed since the pool was first initialized\n uint256 priceCumulative;\n // whether or not the observation is initialized\n bool initialized;\n }\n\n /// @notice Transforms a previous observation into a new observation, given the passage of time and the current price values\n /// @dev blockTimestamp _must_ be chronologically equal to or greater than last.blockTimestamp, safe for 0 or 1 overflows\n /// @param last The specified observation to be transformed\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @return Observation The newly populated observation\n function transform(Observation memory last, uint32 blockTimestamp, uint256 lastPrice)\n private\n pure\n returns (Observation memory)\n {\n uint32 delta = blockTimestamp - last.blockTimestamp;\n return Observation({\n blockTimestamp: blockTimestamp,\n priceCumulative: last.priceCumulative + lastPrice * delta,\n initialized: true\n });\n }\n\n /// @notice Initialize the oracle array by writing the first slot. Called once for the lifecycle of the observations array\n /// @param self The stored oracle array\n /// @param time The time of the oracle initialization, via block.timestamp truncated to uint32\n /// @return cardinality The number of populated elements in the oracle array\n /// @return cardinalityNext The new length of the oracle array, independent of population\n function initialize(Observation[65535] storage self, uint32 time)\n internal\n returns (uint16 cardinality, uint16 cardinalityNext)\n {\n self[0] = Observation({blockTimestamp: time, priceCumulative: 0, initialized: true});\n return (1, 1);\n }\n\n /// @notice Writes an oracle observation to the array\n /// @dev Writable at most once per block. Index represents the most recently written element. cardinality and index must be tracked externally.\n /// If the index is at the end of the allowable array length (according to cardinality), and the next cardinality\n /// is greater than the current one, cardinality may be increased. This restriction is created to preserve ordering.\n /// @param self The stored oracle array\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @param cardinality The number of populated elements in the oracle array\n /// @param cardinalityNext The new length of the oracle array, independent of population\n /// @return indexUpdated The new index of the most recently written element in the oracle array\n /// @return cardinalityUpdated The new cardinality of the oracle array\n function write(\n Observation[65535] storage self,\n uint16 index,\n uint32 blockTimestamp,\n uint256 lastPrice,\n uint16 cardinality,\n uint16 cardinalityNext\n ) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated) {\n Observation memory last = self[index];\n\n // early return if we've already written an observation this block\n if (last.blockTimestamp == blockTimestamp) return (index, cardinality);\n\n // if the conditions are right, we can bump the cardinality\n if (cardinalityNext > cardinality && index == (cardinality - 1)) {\n cardinalityUpdated = cardinalityNext;\n } else {\n cardinalityUpdated = cardinality;\n }\n\n indexUpdated = (index + 1) % cardinalityUpdated;\n self[indexUpdated] = transform(last, blockTimestamp, lastPrice);\n }\n\n /// @notice Prepares the oracle array to store up to `next` observations\n /// @param self The stored oracle array\n /// @param current The current next cardinality of the oracle array\n /// @param next The proposed next cardinality which will be populated in the oracle array\n /// @return next The next cardinality which will be populated in the oracle array\n function grow(Observation[65535] storage self, uint16 current, uint16 next) internal returns (uint16) {\n require(current > 0, \"I\");\n // no-op if the passed next value isn't greater than the current next value\n if (next <= current) return current;\n // store in each slot to prevent fresh SSTOREs in swaps\n // this data will not be used because the initialized boolean is still false\n for (uint16 i = current; i < next; i++) {\n self[i].blockTimestamp = 1;\n }\n return next;\n }\n\n /// @notice comparator for 32-bit timestamps\n /// @dev safe for 0 or 1 overflows, a and b _must_ be chronologically before or equal to time\n /// @param time A timestamp truncated to 32 bits\n /// @param a A comparison timestamp from which to determine the relative position of `time`\n /// @param b From which to determine the relative position of `time`\n /// @return bool Whether `a` is chronologically <= `b`\n function lte(uint32 time, uint32 a, uint32 b) private pure returns (bool) {\n // if there hasn't been overflow, no need to adjust\n if (a <= time && b <= time) return a <= b;\n\n uint256 aAdjusted = a > time ? a : a + 2 ** 32;\n uint256 bAdjusted = b > time ? b : b + 2 ** 32;\n\n return aAdjusted <= bAdjusted;\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a target, i.e. where [beforeOrAt, atOrAfter] is satisfied.\n /// The result may be the same observation, or adjacent observations.\n /// @dev The answer must be contained in the array, used when the target is located within the stored observation\n /// boundaries: older than the most recent observation and younger, or the same age as, the oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation recorded before, or at, the target\n /// @return atOrAfter The observation recorded at, or after, the target\n function binarySearch(Observation[65535] storage self, uint32 time, uint32 target, uint16 index, uint16 cardinality)\n private\n view\n returns (Observation memory beforeOrAt, Observation memory atOrAfter)\n {\n uint256 l = (index + 1) % cardinality; // oldest observation\n uint256 r = l + cardinality - 1; // newest observation\n uint256 i;\n while (true) {\n i = (l + r) / 2;\n\n beforeOrAt = self[i % cardinality];\n\n // we've landed on an uninitialized price, keep searching higher (more recently)\n if (!beforeOrAt.initialized) {\n l = i + 1;\n continue;\n }\n\n atOrAfter = self[(i + 1) % cardinality];\n\n bool targetAtOrAfter = lte(time, beforeOrAt.blockTimestamp, target);\n\n // check if we've found the answer!\n if (targetAtOrAfter && lte(time, target, atOrAfter.blockTimestamp)) break;\n\n if (!targetAtOrAfter) r = i - 1;\n else l = i + 1;\n }\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a given target, i.e. where [beforeOrAt, atOrAfter] is satisfied\n /// @dev Assumes there is at least 1 initialized observation.\n /// Used by observeSingle() to compute the counterfactual accumulator values as of a given block timestamp.\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param lastPrice The active price at the time of the returned or simulated observation\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation which occurred at, or before, the given timestamp\n /// @return atOrAfter The observation which occurred at, or after, the given timestamp\n function getSurroundingObservations(\n Observation[65535] storage self,\n uint32 time,\n uint32 target,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n // optimistically set before to the newest observation\n beforeOrAt = self[index];\n\n // if the target is chronologically at or after the newest observation, we can early return\n if (lte(time, beforeOrAt.blockTimestamp, target)) {\n if (beforeOrAt.blockTimestamp == target) {\n // if newest observation equals target, we're in the same block, so we can ignore atOrAfter\n return (beforeOrAt, atOrAfter);\n } else {\n // otherwise, we need to transform\n return (beforeOrAt, transform(beforeOrAt, target, lastPrice));\n }\n }\n\n // now, set before to the oldest observation\n beforeOrAt = self[(index + 1) % cardinality];\n if (!beforeOrAt.initialized) beforeOrAt = self[0];\n\n // ensure that the target is chronologically at or after the oldest observation\n require(lte(time, beforeOrAt.blockTimestamp, target), \"OLD\");\n\n // if we've reached this point, we have to binary search\n return binarySearch(self, time, target, index, cardinality);\n }\n\n /// @dev Reverts if an observation at or before the desired observation timestamp does not exist.\n /// 0 may be passed as `secondsAgo' to return the current cumulative values.\n /// If called with a timestamp falling between two observations, returns the counterfactual accumulator values\n /// at exactly the timestamp between the two observations.\n /// @param self The stored oracle array\n /// @param time The current block timestamp\n /// @param secondsAgo The amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulative The price * time elapsed since the pool was first initialized, as of `secondsAgo`\n function observeSingle(\n Observation[65535] storage self,\n uint32 time,\n uint32 secondsAgo,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256 priceCumulative) {\n if (secondsAgo == 0) {\n Observation memory last = self[index];\n if (last.blockTimestamp != time) last = transform(last, time, lastPrice);\n return last.priceCumulative;\n }\n\n uint32 target = time - secondsAgo;\n\n (Observation memory beforeOrAt, Observation memory atOrAfter) =\n getSurroundingObservations(self, time, target, lastPrice, index, cardinality);\n\n if (target == beforeOrAt.blockTimestamp) {\n // we're at the left boundary\n return beforeOrAt.priceCumulative;\n } else if (target == atOrAfter.blockTimestamp) {\n // we're at the right boundary\n return atOrAfter.priceCumulative;\n } else {\n // we're in the middle\n uint32 observationTimeDelta = atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp;\n uint32 targetDelta = target - beforeOrAt.blockTimestamp;\n return beforeOrAt.priceCumulative\n + ((atOrAfter.priceCumulative - beforeOrAt.priceCumulative) / observationTimeDelta) * targetDelta;\n }\n }\n\n /// @notice Returns the accumulator values as of each time seconds ago from the given time in the array of `secondsAgos`\n /// @dev Reverts if `secondsAgos` > oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param secondsAgos Each amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulatives The price * time elapsed since the pool was first initialized, as of each `secondsAgo`\n function observe(\n Observation[65535] storage self,\n uint32 time,\n uint32[] memory secondsAgos,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256[] memory priceCumulatives) {\n require(cardinality > 0, \"I\");\n\n priceCumulatives = new uint256[](secondsAgos.length);\n for (uint256 i = 0; i < secondsAgos.length; i++) {\n priceCumulatives[i] = observeSingle(self, time, secondsAgos[i], lastPrice, index, cardinality);\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, \"ds-math-add-overflow\");\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, \"ds-math-sub-underflow\");\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, \"ds-math-mul-overflow\");\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing various math operations\n\nlibrary UniswapV2Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UQ112x112.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../../interfaces/IUniswapV2Pair.sol\";\nimport \"../../interfaces/IUniswapV2Callee.sol\";\nimport \"../../interfaces/IUniswapV2Factory.sol\";\n\nimport \"../../libraries/UniswapV2Math.sol\";\nimport \"../../libraries/UQ112x112.sol\";\nimport \"../../libraries/Oracle.sol\";\n\nimport \"../../UniswapV2ERC20.sol\";\n\n/// @dev Minimally adjusted vanilla UniswapV2Pair implementation for testing\n/// @dev CHANGELOG:\n/// - remove body of _mintFee function\n/// - refactor uint112(-1) to type(uint112).max\ncontract UniswapV2PairOriginal is UniswapV2ERC20 {\n using SafeMath for uint256;\n using UQ112x112 for uint224;\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"UniswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"UniswapV2: TRANSFER_FAILED\");\n }\n\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"UniswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"UniswapV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)\n function _mintFee(uint112, uint112) private pure returns (bool) {\n return false;\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Mint(msg.sender, amount0, amount1);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"UniswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"UniswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"UniswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));\n uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(1000 ** 2),\n \"UniswapV2: K\"\n );\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n // force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n // force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/Oracle.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../../periphery/libraries/OracleLibrary.sol\";\nimport \"../UniswapV2Factory.sol\";\n\ncontract OracleImpl {\n function consult(address pair, uint32 period) public view returns (uint256) {\n return OracleLibrary.consult(pair, period);\n }\n}\n\ncontract OracleTest is Test {\n uint256 public constant TIMESTAMP = 1668642357;\n uint256 public constant BLOCKTIME = 15;\n uint256 public START_PRICE;\n\n UniswapV2Pair public pair;\n UniswapV2Factory factory;\n\n ERC20Mintable public DAI = new ERC20Mintable();\n ERC20Mintable public WETH = new ERC20Mintable();\n OracleImpl public oracleImpl = new OracleImpl();\n\n address user1 = address(10000001);\n\n address protocolFeeBeneficiary = address(10000005);\n\n function setUp() public {\n vm.warp(TIMESTAMP);\n\n factory = new UniswapV2Factory(150, 30, protocolFeeBeneficiary);\n\n pair = UniswapV2Pair(factory.createPair(address(WETH), address(DAI)));\n WETH.mint(address(pair), 1000e18);\n DAI.mint(address(pair), 1500000e18);\n pair.mint(user1);\n\n START_PRICE = 1500000e18 * 1e18 / 1000e18;\n }\n\n function _mineBlock(uint256 _time) public {\n vm.roll(block.number + 1);\n vm.warp(block.timestamp + _time);\n }\n\n function _swap(uint256 _wethIn, uint256 _daiIn) public returns (uint256 amountOut) {\n _mineBlock(BLOCKTIME);\n\n (uint112 reserve0, uint112 reserve1,) = pair.getReserves();\n if (_wethIn > 0) {\n uint256 amount1Out =\n UniswapV2Library.getAmountOut(_wethIn, reserve0, reserve1, address(pair), address(factory));\n WETH.mint(address(pair), _wethIn);\n pair.swap(0, amount1Out, user1, bytes(\"\"));\n amountOut = amount1Out;\n } else if (_daiIn > 0) {\n uint256 amount0Out =\n UniswapV2Library.getAmountOut(_daiIn, reserve1, reserve0, address(pair), address(factory));\n DAI.mint(address(pair), _daiIn);\n pair.swap(amount0Out, 0, user1, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testTokensOrder() public {\n assertEq(address(WETH), pair.token0());\n assertEq(address(DAI), pair.token1());\n }\n\n function testConsultOld() public {\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1800);\n\n assertEq(pair.lastPrice(), 0);\n\n _swap(0.01e18, 0);\n vm.warp(block.timestamp + BLOCKTIME);\n assertEq(oracleImpl.consult(address(pair), 15), START_PRICE);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 16);\n\n vm.warp(block.timestamp + 1800 - BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 1800), START_PRICE);\n\n _swap(1e18, 0);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n struct TestAction {\n uint256 wethIn;\n uint256 daiIn;\n uint256 timetravelBefore;\n uint256 timetravelAfter;\n uint32 period;\n uint256 TWAP;\n uint16 observationCardinalityNext;\n uint256 observationIndex;\n }\n\n // workaround for \"UnimplementedFeatureError: Copying of type struct memory to storage not yet supported.\"\n uint256 public constant depositTestCasesLength = 22;\n\n function getTestAction(uint256 _index) public view returns (TestAction memory) {\n TestAction[depositTestCasesLength] memory testSwapCases = [\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 60,\n period: 60,\n TWAP: START_PRICE,\n observationCardinalityNext: 120,\n observationIndex: 0\n }),\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 1800,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1499970495435267142183,\n observationCardinalityNext: 120,\n observationIndex: 1\n }),\n TestAction({\n wethIn: 100e18, // big trade\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 45,\n period: 1800,\n TWAP: 1499969511978807824364,\n observationCardinalityNext: 120,\n observationIndex: 2\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 1363107217423634267487,\n observationCardinalityNext: 120,\n observationIndex: 3\n }),\n TestAction({\n wethIn: 0,\n daiIn: 1000000e18, // huge trade\n timetravelBefore: 900,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1243352310158670807355,\n observationCardinalityNext: 120,\n observationIndex: 4\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1263646160072652749974,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 60 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1344821559728580520453,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 120 sec since huge trade\n timetravelAfter: 330, // 450 sec since huge trade\n period: 1800,\n TWAP: 1872461657492111028567,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 510 sec since huge trade\n timetravelAfter: 390, // 900 sec since huge trade\n period: 1800,\n TWAP: 2481277154911569307160,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 960 sec since huge trade\n timetravelAfter: 390, // 1350 sec since huge trade\n period: 1800,\n TWAP: 3090092652331027585753,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 15, // 1380 sec since huge trade\n timetravelAfter: 400, // 1780 sec since huge trade\n period: 1800,\n TWAP: 3671849683198509940853,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 5, // 1800 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 1860 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 145, // 2020 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 250e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921715,\n observationCardinalityNext: 120,\n observationIndex: 6\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 2783849579014797350624,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 500000e18,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290057,\n observationCardinalityNext: 120,\n observationIndex: 8\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 2554290763490825493524,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n })\n ];\n\n return testSwapCases[_index];\n }\n\n function testConsult() public {\n for (uint256 i = 0; i < depositTestCasesLength; i++) {\n TestAction memory testCase = getTestAction(i);\n\n vm.warp(block.timestamp + testCase.timetravelBefore);\n _swap(testCase.wethIn, testCase.daiIn);\n vm.warp(block.timestamp + testCase.timetravelAfter);\n\n assertEq(oracleImpl.consult(address(pair), testCase.period), testCase.TWAP);\n\n if (testCase.observationCardinalityNext > pair.observationCardinalityNext()) {\n pair.increaseObservationCardinalityNext(testCase.observationCardinalityNext);\n }\n\n assertEq(pair.observationIndex(), testCase.observationIndex);\n }\n }\n\n function testObservationsSingleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, 0);\n assertEq(initialized, true);\n\n _swap(0.01e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME);\n assertEq(initialized, true);\n\n _swap(1e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n function _assertCardinality(\n uint16 observationIndex,\n uint16 observationCardinality,\n uint16 observationCardinalityNext\n ) public {\n assertEq(pair.observationIndex(), observationIndex);\n assertEq(pair.observationCardinality(), observationCardinality);\n assertEq(pair.observationCardinalityNext(), observationCardinalityNext);\n }\n\n function testIncreaseObservationCardinalityNext() public {\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n pair.increaseObservationCardinalityNext(3);\n _assertCardinality(0, 1, 3);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(0, 3, 3);\n\n pair.increaseObservationCardinalityNext(10);\n _assertCardinality(0, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(3, 10, 10);\n\n for (uint256 i = 0; i < 6; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 10);\n\n _swap(1e18, 0);\n _assertCardinality(0, 10, 10);\n\n pair.increaseObservationCardinalityNext(15);\n _assertCardinality(0, 10, 15);\n\n for (uint256 i = 0; i < 9; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 15);\n\n _swap(1e18, 0);\n _assertCardinality(10, 15, 15);\n\n for (uint256 i = 0; i < 4; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(14, 15, 15);\n\n _swap(1e18, 0);\n _assertCardinality(0, 15, 15);\n }\n\n function testObservationsMultipleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n _swap(0.01e18, 0);\n assertEq(pair.lastPrice(), START_PRICE);\n\n (uint32 blockTimestamp0, uint256 priceCumulative0, bool initialized0) = pair.observations(0);\n assertEq(blockTimestamp0, block.timestamp);\n assertEq(priceCumulative0, START_PRICE * BLOCKTIME);\n assertEq(initialized0, true);\n\n pair.increaseObservationCardinalityNext(3);\n\n _swap(100e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(0);\n assertEq(blockTimestamp, blockTimestamp0);\n assertEq(priceCumulative, priceCumulative0);\n assertEq(initialized, initialized0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(1);\n assertEq(blockTimestamp, blockTimestamp0 + BLOCKTIME);\n assertEq(priceCumulative, priceCumulative0 + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Factory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Factory.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\n\ncontract UniswapV2FactoryTest is Test {\n UniswapV2Factory factory;\n\n address pool1;\n address hacker = address(10000004);\n address owner = address(10000005);\n\n address tokenA = address(10000006);\n address tokenB = address(10000007);\n\n address protocolFeeBeneficiary = address(10000005);\n\n uint256 tooBigFee;\n uint256 MAX_FEE;\n\n event PairCreated(\n address indexed token0,\n address indexed token1,\n address pair,\n uint256\n );\n event DefaultFeesSet(IUniswapV2Factory.DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(\n address indexed pair,\n address beneficiary,\n uint256 royaltiesFee\n );\n event ProtocolFeesSet(\n address indexed pair,\n uint256 protocolFee,\n bool overrideFee\n );\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n function setUp() public {\n vm.prank(owner);\n factory = new UniswapV2Factory(0, 0, protocolFeeBeneficiary);\n\n MAX_FEE = factory.MAX_FEE();\n tooBigFee = MAX_FEE + 1;\n\n pool1 = _createPair(tokenA, tokenB);\n }\n\n function _assertFees(\n address _expectedPool,\n address _expectedRoyaltiesBeneficiary,\n uint256 _expectedRoyaltiesFee,\n uint256 _expectedProtocolFee,\n uint256 _expectedLpFee,\n address _expectedProtocolFeeBeneficiary\n ) public {\n (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n ) = factory.getFeesAndRecipients(_expectedPool);\n\n assertEq(lpFee, _expectedLpFee);\n assertEq(royaltiesBeneficiary, _expectedRoyaltiesBeneficiary);\n assertEq(royaltiesFee, _expectedRoyaltiesFee);\n assertEq(protocolBeneficiary, _expectedProtocolFeeBeneficiary);\n assertEq(protocolFee, _expectedProtocolFee);\n }\n\n function _createPair(\n address _tokenA,\n address _tokenB\n ) public returns (address pair) {\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n pair = factory.createPair(_tokenA, _tokenB);\n }\n\n function testSetDefaultFees(uint256 _lpFee, uint256 _protocolFee) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_protocolFee + _lpFee <= MAX_FEE);\n\n (uint256 protocolFee, uint256 lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n\n _assertFees(pool1, address(0), 0, 0, 0, protocolFeeBeneficiary);\n\n IUniswapV2Factory.DefaultFees memory fees = IUniswapV2Factory\n .DefaultFees({protocolFee: _protocolFee, lpFee: _lpFee});\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setDefaultFees(fees);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit DefaultFeesSet(fees);\n factory.setDefaultFees(fees);\n\n (protocolFee, lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, _lpFee);\n\n _assertFees(\n pool1,\n address(0),\n 0,\n _protocolFee,\n _lpFee,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee,\n lpFee: _lpFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: _protocolFee,\n lpFee: tooBigFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee / 2 + 1,\n lpFee: tooBigFee / 2\n })\n );\n }\n\n function testSetLpFee(\n address _pair,\n uint256 _lpFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setLpFee(_pair, _lpFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setLpFee(_pair, _lpFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit LpFeesSet(_pair, _lpFee, true);\n factory.setLpFee(_pair, _lpFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n assertEq(lpFee, _lpFee);\n assertFalse(protocolFeeOverride);\n assertTrue(lpFeeOverride);\n\n _assertFees(_pair, address(0), 0, 0, _lpFee, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _lpFee > MAX_FEE\");\n factory.setLpFee(_pair, tooBigFee, true);\n }\n\n function testSetRoyaltiesFee(\n address _pair,\n address _royaltiesBeneficiary,\n uint256 _royaltiesFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_royaltiesFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _beneficiary invalid\");\n factory.setRoyaltiesFee(_pair, address(0), _royaltiesFee);\n\n vm.assume(_royaltiesBeneficiary != address(0));\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit RoyaltiesFeesSet(_pair, _royaltiesBeneficiary, _royaltiesFee);\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, _royaltiesBeneficiary);\n assertEq(royaltiesFee, _royaltiesFee);\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n assertFalse(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n _royaltiesBeneficiary,\n _royaltiesFee,\n 0,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _royaltiesFee > MAX_FEE\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, tooBigFee);\n }\n\n function testSetProtocolFee(\n address _pair,\n uint256 _protocolFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_pair != pool1);\n\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeesSet(_pair, _protocolFee, true);\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, 0);\n assertTrue(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n address(0),\n 0,\n _protocolFee,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _protocolFee > MAX_FEE\");\n factory.setProtocolFee(_pair, tooBigFee, true);\n }\n\n function testSetProtocolFeeBeneficiary(address _beneficiary) public {\n vm.assume(_beneficiary != address(0));\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n assertEq(factory.protocolFeeBeneficiary(), _beneficiary);\n _assertFees(pool1, address(0), 0, 0, 0, _beneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: BENEFICIARY\");\n factory.setProtocolFeeBeneficiary(address(0));\n }\n\n function testGetFees(\n uint256 _lpFee,\n uint256 _royaltiesFee,\n uint256 _protocolFee\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_royaltiesFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n\n vm.startPrank(owner);\n factory.setLpFee(pool1, _lpFee, true);\n factory.setRoyaltiesFee(pool1, owner, _royaltiesFee);\n factory.setProtocolFee(pool1, _protocolFee, true);\n vm.stopPrank();\n\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = factory\n .getFees(pool1);\n uint256 totalFee = lpFee + royaltiesFee + protocolFee;\n\n assertEq(lpFee, _lpFee);\n\n /// logic below should check that:\n /// - totalFee is never above MAX_FEE\n /// - if _lpFee + _royaltiesFee + _protocolFee > MAX_FEE\n /// then we fill totalFee with fees in following priority:\n /// 1. lpFee\n /// 2. royaltiesFee\n /// 3. protocolFee\n /// until we get to MAX_FEE\n\n if (_lpFee < MAX_FEE) {\n if (_lpFee + _royaltiesFee < MAX_FEE) {\n assertEq(royaltiesFee, _royaltiesFee);\n\n if (_lpFee + _royaltiesFee + _protocolFee <= MAX_FEE) {\n assertEq(protocolFee, _protocolFee);\n assertEq(\n _lpFee + _royaltiesFee + _protocolFee,\n factory.getTotalFee(pool1)\n );\n } else {\n assertEq(protocolFee, MAX_FEE - _lpFee - _royaltiesFee);\n }\n } else {\n assertEq(royaltiesFee, MAX_FEE - _lpFee);\n assertEq(protocolFee, 0);\n }\n } else {\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n }\n\n assertEq(totalFee, factory.getTotalFee(pool1));\n assertTrue(totalFee <= MAX_FEE);\n }\n\n function testCreatePair(address _tokenA, address _tokenB) public {\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n (address token0, address token1) = UniswapV2Library.sortTokens(\n _tokenA,\n _tokenB\n );\n address expectedPair = UniswapV2Library.pairFor(\n address(factory),\n _tokenA,\n _tokenB\n );\n\n vm.expectEmit(true, true, true, true);\n emit PairCreated(token0, token1, expectedPair, 2);\n address pair = factory.createPair(_tokenA, _tokenB);\n\n assertEq(pair, expectedPair);\n assertEq(factory.getPair(_tokenA, _tokenB), pair);\n assertEq(factory.getPair(_tokenB, _tokenA), pair);\n assertEq(factory.allPairs(1), pair);\n assertEq(factory.allPairsLength(), 2);\n\n address[] memory allPairs = factory.allPairs();\n assertEq(allPairs[0], pool1);\n assertEq(allPairs[1], pair);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Pair.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../UniswapV2Factory.sol\";\nimport \"./mock/UniswapV2PairOriginal.sol\";\n\ncontract UniswapV2PairTest is Test {\n UniswapV2Pair pair;\n UniswapV2Pair pairWithFees;\n UniswapV2PairOriginal pairOriginal;\n UniswapV2Factory factory;\n\n ERC20Mintable token0;\n ERC20Mintable token1;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n address royaltiesBeneficiary = address(10000006);\n\n uint256 royaltiesFee = 50;\n uint256 protocolFee = 50;\n\n function setUp() public {\n address tokenA = address(new ERC20Mintable());\n address tokenB = address(new ERC20Mintable());\n (tokenA, tokenB) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n token0 = ERC20Mintable(tokenA);\n token1 = ERC20Mintable(tokenB);\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n vm.startPrank(address(factory));\n\n pair = new UniswapV2Pair();\n pair.initialize(address(token0), address(token1));\n\n pairOriginal = new UniswapV2PairOriginal();\n pairOriginal.initialize(address(token0), address(token1));\n\n pairWithFees = UniswapV2Pair(factory.createPair(address(token0), address(token1)));\n\n vm.stopPrank();\n\n factory.setRoyaltiesFee(address(pairWithFees), royaltiesBeneficiary, royaltiesFee);\n factory.setProtocolFee(address(pairWithFees), protocolFee, true);\n factory.setProtocolFeeBeneficiary(protocolFeeBeneficiary);\n }\n\n function _assertPairs(UniswapV2Pair _pair, UniswapV2PairOriginal _pairOriginal) public {\n assertEq(_pair.token0(), _pairOriginal.token0());\n assertEq(_pair.token1(), _pairOriginal.token1());\n\n (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _pair.getReserves();\n (uint112 _reserve0Org, uint112 _reserve1Org, uint32 _blockTimestampLastOrg) = _pairOriginal.getReserves();\n\n assertEq(_reserve0, _reserve0Org);\n assertEq(_reserve1, _reserve1Org);\n assertEq(_blockTimestampLast, _blockTimestampLastOrg);\n\n assertEq(_pair.factory(), _pairOriginal.factory());\n\n assertEq(token0.balanceOf(address(_pair)), token0.balanceOf(address(_pairOriginal)));\n assertEq(token1.balanceOf(address(_pair)), token1.balanceOf(address(_pairOriginal)));\n }\n\n function _addLiquidity(address _pair, uint256 _amount0, uint256 _amount1, address _to)\n public\n returns (uint256 liquidity)\n {\n token0.mint(_pair, _amount0);\n token1.mint(_pair, _amount1);\n\n liquidity = UniswapV2Pair(_pair).mint(_to);\n }\n\n function testMintBurnRegression(uint112 _amount0, uint112 _amount1) public {\n vm.assume(_amount0 > pair.MINIMUM_LIQUIDITY());\n vm.assume(_amount1 > pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidity = _addLiquidity(address(pair), _amount0, _amount1, user1);\n assertEq(liquidity, pair.totalSupply() - pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidityOriginal = _addLiquidity(address(pairOriginal), _amount0, _amount1, user1);\n assertEq(liquidityOriginal, pairOriginal.totalSupply() - pairOriginal.MINIMUM_LIQUIDITY());\n\n assertEq(liquidity, liquidityOriginal);\n\n _assertPairs(pair, pairOriginal);\n\n vm.prank(user1);\n pair.transfer(address(pair), liquidity);\n (uint256 amount0, uint256 amount1) = pair.burn(user1);\n\n vm.prank(user1);\n pairOriginal.transfer(address(pairOriginal), liquidity);\n (uint256 amount0Org, uint256 amount1Org) = pairOriginal.burn(user2);\n\n assertEq(amount0, amount0Org);\n assertEq(amount1, amount1Org);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function _swap(address _pair, uint256 _amount0In, uint256 _amount1In, address _to)\n public\n returns (uint256 amountOut)\n {\n (uint112 reserve0, uint112 reserve1,) = UniswapV2Pair(_pair).getReserves();\n token0.mint(_pair, _amount0In);\n token1.mint(_pair, _amount1In);\n\n if (_amount0In > _amount1In) {\n uint256 amount1Out = UniswapV2Library.getAmountOut(_amount0In, reserve0, reserve1, _pair, address(factory));\n UniswapV2Pair(_pair).swap(0, amount1Out, _to, bytes(\"\"));\n amountOut = amount1Out;\n } else {\n uint256 amount0Out = UniswapV2Library.getAmountOut(_amount1In, reserve1, reserve0, _pair, address(factory));\n UniswapV2Pair(_pair).swap(amount0Out, 0, _to, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testSwapRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n uint256 amount1Out = _swap(address(pair), _amount0In, 0, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n assertEq(amount1Out, amount1OutOrg);\n _assertPairs(pair, pairOriginal);\n\n for (uint256 i = 0; i < 20; i++) {\n if (i % 2 == 0) {\n _swap(address(pair), _amount0In, 0, user1);\n _swap(address(pairOriginal), _amount0In, 0, user2);\n } else {\n _swap(address(pair), 0, _amount1In, user1);\n _swap(address(pairOriginal), 0, _amount1In, user2);\n }\n }\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSkimRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n pair.skim(user1);\n assertEq(token0.balanceOf(user1), _amount0In);\n assertEq(token1.balanceOf(user1), _amount1In);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n pairOriginal.skim(user2);\n assertEq(token0.balanceOf(user2), _amount0In);\n assertEq(token1.balanceOf(user2), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSyncRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n\n pair.sync();\n pairOriginal.sync();\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSwapWithFees(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In, uint256 _hijackAmount) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n vm.assume(_amount0In > _hijackAmount);\n\n _addLiquidity(address(pairWithFees), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pairWithFees, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n (, address beneficiary, uint256 royalties, address protocolBeneficiary, uint256 protocolBeneficiaryFee) =\n factory.getFeesAndRecipients(address(pairWithFees));\n\n assertEq(beneficiary, royaltiesBeneficiary);\n assertEq(royalties, royaltiesFee);\n assertEq(token0.balanceOf(beneficiary), 0);\n uint256 royaltiesAmount = _amount0In * royalties / 10000;\n\n assertEq(protocolBeneficiary, protocolFeeBeneficiary);\n assertEq(protocolBeneficiaryFee, protocolFee);\n assertEq(token0.balanceOf(protocolBeneficiary), 0);\n uint256 protocolFeeAmount = _amount0In * protocolBeneficiaryFee / 10000;\n\n uint256 amount1Out = _swap(address(pairWithFees), _amount0In, _hijackAmount, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n assertEq(token0.balanceOf(beneficiary), royaltiesAmount);\n assertEq(token0.balanceOf(protocolBeneficiary), protocolFeeAmount);\n assertEq(token1.balanceOf(beneficiary), _hijackAmount * royalties / 10000);\n assertEq(token1.balanceOf(protocolBeneficiary), _hijackAmount * protocolBeneficiaryFee / 10000);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n uint256 maxPercentDelta = (royaltiesFee + protocolFee + 1) * 1e18 / 10000;\n assertApproxEqRel(amount1Out, amount1OutOrg, maxPercentDelta);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./interfaces/IUniswapV2ERC20.sol\";\nimport \"./libraries/SafeMath.sol\";\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using SafeMath for uint256;\n\n string public constant name = \"Magicswap V2\";\n string public constant symbol = \"MAGIC-V2\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH =\n 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint256) public nonces;\n\n constructor() {\n uint256 chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(bytes(\"1\")),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint256 value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint256 value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external\n {\n require(deadline >= block.timestamp, \"MagicswapV2: EXPIRED\");\n bytes32 digest = keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"MagicswapV2: INVALID_SIGNATURE\");\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\n\nimport \"./interfaces/IUniswapV2Factory.sol\";\nimport \"./UniswapV2Pair.sol\";\n\ncontract UniswapV2Factory is IUniswapV2Factory, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n\n /// @dev Fee is denominated in basis points so 5000 / 10000 = 50%\n uint256 public constant MAX_FEE = 5000;\n\n address public protocolFeeBeneficiary;\n\n mapping(address => mapping(address => address)) public getPair;\n EnumerableSet.AddressSet private _allPairs;\n\n DefaultFees public defaultFees;\n mapping(address => Fees) public pairFees;\n\n constructor(uint256 _defaultProtocolFee, uint256 _defaultLpFee, address _protocolFeeBeneficiary) {\n DefaultFees memory startFees = DefaultFees({protocolFee: _defaultProtocolFee, lpFee: _defaultLpFee});\n\n setDefaultFees(startFees);\n setProtocolFeeBeneficiary(_protocolFeeBeneficiary);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getTotalFee(address _pair) public view returns (uint256) {\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = _getFees(_pair);\n return lpFee + royaltiesFee + protocolFee;\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFees(address _pair) public view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n return _getFees(_pair);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFeesAndRecipients(address _pair)\n public\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n )\n {\n (lpFee, royaltiesFee, protocolFee) = _getFees(_pair);\n\n royaltiesBeneficiary = pairFees[_pair].royaltiesBeneficiary;\n protocolBeneficiary = protocolFeeBeneficiary;\n }\n\n function allPairs() external view returns (address[] memory) {\n return _allPairs.values();\n }\n\n function allPairs(uint256 _index) external view returns (address) {\n return _allPairs.at(_index);\n }\n\n function allPairsLength() external view returns (uint256) {\n return _allPairs.length();\n }\n\n function createPair(address tokenA, address tokenB) external returns (address pair) {\n require(tokenA != tokenB, \"MagicswapV2: IDENTICAL_ADDRESSES\");\n (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"MagicswapV2: ZERO_ADDRESS\");\n require(getPair[token0][token1] == address(0), \"MagicswapV2: PAIR_EXISTS\"); // single check is sufficient\n bytes memory bytecode = type(UniswapV2Pair).creationCode;\n bytes32 salt = keccak256(abi.encodePacked(token0, token1));\n assembly {\n pair := create2(0, add(bytecode, 32), mload(bytecode), salt)\n }\n IUniswapV2Pair(pair).initialize(token0, token1);\n getPair[token0][token1] = pair;\n getPair[token1][token0] = pair; // populate mapping in the reverse direction\n _allPairs.add(pair);\n emit PairCreated(token0, token1, pair, _allPairs.length());\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setDefaultFees(DefaultFees memory _fees) public onlyOwner {\n require(_fees.protocolFee <= MAX_FEE, \"MagicswapV2: protocolFee > MAX_FEE\");\n require(_fees.lpFee <= MAX_FEE, \"MagicswapV2: lpFee > MAX_FEE\");\n require(_fees.protocolFee + _fees.lpFee <= MAX_FEE, \"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n\n defaultFees = _fees;\n\n emit DefaultFeesSet(_fees);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setLpFee(address _pair, uint256 _lpFee, bool _overrideFee) external onlyOwner {\n require(_lpFee <= MAX_FEE, \"MagicswapV2: _lpFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].lpFee = _lpFee;\n pairFees[_pair].lpFeeOverride = _overrideFee;\n\n emit LpFeesSet(_pair, _lpFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setRoyaltiesFee(address _pair, address _beneficiary, uint256 _royaltiesFee) external onlyOwner {\n require(_royaltiesFee <= MAX_FEE, \"MagicswapV2: _royaltiesFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n require(_beneficiary != address(0), \"MagicswapV2: _beneficiary invalid\");\n\n pairFees[_pair].royaltiesBeneficiary = _beneficiary;\n pairFees[_pair].royaltiesFee = _royaltiesFee;\n\n emit RoyaltiesFeesSet(_pair, _beneficiary, _royaltiesFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFee(address _pair, uint256 _protocolFee, bool _overrideFee) external onlyOwner {\n require(_protocolFee <= MAX_FEE, \"MagicswapV2: _protocolFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].protocolFee = _protocolFee;\n pairFees[_pair].protocolFeeOverride = _overrideFee;\n\n emit ProtocolFeesSet(_pair, _protocolFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFeeBeneficiary(address _beneficiary) public onlyOwner {\n require(_beneficiary != address(0), \"MagicswapV2: BENEFICIARY\");\n protocolFeeBeneficiary = _beneficiary;\n\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n }\n\n function _getLpFee(address _pair) internal view returns (uint256 lpFee) {\n if (pairFees[_pair].lpFeeOverride) {\n return pairFees[_pair].lpFee;\n } else {\n return defaultFees.lpFee;\n }\n }\n\n function _getRoyaltiesFee(address _pair) internal view returns (uint256 royaltiesFee) {\n return pairFees[_pair].royaltiesFee;\n }\n\n function _getProtocolFee(address _pair) internal view returns (uint256 protocolFee) {\n if (pairFees[_pair].protocolFeeOverride) {\n return pairFees[_pair].protocolFee;\n } else {\n return defaultFees.protocolFee;\n }\n }\n\n function _getFees(address _pair) internal view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n lpFee = _getLpFee(_pair);\n /// lpFee should never be above MAX_FEE but never too safe.\n /// If lpFee is set to MAX_FEE then we know there's no more space for other fees\n if (lpFee >= MAX_FEE) {\n return (MAX_FEE, 0, 0);\n }\n\n royaltiesFee = _getRoyaltiesFee(_pair);\n /// if royaltiesFee + lpFee is greater than MAX_FEE, then decrease royaltiesFee\n /// and return as we know there's no more space for other fees\n if (royaltiesFee >= MAX_FEE - lpFee) {\n return (lpFee, MAX_FEE - lpFee, 0);\n }\n\n protocolFee = _getProtocolFee(_pair);\n /// if protocolFee + royaltiesFee + lpFee is greater than MAX_FEE, then decrease protocolFee\n if (protocolFee > MAX_FEE - lpFee - royaltiesFee) {\n protocolFee = MAX_FEE - lpFee - royaltiesFee;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"./interfaces/IUniswapV2Pair.sol\";\nimport \"./interfaces/IUniswapV2Factory.sol\";\n\nimport \"./libraries/UniswapV2Math.sol\";\nimport \"./libraries/Oracle.sol\";\n\nimport \"./UniswapV2ERC20.sol\";\n\ncontract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {\n using SafeMath for uint256;\n using Oracle for Oracle.Observation[65535];\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n uint256 public constant BASIS_POINTS = 10000;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n // decimal points of token0\n uint256 public TOKEN0_DECIMALS;\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n // the most recent price of token1/token0. Inherits decimals of token1.\n uint256 public lastPrice;\n // the most-recently updated index of the observations array\n uint16 public observationIndex;\n // the current maximum number of observations that are being stored\n uint16 public observationCardinality;\n // the next maximum number of observations to store, triggered in observations.write\n uint16 public observationCardinalityNext;\n\n Oracle.Observation[65535] public override observations;\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"MagicswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"MagicswapV2: TRANSFER_FAILED\");\n }\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"MagicswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n\n TOKEN0_DECIMALS = UniswapV2ERC20(_token0).decimals();\n\n (uint16 cardinality, uint16 cardinalityNext) = observations.initialize(_blockTimestamp());\n\n observationIndex = 0;\n observationCardinality = cardinality;\n observationCardinalityNext = cardinalityNext;\n }\n\n function _blockTimestamp() internal view virtual returns (uint32) {\n return uint32(block.timestamp); // truncation is desired\n }\n\n /// @dev update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"MagicswapV2: OVERFLOW\");\n\n uint32 blockTimestamp;\n uint32 timeElapsed;\n unchecked {\n blockTimestamp = uint32(block.timestamp % 2 ** 32);\n timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n }\n\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // this is first trade of the block and reserves are not yet updated\n lastPrice = 10 ** TOKEN0_DECIMALS * _reserve1 / _reserve0;\n\n // write an oracle entry\n (observationIndex, observationCardinality) = observations.write(\n observationIndex, _blockTimestamp(), lastPrice, observationCardinality, observationCardinalityNext\n );\n }\n\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n /// @dev Calculates fees and sends them to beneficiaries\n function _takeFees(uint256 balance0Adjusted, uint256 balance1Adjusted, uint256 amount0In, uint256 amount1In)\n internal\n returns (uint256 balance0, uint256 balance1)\n {\n (, address royaltiesBeneficiary, uint256 royaltiesFee, address protocolFeeBeneficiary, uint256 protocolFee) =\n IUniswapV2Factory(factory).getFeesAndRecipients(address(this));\n\n address _token0 = token0;\n address _token1 = token1;\n\n for (uint8 i = 0; i < 2; i++) {\n address feeToken = i == 0 ? _token0 : _token1;\n uint256 swapAmount = i == 0 ? amount0In : amount1In;\n\n if (swapAmount > 0) {\n uint256 royaltiesFeeAmount = swapAmount * royaltiesFee / BASIS_POINTS;\n\n // send royalties\n if (royaltiesFeeAmount > 0) {\n _safeTransfer(feeToken, royaltiesBeneficiary, royaltiesFeeAmount);\n }\n\n uint256 protocolFeeAmount = swapAmount * protocolFee / BASIS_POINTS;\n\n // send protocol fee\n if (protocolFeeAmount > 0) {\n _safeTransfer(feeToken, protocolFeeBeneficiary, protocolFeeAmount);\n }\n }\n }\n\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n // Make sure that either balance does not go below adjusted balance used for K calcualtions.\n // If balances after fee transfers are above or equal adjusted balances then K still holds.\n require(balance0 >= balance0Adjusted / BASIS_POINTS, \"MagicswapV2: balance0Adjusted\");\n require(balance1 >= balance1Adjusted / BASIS_POINTS, \"MagicswapV2: balance1Adjusted\");\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Mint(msg.sender, amount0, amount1);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n /// @dev keeping bytes parameter for backward compatibility of the interface\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"MagicswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"MagicswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"MagicswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"MagicswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(address(this));\n uint256 balance0Adjusted = balance0.mul(BASIS_POINTS).sub(amount0In.mul(totalFee));\n uint256 balance1Adjusted = balance1.mul(BASIS_POINTS).sub(amount1In.mul(totalFee));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(BASIS_POINTS ** 2),\n \"MagicswapV2: K\"\n );\n (balance0, balance1) = _takeFees(balance0Adjusted, balance1Adjusted, amount0In, amount1In);\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n /// @dev Read TWAP price\n function observe(uint32[] calldata secondsAgos)\n external\n view\n override\n returns (uint256[] memory priceCumulatives)\n {\n return observations.observe(_blockTimestamp(), secondsAgos, lastPrice, observationIndex, observationCardinality);\n }\n\n /// @dev Increase number of data points for price history\n function increaseObservationCardinalityNext(uint16 _observationCardinalityNext) external override lock {\n uint16 observationCardinalityNextOld = observationCardinalityNext; // for the event\n uint16 observationCardinalityNextNew =\n observations.grow(observationCardinalityNextOld, _observationCardinalityNext);\n observationCardinalityNext = observationCardinalityNextNew;\n if (observationCardinalityNextOld != observationCardinalityNextNew) {\n emit IncreaseObservationCardinalityNext(observationCardinalityNextOld, observationCardinalityNextNew);\n }\n }\n\n /// @dev force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n /// @dev force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/Babylonian.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// computes square roots using the babylonian method\n// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method\nlibrary Babylonian {\n // credit for this implementation goes to\n // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687\n function sqrt(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);\n // however that code costs significantly more gas\n uint256 xx = x;\n uint256 r = 1;\n if (xx >= 0x100000000000000000000000000000000) {\n xx >>= 128;\n r <<= 64;\n }\n if (xx >= 0x10000000000000000) {\n xx >>= 64;\n r <<= 32;\n }\n if (xx >= 0x100000000) {\n xx >>= 32;\n r <<= 16;\n }\n if (xx >= 0x10000) {\n xx >>= 16;\n r <<= 8;\n }\n if (xx >= 0x100) {\n xx >>= 8;\n r <<= 4;\n }\n if (xx >= 0x10) {\n xx >>= 4;\n r <<= 2;\n }\n if (xx >= 0x8) {\n r <<= 1;\n }\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1; // Seven iterations should be enough\n uint256 r1 = x / r;\n return (r < r1 ? r : r1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/BitMath.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nlibrary BitMath {\n // returns the 0 indexed position of the most significant bit of the input x\n // s.t. x >= 2**msb and x < 2**(msb+1)\n function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::mostSignificantBit: zero\");\n\n if (x >= 0x100000000000000000000000000000000) {\n x >>= 128;\n r += 128;\n }\n if (x >= 0x10000000000000000) {\n x >>= 64;\n r += 64;\n }\n if (x >= 0x100000000) {\n x >>= 32;\n r += 32;\n }\n if (x >= 0x10000) {\n x >>= 16;\n r += 16;\n }\n if (x >= 0x100) {\n x >>= 8;\n r += 8;\n }\n if (x >= 0x10) {\n x >>= 4;\n r += 4;\n }\n if (x >= 0x4) {\n x >>= 2;\n r += 2;\n }\n if (x >= 0x2) r += 1;\n }\n\n // returns the 0 indexed position of the least significant bit of the input x\n // s.t. (x & 2**lsb) != 0 and (x & (2**(lsb) - 1)) == 0)\n // i.e. the bit at the index is set and the mask of all lower bits is 0\n function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::leastSignificantBit: zero\");\n\n r = 255;\n if (x & type(uint128).max > 0) {\n r -= 128;\n } else {\n x >>= 128;\n }\n if (x & type(uint64).max > 0) {\n r -= 64;\n } else {\n x >>= 64;\n }\n if (x & type(uint32).max > 0) {\n r -= 32;\n } else {\n x >>= 32;\n }\n if (x & type(uint16).max > 0) {\n r -= 16;\n } else {\n x >>= 16;\n }\n if (x & type(uint8).max > 0) {\n r -= 8;\n } else {\n x >>= 8;\n }\n if (x & 0xf > 0) {\n r -= 4;\n } else {\n x >>= 4;\n }\n if (x & 0x3 > 0) {\n r -= 2;\n } else {\n x >>= 2;\n }\n if (x & 0x1 > 0) r -= 1;\n }\n}\n" + }, + "contracts/UniswapV2/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: CC-BY-4.0\npragma solidity 0.8.20;\n\n// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1\n// license is CC-BY-4.0\nlibrary FullMath {\n function inverse(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n\n return type(uint256).max - x + 1;\n }\n\n function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {\n uint256 mm = mulmod(x, y, type(uint256).max);\n l = x * y;\n h = mm - l;\n if (mm < l) h -= 1;\n }\n\n function fullDiv(uint256 l, uint256 h, uint256 d) private pure returns (uint256) {\n uint256 pow2 = d & inverse(d);\n d /= pow2;\n l /= pow2;\n l += h * ((inverse(pow2)) / pow2 + 1);\n uint256 r = 1;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n return l * r;\n }\n\n function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) {\n (uint256 l, uint256 h) = fullMul(x, y);\n\n uint256 mm = mulmod(x, y, d);\n if (mm > l) h -= 1;\n l -= mm;\n\n if (h == 0) return l / d;\n\n require(h < d, \"FullMath: FULLDIV_OVERFLOW\");\n return fullDiv(l, h, d);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false\nlibrary TransferHelper {\n function safeApprove(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('approve(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeApprove: approve failed\"\n );\n }\n\n function safeTransfer(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transfer(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeTransfer: transfer failed\"\n );\n }\n\n function safeTransferFrom(address token, address from, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))),\n \"TransferHelper::transferFrom: transferFrom failed\"\n );\n }\n\n function safeTransferETH(address to, uint256 value) internal {\n (bool success,) = to.call{value: value}(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n }\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Router01 {\n\n error UniswapV2RouterExpired();\n error UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n error UniswapV2RouterInsufficientBAmount();\n error UniswapV2RouterInsufficientAAmount();\n error UniswapV2RouterInsufficientOutputAmount();\n error UniswapV2RouterExcessiveInputAmount();\n error UniswapV2RouterInvalidPath();\n\n function factory() external view returns (address);\n function WETH() external view returns (address);\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountToken, uint256 amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountToken, uint256 amountETH);\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountOut);\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountIn);\n function getAmountsOut(uint256 amountIn, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n function getAmountsIn(uint256 amountOut, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IWETH {\n function deposit() external payable;\n function transfer(address to, uint value) external returns (bool);\n function withdraw(uint) external;\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/OracleLibrary.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\n\n/// @title Oracle library\n/// @notice Provides functions to integrate with MagicswapV2 pool oracle\nlibrary OracleLibrary {\n /// @notice Fetches time-weighted average price using MagicswapV2 oracle\n /// @param pool Address of Uniswap V3 pool that we want to observe\n /// @param period Number of seconds in the past to start calculating time-weighted average\n /// @return timeWeightedAveragePrice The time-weighted average tick from (block.timestamp - period) to block.timestamp\n function consult(address pool, uint32 period) internal view returns (uint256 timeWeightedAveragePrice) {\n require(period != 0, \"BP\");\n\n uint32[] memory secondAgos = new uint32[](2);\n secondAgos[0] = period;\n secondAgos[1] = 0;\n\n uint256[] memory priceCumulatives = IUniswapV2Pair(pool).observe(secondAgos);\n uint256 priceCumulativesDelta = priceCumulatives[1] - priceCumulatives[0];\n\n timeWeightedAveragePrice = priceCumulativesDelta / period;\n }\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\nimport \"../../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../../core/libraries/SafeMath.sol\";\n\n/**\n * @notice Modified UniswapV2 to work with zksync stack based CREATE2\n **/\nlibrary UniswapV2Library {\n using SafeMath for uint256;\n\n /// @dev returns sorted token addresses, used to handle return values from pairs sorted in this order\n function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {\n require(tokenA != tokenB, \"UniswapV2Library: IDENTICAL_ADDRESSES\");\n (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"UniswapV2Library: ZERO_ADDRESS\");\n }\n\n // calculates the CREATE2 address for a pair without making any external calls\n function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {\n (address token0, address token1) = sortTokens(tokenA, tokenB);\n pair = address(uint160(\n uint256(\n keccak256(\n abi.encodePacked(\n bytes32(0x2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494), // keccak256(\"zksyncCreate2\")\n bytes32(uint256(uint160(factory))), // sender\n keccak256(abi.encodePacked(token0, token1)), // salt\n hex'010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43', // init code hash\n bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) // constructor input hash: keccak256(\"\")\n )\n )\n )\n ));\n }\n\n /// @dev fetches and sorts the reserves for a pair\n function getReserves(address factory, address tokenA, address tokenB)\n internal\n view\n returns (uint256 reserveA, uint256 reserveB)\n {\n (address token0,) = sortTokens(tokenA, tokenB);\n (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();\n (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);\n }\n\n /// @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) {\n require(amountA > 0, \"UniswapV2Library: INSUFFICIENT_AMOUNT\");\n require(reserveA > 0 && reserveB > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n amountB = amountA.mul(reserveB) / reserveA;\n }\n\n /// @dev given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountOut)\n {\n require(amountIn > 0, \"UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 amountInWithFee = amountIn.mul(10000 - totalFee);\n uint256 numerator = amountInWithFee.mul(reserveOut);\n uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);\n amountOut = numerator / denominator;\n }\n\n /// @dev given an output amount of an asset and pair reserves, returns a required input amount of the other asset\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountIn)\n {\n require(amountOut > 0, \"UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 numerator = reserveIn.mul(amountOut).mul(10000);\n uint256 denominator = reserveOut.sub(amountOut).mul(10000 - totalFee);\n amountIn = (numerator / denominator).add(1);\n }\n\n /// @dev performs chained getAmountOut calculations on any number of pairs\n function getAmountsOut(address factory, uint256 amountIn, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[0] = amountIn;\n for (uint256 i; i < path.length - 1; i++) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);\n amounts[i + 1] =\n getAmountOut(amounts[i], reserveIn, reserveOut, pairFor(factory, path[i], path[i + 1]), factory);\n }\n }\n\n /// @dev performs chained getAmountIn calculations on any number of pairs\n function getAmountsIn(address factory, uint256 amountOut, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[amounts.length - 1] = amountOut;\n for (uint256 i = path.length - 1; i > 0; i--) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);\n address pair = pairFor(factory, path[i - 1], path[i]);\n amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, pair, factory);\n }\n }\n}\n" + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../core/interfaces/IUniswapV2ERC20.sol\";\nimport \"../core/libraries/SafeMath.sol\";\nimport \"../libraries/TransferHelper.sol\";\n\nimport \"./interfaces/IUniswapV2Router01.sol\";\nimport \"./libraries/UniswapV2Library.sol\";\nimport \"./interfaces/IWETH.sol\";\n\ncontract UniswapV2Router02 is IUniswapV2Router01 {\n using SafeMath for uint256;\n\n address public immutable override factory;\n address public immutable override WETH;\n\n \n modifier ensure(uint256 deadline) {\n if(deadline < block.timestamp) revert UniswapV2RouterExpired();\n _;\n }\n\n constructor(address _factory, address _WETH) {\n factory = _factory;\n WETH = _WETH;\n }\n\n receive() external payable {\n if(msg.sender != WETH) revert UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n }\n\n // **** ADD LIQUIDITY ****\n function _addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin\n ) internal virtual returns (uint256 amountA, uint256 amountB) {\n // create the pair if it doesn't exist yet\n if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {\n IUniswapV2Factory(factory).createPair(tokenA, tokenB);\n }\n (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);\n if (reserveA == 0 && reserveB == 0) {\n (amountA, amountB) = (amountADesired, amountBDesired);\n } else {\n uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);\n if (amountBOptimal <= amountBDesired) {\n if(amountBOptimal < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n (amountA, amountB) = (amountADesired, amountBOptimal);\n } else {\n uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);\n assert(amountAOptimal <= amountADesired);\n if(amountAOptimal < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n (amountA, amountB) = (amountAOptimal, amountBDesired);\n }\n }\n }\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) {\n (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);\n TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);\n liquidity = IUniswapV2Pair(pair).mint(to);\n }\n\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable virtual override returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH, liquidity) =\n _addLiquidityETH(token, amountTokenDesired, amountTokenMin, amountETHMin, msg.sender, to, deadline);\n }\n\n function _addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH) =\n _addLiquidity(token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n TransferHelper.safeTransferFrom(token, from, pair, amountToken);\n IWETH(WETH).deposit{value: amountETH}();\n assert(IWETH(WETH).transfer(pair, amountETH));\n liquidity = IUniswapV2Pair(pair).mint(to);\n // refund dust eth, if any\n if (msg.value > amountETH) TransferHelper.safeTransferETH(to, msg.value - amountETH);\n }\n\n // **** REMOVE LIQUIDITY ****\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n IUniswapV2ERC20(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair\n (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);\n (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);\n (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);\n if(amountA < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n if(amountB < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n }\n\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);\n TransferHelper.safeTransfer(token, to, amountToken);\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(to, amountETH);\n }\n\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);\n }\n\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountToken, uint256 amountETH) {\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);\n }\n\n // **** SWAP ****\n // requires the initial amount to have already been sent to the first pair\n function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual {\n for (uint256 i; i < path.length - 1; i++) {\n (address input, address output) = (path[i], path[i + 1]);\n (address token0,) = UniswapV2Library.sortTokens(input, output);\n uint256 amountOut = amounts[i + 1];\n (uint256 amount0Out, uint256 amount1Out) =\n input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));\n address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;\n IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(\n amount0Out, amount1Out, to, new bytes(0)\n );\n }\n }\n\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address to,\n uint256 deadline\n ) public virtual override returns (uint256[] memory amounts) {\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, path, msg.sender, to, deadline);\n }\n\n function _swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override returns (uint256[] memory amounts) {\n amounts = _swapTokensForExactTokens(amountOut, amountInMax, path, msg.sender, to, deadline);\n }\n\n function _swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n public\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > msg.value) revert UniswapV2RouterExcessiveInputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n // refund dust eth, if any\n if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);\n }\n\n // **** LIBRARY FUNCTIONS ****\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB)\n public\n pure\n virtual\n override\n returns (uint256 amountB)\n {\n return UniswapV2Library.quote(amountA, reserveA, reserveB);\n }\n\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountOut)\n {\n return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountIn)\n {\n return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountsOut(uint256 amountIn, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsOut(factory, amountIn, path);\n }\n\n function getAmountsIn(uint256 amountOut, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsIn(factory, amountOut, path);\n }\n}\n" + }, + "contracts/Vault/INftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVault {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Collection already added\n error DuplicateCollection();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice amount of token required for last NFT to be redeemed\n function LAST_NFT_AMOUNT() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n}\n" + }, + "contracts/Vault/INftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVault.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactory {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVault indexed vault,\n uint256 indexed vaultId,\n INftVault.CollectionData[] collections,\n address creator\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVault vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param index vaultId or index in NftVaultFactory.vaults array\n /// @return vault address\n function getVaultAt(uint256 index) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n /// @return true if vault is deployed by the factory\n function isVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVault.CollectionData[] memory collections) external view returns (INftVault vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVault.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVault.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function reverts\n /// @param collections vault's config\n /// @return vault address of deployed vault\n function createVault(INftVault.CollectionData[] memory collections) external returns (INftVault vault);\n}\n" + }, + "contracts/Vault/NftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVault.sol\";\nimport \"./INftVaultFactory.sol\";\n\ncontract NftVault is INftVault, ERC20, ERC721Holder, ERC1155Holder {\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice amount of token required for last NFT to be redeemed\n uint256 public immutable LAST_NFT_AMOUNT;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n /// @dev last NFT can be redeemed for 99.9%\n LAST_NFT_AMOUNT = ONE * 999 / 1000;\n }\n\n /// @inheritdoc INftVault\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n if (!allowedCollections.set(collection.addr, nftType)) revert DuplicateCollection();\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n emit CollectionAllowed(collection);\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n }\n }\n\n /// @inheritdoc INftVault\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVault\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVault\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVault\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVault\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n uint256 totalSupply_ = totalSupply();\n\n /// @dev If vault ERC20 supply is \"0 < totalSupply <= 0.01\" it means that vault has been emptied and there\n /// is leftover ERC20 token (most likely) locked in the univ2 pair. To prevent minting small amounts\n /// of unbacked ERC20 tokens in a loop, which can lead to unexpected behaviour, vault mints\n /// `ONE - totalSupply` amount of ERC20 token for the first NFT that is deposited after the vault was\n /// emptied. This allows for the vault and univ2 pair to be reused safely.\n if (totalSupply_ > 0 && totalSupply_ <= ONE - LAST_NFT_AMOUNT) {\n amountMinted -= totalSupply_;\n }\n\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVault\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow redeemeing for LAST_NFT_AMOUNT instead of ONE\n if (totalSupply() == amountBurned && balanceOf(address(this)) >= amountBurned - ONE + LAST_NFT_AMOUNT) {\n amountBurned = balanceOf(address(this));\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVault\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n}\n" + }, + "contracts/Vault/NftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactory.sol\";\nimport \"./NftVault.sol\";\n\ncontract NftVaultFactory is INftVaultFactory {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n\n mapping(bytes32 => INftVault) public vaultHashMap;\n mapping(INftVault => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactory\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultAt(uint256 _index) external view returns (address) {\n return vaults.at(_index);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactory\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVault(INftVault.CollectionData[] memory _collections) public view returns (INftVault vault) {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactory\n function exists(INftVault.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactory\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactory\n function createVault(INftVault.CollectionData[] memory _collections) external returns (INftVault vault) {\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVault(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists, revert\n if (address(vault) != address(0)) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n\n vault = INftVault(address(new NftVault(name, symbol)));\n vault.init(_collections);\n\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender);\n }\n}\n" + }, + "contracts/Vault/test/NftVault.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultTest is Test {\n NftVaultFactory public nftVaultFactory = new NftVaultFactory();\n\n address user1 = address(1001);\n address user2 = address(1002);\n address owner = address(1003);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else if (configId == 8) {\n collections.push(collectionERC721all);\n collections.push(collectionERC721all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function _deployTestVault(uint256 configId)\n public\n returns (NftVault vault, INftVault.CollectionData[] memory _collections)\n {\n _collections = _getConfig(configId);\n vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n }\n\n function _getAddressesFromCollections(INftVault.CollectionData[] memory _collections)\n public\n view\n returns (address[] memory addresses)\n {\n addresses = new address[](_collections.length);\n\n for (uint256 i = 0; i < collections.length; i++) {\n addresses[i] = _collections[i].addr;\n }\n }\n\n function testInitReverts() public {\n NftVault nftVault;\n\n delete collections;\n vm.expectRevert(INftVault.InvalidCollections.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionAllWithTokenIds);\n vm.expectRevert(INftVault.TokenIdsMustBeEmpty.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC1155allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedMissingTokens);\n vm.expectRevert(INftVault.MissingTokenIds.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedUnsortedTokens);\n vm.expectRevert(INftVault.TokenIdsMustBeSorted.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedDuplicatedTokens);\n vm.expectRevert(INftVault.TokenIdAlreadySet.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n INftVault.CollectionData[] memory _collections = _getConfig(8);\n vm.expectRevert(INftVault.DuplicateCollection.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(nftVault.VAULT_HASH(), bytes32(0));\n assertEq(nftVault.getAllowedCollections(), new address[](0));\n assertEq(nftVault.getAllowedCollectionsLength(), 0);\n assertEq(nftVault.ONE(), 10 ** nftVault.decimals());\n assertEq(nftVault.ONE(), 1e18);\n assertEq(nftVault.name(), \"name\");\n assertEq(nftVault.symbol(), \"symbol\");\n }\n\n function testInitStorage() public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n assertEq(vault.hashVault(_collections), vault.VAULT_HASH());\n assertEq(vault.getAllowedCollections(), _getAddressesFromCollections(_collections));\n assertEq(vault.getAllowedCollectionsLength(), _collections.length);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n INftVault.CollectionData memory c = vault.getAllowedCollectionData(_collections[i].addr);\n assertEq(c.addr, _collections[i].addr);\n assertEq(uint256(c.nftType), uint256(_collections[i].nftType));\n assertEq(c.allowAllIds, _collections[i].allowAllIds);\n assertEq(c.tokenIds, _collections[i].tokenIds);\n\n for (uint256 j = 0; j < _collections[i].tokenIds.length; j++) {\n assertTrue(vault.isTokenAllowed(_collections[i].addr, _collections[i].tokenIds[j]));\n }\n }\n\n vm.expectRevert(INftVault.Initialized.selector);\n vault.init(_collections);\n }\n }\n\n function testValidateNftType() public {\n NftVault nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721all.addr, collectionERC721all.nftType)),\n uint256(collectionERC721all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155all.addr, collectionERC1155all.nftType)),\n uint256(collectionERC1155all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721allowed.addr, collectionERC721allowed.nftType)),\n uint256(collectionERC721allowed.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155allowed.addr, collectionERC1155allowed.nftType)),\n uint256(collectionERC1155allowed.nftType)\n );\n\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault.validateNftType(collectionERC721allWrongNftType.addr, collectionERC721allWrongNftType.nftType);\n\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault.validateNftType(collectionERC1155allWrongNftType.addr, collectionERC1155allWrongNftType.nftType);\n\n // test hypothetical contract that supports ERC721 and ERC1155\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC721).interfaceId)), abi.encode(true)\n );\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC1155).interfaceId)), abi.encode(true)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC721)),\n uint256(INftVault.NftType.ERC721)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC1155)),\n uint256(INftVault.NftType.ERC1155)\n );\n vm.clearMockedCalls();\n }\n\n function testIsTokenAllowed(address collectionAddr, uint256 tokenId) public {\n delete collections;\n INftVault.CollectionData memory config = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n collections.push(config);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(collectionAddr != config.addr);\n\n for (uint256 i = 0; i < erc721tokenIds.length; i++) {\n vm.assume(tokenId != erc721tokenIds[i]);\n }\n\n assertFalse(nftVault.isTokenAllowed(collectionAddr, tokenId));\n }\n\n function testGetSentTokenBalance(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n assertEq(nftVault.getSentTokenBalance(address(erc721), tokenId), 1);\n\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n assertEq(nftVault.getSentTokenBalance(address(erc1155), tokenId), amount);\n }\n\n function testDepositRevert(uint256 _tokenId, uint256 _amount) public {\n uint256 otherTokenId = 56464987645;\n vm.assume(_tokenId != otherTokenId);\n vm.assume(_amount < type(uint256).max);\n\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.expectRevert(INftVault.DisallowedToken.selector);\n nftVault.deposit(user1, address(5566), _tokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(user2, otherTokenId);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, otherTokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n assertEq(nftVault.getSentTokenBalance(collections[0].addr, _tokenId), 1);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, _tokenId, 0);\n\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n assertEq(nftVault.getSentTokenBalance(collections[1].addr, _tokenId), _amount);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[1].addr, _tokenId, _amount + 1);\n }\n\n function testNoDepositGriefing() public {\n delete collections;\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n // User deposited 1 token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n\n // Malicious user manually transferred 1 token to the vault\n vm.startPrank(user2);\n ERC1155Mintable(collections[0].addr).mint(user2, 1, 1);\n ERC1155Mintable(collections[0].addr).safeTransferFrom(user2, address(nftVault), 1, 1, bytes(\"\"));\n vm.stopPrank();\n\n // User deposited 1 more token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n }\n\n function testDepositAllConfigs(uint256 _tokenId, uint256 _amount) public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n for (uint256 i = 0; i < _collections.length; i++) {\n if (!collections[i].allowAllIds) {\n // if not all allowed, take random tokenId that is allowed with fuzzing for randomness\n _tokenId = collections[i].tokenIds[_tokenId % collections[i].tokenIds.length];\n }\n\n if (collections[i].nftType == INftVault.NftType.ERC721) {\n _amount = 1;\n ERC721Mintable(collections[i].addr).mint(address(vault), _tokenId);\n } else {\n ERC1155Mintable(collections[i].addr).mint(address(vault), _tokenId, _amount);\n }\n\n uint256 balancesBefore = vault.balances(collections[i].addr, _tokenId);\n uint256 erc20balanceBefore = vault.balanceOf(user1);\n\n vm.expectEmit(true, true, true, true);\n emit Deposit(user1, collections[i].addr, _tokenId, _amount);\n uint256 amountMinted = vault.deposit(user1, collections[i].addr, _tokenId, _amount);\n\n assertEq(amountMinted / vault.ONE(), _amount);\n assertEq(vault.balanceOf(user1), erc20balanceBefore + amountMinted);\n assertEq(vault.balances(collections[i].addr, _tokenId), balancesBefore + _amount);\n }\n }\n }\n\n function testDepositBatchWithdrawBatch(uint256 _tokenId, uint256[] memory _amounts) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(_amounts.length > 10);\n\n assertEq(nftVault.balanceOf(user1), 0);\n\n address[] memory collectionBatch = new address[](10);\n uint256[] memory tokenIdBatch = new uint256[](10);\n uint256[] memory amountBatch = new uint256[](10);\n uint256 expectedAmountMinted = 0;\n\n for (uint256 i = 0; i < 10; i++) {\n vm.assume(_tokenId < type(uint64).max);\n uint256 tokenId = _tokenId + i;\n\n vm.assume(_amounts[i] > 0);\n vm.assume(_amounts[i] < type(uint64).max);\n uint256 amount = _amounts[i];\n\n if (i % 2 == 0) {\n ERC721Mintable(collections[0].addr).mint(address(nftVault), tokenId);\n collectionBatch[i] = collections[0].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = 1;\n } else {\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), tokenId, amount);\n collectionBatch[i] = collections[1].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = amount;\n }\n\n expectedAmountMinted += amountBatch[i];\n }\n\n uint256 amountMinted = nftVault.depositBatch(user1, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountMinted / nftVault.ONE(), expectedAmountMinted);\n assertEq(nftVault.balanceOf(user1), expectedAmountMinted * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n for (uint256 i = 0; i < 10; i++) {\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), amountBatch[i]);\n }\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted);\n\n uint256 amountBurned = nftVault.withdrawBatch(user2, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountBurned, amountMinted);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(user2), 0);\n\n for (uint256 i = 0; i < 10; i++) {\n if (i % 2 == 0) {\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(tokenIdBatch[i]), user2);\n } else {\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user2, tokenIdBatch[i]), amountBatch[i]);\n }\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), 0);\n }\n }\n\n function testWithdrawRevert(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user1, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 2);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount);\n }\n\n function testWithdraw(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user2, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted721);\n\n uint256 amountBurned = nftVault.withdraw(user1, collections[1].addr, _tokenId, 1);\n\n assertEq(amountBurned, amountMinted721);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), _amount - 1);\n\n uint256 transferAmount = amountMinted1155 - nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[1].addr, _tokenId, _amount - 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), nftVault.ONE());\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n\n transferAmount = nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[0].addr, _tokenId, 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), user2);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n }\n\n function testWithdrawLast(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n address[] memory lastCollections = new address[](2);\n uint256[] memory lastTokenIds = new uint256[](2);\n uint256[] memory lastAmounts = new uint256[](2);\n\n lastCollections[0] = collections[0].addr;\n lastCollections[1] = collections[1].addr;\n\n lastTokenIds[0] = _tokenId;\n lastTokenIds[1] = _tokenId;\n\n lastAmounts[0] = 1;\n lastAmounts[1] = _amount;\n\n uint256 amountMinted = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(amountMinted, (_amount + 1) * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n vm.startPrank(user1);\n nftVault.transfer(owner, nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n nftVault.transfer(address(nftVault), nftVault.balanceOf(user1));\n vm.stopPrank();\n\n nftVault.withdrawBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(_tokenId), user1);\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user1, _tokenId), _amount);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(address(nftVault)), 0);\n assertEq(nftVault.totalSupply(), nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n\n vm.startPrank(user1);\n ERC721Mintable(collections[0].addr).transferFrom(user1, address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).safeTransferFrom(user1, address(nftVault), _tokenId, _amount, bytes(\"\"));\n vm.stopPrank();\n\n uint256 amountMinted2 = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n assertEq(amountMinted2, (_amount + 1) * nftVault.ONE() - nftVault.ONE() + nftVault.LAST_NFT_AMOUNT());\n }\n\n function testSkim(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n assertTrue(nftVault.isTokenAllowed(address(erc721), tokenId));\n assertEq(erc721.balanceOf(user2), 0);\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(erc721), tokenId, 1);\n\n assertTrue(nftVault.isTokenAllowed(address(erc1155), tokenId));\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(erc1155), tokenId, amount);\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n\n ERC721Mintable newErc721 = new ERC721Mintable();\n\n newErc721.mint(address(nftVault), tokenId);\n assertFalse(nftVault.isTokenAllowed(address(newErc721), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(newErc721), tokenId, amount);\n assertEq(newErc721.balanceOf(user2), 1);\n\n ERC1155Mintable newErc1155 = new ERC1155Mintable();\n\n newErc1155.mint(address(nftVault), tokenId, amount);\n assertFalse(nftVault.isTokenAllowed(address(newErc1155), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(newErc1155), tokenId, amount);\n assertEq(newErc1155.balanceOf(user2, tokenId), amount);\n }\n}\n" + }, + "contracts/Vault/test/NftVaultFactory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultFactoryTest is Test {\n address user1 = address(1001);\n address user2 = address(1002);\n address owner1 = address(1003);\n address owner2 = address(1004);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function testVaultAlreadyDeployed() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n INftVault.CollectionData[] memory _collections = _getConfig(0);\n\n vaultFactory.createVault(_collections);\n\n vm.expectRevert(INftVaultFactory.VaultAlreadyDeployed.selector);\n vaultFactory.createVault(_collections);\n }\n\n function testAllGetters() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n address[] memory vaults = new address[](8);\n\n for (uint256 configId = 0; configId < 8; configId++) {\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n\n INftVault vault = vaultFactory.createVault(_collections);\n\n vaults[configId] = address(vault);\n\n address[] memory getAllVaults = new address[](configId + 1);\n for (uint256 i = 0; i < getAllVaults.length; i++) {\n if (vaults[i] != address(0)) {\n getAllVaults[i] = vaults[i];\n }\n }\n\n assertEq(vaultFactory.getAllVaults(), getAllVaults);\n assertEq(vaultFactory.getVaultAt(configId), vaults[configId]);\n assertEq(vaultFactory.getVaultLength(), configId + 1);\n assertEq(vaultFactory.isVault(vaults[configId]), true);\n assertEq(vaultFactory.isVault(address(uint160(vaults[configId]) + 1)), false);\n assertEq(address(vaultFactory.getVault(_collections)), vaults[configId]);\n assertEq(vaultFactory.exists(_collections), true);\n assertEq(address(vaultFactory.vaultHashMap(vaultFactory.hashVault(_collections))), vaults[configId]);\n assertEq(vaultFactory.getVaultAt(vaultFactory.vaultIdMap(INftVault(vaults[configId]))), vaults[configId]);\n }\n }\n}\n" + }, + "contracts/VaultPermissioned/INftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVaultPermissioned.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactoryPermissioned {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVaultPermissioned vault,\n uint256 vaultId,\n INftVaultPermissioned.CollectionData[] collections,\n address creator,\n address owner\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVaultPermissioned vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getVaultAt(uint256 i) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n function isVault(address vault) external view returns (bool);\n\n /// @return all deployed permissioned vaults\n function getAllPermissionedVaults() external view returns (address[] memory);\n\n /// @notice Get permissioned vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getPermissionedVaultAt(uint256 i) external view returns (address);\n\n /// @return length of permissioned vault's EnumerableSet\n function getPermissionedVaultLength() external view returns (uint256);\n\n /// @notice Returns true if permissioned vault has been deployed by factory\n /// @param vault address\n function isPermissionedVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVaultPermissioned.CollectionData[] memory collections)\n external\n view\n returns (INftVaultPermissioned vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVaultPermissioned.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVaultPermissioned.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function returned already deployed vault\n /// @param collections vault's config\n /// @param owner address of owner if vault is permissioned, otherwise address(0) and vault is permissionless\n /// @param isSoulbound if true, Vault is soulbound and its ERC20 token can only be transfered\n /// to `allowedContracts` managed by `owner`\n /// @return vault address of (newly) deployed vault\n function createVault(INftVaultPermissioned.CollectionData[] memory collections, address owner, bool isSoulbound)\n external\n returns (INftVaultPermissioned vault);\n}\n" + }, + "contracts/VaultPermissioned/INftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVaultPermissioned {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted when adding a wallet to deposit/withdraw allow list\n /// @param wallet address that is allowed to deposit/withdraw\n event AllowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when removing a wallet from deposit/withdraw allow list\n /// @param wallet address that is disallowed to deposit/withdraw\n event DisallowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when `contractAddress` is allowed to receive Vault ERC20 token\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n event AllowedContract(address contractAddress);\n\n /// @notice Emitted when `contractAddress` address that is disallowed to receive Vault ERC20 token\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n event DisallowedContract(address contractAddress);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n /// @dev User is not allowed to deposit or withdraw\n error NotAllowed();\n /// @dev Owner is required to manage `allowedContracts` when Vault is deployed as soulbound\n error OwnerRequiredForSoulbound();\n /// @dev Transfer of Vault ERC20 token to disallowed receiver\n error SoulboundTransferDisallowed();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n function UNIV2_MINIMUM_LIQUIDITY() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to `allowedContracts`\n /// @return true if Vault is soulbound, false otherwise\n function isSoulbound() external view returns (bool);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns true if wallet is allowed to deposit/withdraw. Only applicable to permissioned vault.\n /// @dev Call `isPermissioned()` first to make sure vault is permissioned. Otherwise this function is irrelevant.\n /// @param wallet address that is checked\n /// @return true if wallet is allowed, false otherwise. For permissionless vault always returns false.\n function allowedWallets(address wallet) external view returns (bool);\n\n /// @notice Is vault permissioned\n /// @return true if vault has an owner and is permissioned. False otherwise.\n function isPermissioned() external view returns (bool);\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n\n /// @notice Allow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is allowed to deposit/withdraw\n function allowDepositWithdraw(address wallet) external;\n\n /// @notice Disallow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is disallowed to deposit/withdraw\n function disallowDepositWithdraw(address wallet) external;\n\n /// @notice Allow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n function allowVaultTokenTransfersTo(address contractAddress) external;\n\n /// @notice Disallow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n function disallowVaultTokenTransfersTo(address contractAddress) external;\n}\n" + }, + "contracts/VaultPermissioned/NftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Counters.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactoryPermissioned.sol\";\nimport \"./NftVaultPermissioned.sol\";\n\ncontract NftVaultFactoryPermissioned is INftVaultFactoryPermissioned {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n EnumerableSet.AddressSet private permissionedVaults;\n\n mapping(bytes32 => INftVaultPermissioned) public vaultHashMap;\n mapping(INftVaultPermissioned => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultAt(uint256 _i) external view returns (address) {\n return vaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllPermissionedVaults() external view returns (address[] memory) {\n return permissionedVaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultAt(uint256 _i) external view returns (address) {\n return permissionedVaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultLength() external view returns (uint256) {\n return permissionedVaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isPermissionedVault(address _vault) external view returns (bool) {\n return permissionedVaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVault(INftVaultPermissioned.CollectionData[] memory _collections)\n public\n view\n returns (INftVaultPermissioned vault)\n {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function exists(INftVaultPermissioned.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function createVault(INftVaultPermissioned.CollectionData[] memory _collections, address _owner, bool _isSoulbound)\n external\n returns (INftVaultPermissioned vault)\n {\n bool isPermissionless = _owner == address(0) && !_isSoulbound;\n\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVaultPermissioned(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists and is permissionless, revert\n if (address(vault) != address(0) && isPermissionless) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n if (isPermissionless) {\n // permissionless\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n } else {\n // permissioned\n vaultId = permissionedVaults.length();\n name = string.concat(\"Magic Permissioned Vault \", vaultId.toString());\n symbol = string.concat(\"MagicPermissionedVault\", vaultId.toString());\n }\n\n vault = INftVaultPermissioned(address(new NftVaultPermissioned(name, symbol, _owner, _isSoulbound)));\n vault.init(_collections);\n\n if (isPermissionless) {\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n } else {\n permissionedVaults.add(address(vault));\n }\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender, _owner);\n }\n}\n" + }, + "contracts/VaultPermissioned/NftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVaultPermissioned.sol\";\nimport \"./INftVaultFactoryPermissioned.sol\";\n\ncontract NftVaultPermissioned is INftVaultPermissioned, ERC20, ERC721Holder, ERC1155Holder, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n uint256 public constant UNIV2_MINIMUM_LIQUIDITY = 1e3;\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to\n /// EOA, vault itself and `allowedContracts`\n bool public immutable isSoulbound;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @notice deposit/withdraw allow list. Maps wallet address to bool, if true, wallet is allowed to deposit/withdraw\n mapping(address => bool) public allowedWallets;\n\n /// @notice Vault ERC20 receive allow list. Maps contract address to bool, if true, contract is allowed to receive\n /// Vault ERC20 token.\n mapping(address => bool) public allowedContracts;\n\n modifier onlyAllowed() {\n if (isPermissioned() && !allowedWallets[msg.sender]) {\n revert NotAllowed();\n }\n\n _;\n }\n\n /// @dev if _owner == address(0), NftVault is deployed as permissionless\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n /// @param _owner should be address(0) for permissionless vaults. Otherwise, address of the owner.\n /// @param _isSoulbound if true, Vault is soulbound, false otherwise\n constructor(string memory _name, string memory _symbol, address _owner, bool _isSoulbound) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n\n isSoulbound = _isSoulbound;\n _transferOwnership(_owner);\n\n if (_isSoulbound && _owner == address(0)) revert OwnerRequiredForSoulbound();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n allowedCollections.set(collection.addr, nftType);\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n\n emit CollectionAllowed(collection);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isPermissioned() public view returns (bool) {\n return owner() != address(0);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVaultPermissioned\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow being UNIV2_MINIMUM_LIQUIDITY shy\n if (totalSupply() == amountBurned && balanceOf(address(this)) == amountBurned - UNIV2_MINIMUM_LIQUIDITY) {\n amountBurned -= UNIV2_MINIMUM_LIQUIDITY;\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n\n function _beforeTokenTransfer(address, /*from*/ address to, uint256 /*amount*/ ) internal view override {\n /// @dev Soulbound Vault ERC20 token can be transfered to any EOA, this Vault or `allowedContracts`\n if (isSoulbound && to != address(this) && Address.isContract(to) && !allowedContracts[to]) {\n revert SoulboundTransferDisallowed();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = true;\n\n emit AllowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = false;\n\n emit DisallowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = true;\n\n emit AllowedContract(_contractAddress);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = false;\n\n emit DisallowedContract(_contractAddress);\n }\n}\n" + }, + "forge-std/Base.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {StdStorage} from \"./StdStorage.sol\";\nimport {Vm, VmSafe} from \"./Vm.sol\";\n\nabstract contract CommonBase {\n // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.\n address internal constant VM_ADDRESS = address(uint160(uint256(keccak256(\"hevm cheat code\"))));\n // console.sol and console2.sol work by executing a staticcall to this address.\n address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;\n // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.\n address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256(\"foundry default caller\"))));\n // Address of the test contract, deployed by the DEFAULT_SENDER.\n address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;\n // Deterministic deployment address of the Multicall3 contract.\n address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;\n // The order of the secp256k1 curve.\n uint256 internal constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n\n uint256 internal constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n Vm internal constant vm = Vm(VM_ADDRESS);\n StdStorage internal stdstore;\n}\n\nabstract contract TestBase is CommonBase {}\n\nabstract contract ScriptBase is CommonBase {\n VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);\n}\n" + }, + "forge-std/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\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(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", 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, int256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,int256)\", 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" + }, + "forge-std/console2.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {console as console2} from \"./console.sol\";\n" + }, + "forge-std/interfaces/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\ninterface IERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n" + }, + "forge-std/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\n/// @dev Interface of the ERC20 standard as defined in the EIP.\n/// @dev This includes the optional name, symbol, and decimals metadata.\ninterface IERC20 {\n /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`\n /// is the new allowance.\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /// @notice Returns the amount of tokens in existence.\n function totalSupply() external view returns (uint256);\n\n /// @notice Returns the amount of tokens owned by `account`.\n function balanceOf(address account) external view returns (uint256);\n\n /// @notice Moves `amount` tokens from the caller's account to `to`.\n function transfer(address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the remaining number of tokens that `spender` is allowed\n /// to spend on behalf of `owner`\n function allowance(address owner, address spender) external view returns (uint256);\n\n /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.\n /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n function approve(address spender, uint256 amount) external returns (bool);\n\n /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.\n /// `amount` is then deducted from the caller's allowance.\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the name of the token.\n function name() external view returns (string memory);\n\n /// @notice Returns the symbol of the token.\n function symbol() external view returns (string memory);\n\n /// @notice Returns the decimals places of the token.\n function decimals() external view returns (uint8);\n}\n" + }, + "forge-std/interfaces/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\nimport \"./IERC165.sol\";\n\n/// @title ERC-721 Non-Fungible Token Standard\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.\ninterface IERC721 is IERC165 {\n /// @dev This emits when ownership of any NFT changes by any mechanism.\n /// This event emits when NFTs are created (`from` == 0) and destroyed\n /// (`to` == 0). Exception: during contract creation, any number of NFTs\n /// may be created and assigned without emitting Transfer. At the time of\n /// any transfer, the approved address for that NFT (if any) is reset to none.\n event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);\n\n /// @dev This emits when the approved address for an NFT is changed or\n /// reaffirmed. The zero address indicates there is no approved address.\n /// When a Transfer event emits, this also indicates that the approved\n /// address for that NFT (if any) is reset to none.\n event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);\n\n /// @dev This emits when an operator is enabled or disabled for an owner.\n /// The operator can manage all NFTs of the owner.\n event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n /// @notice Count all NFTs assigned to an owner\n /// @dev NFTs assigned to the zero address are considered invalid, and this\n /// function throws for queries about the zero address.\n /// @param _owner An address for whom to query the balance\n /// @return The number of NFTs owned by `_owner`, possibly zero\n function balanceOf(address _owner) external view returns (uint256);\n\n /// @notice Find the owner of an NFT\n /// @dev NFTs assigned to zero address are considered invalid, and queries\n /// about them do throw.\n /// @param _tokenId The identifier for an NFT\n /// @return The address of the owner of the NFT\n function ownerOf(uint256 _tokenId) external view returns (address);\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT. When transfer is complete, this function\n /// checks if `_to` is a smart contract (code size > 0). If so, it calls\n /// `onERC721Received` on `_to` and throws if the return value is not\n /// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n /// @param data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev This works identically to the other function with an extra data parameter,\n /// except this function just sets data to \"\".\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n /// THEY MAY BE PERMANENTLY LOST\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function transferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Change or reaffirm the approved address for an NFT\n /// @dev The zero address indicates there is no approved address.\n /// Throws unless `msg.sender` is the current NFT owner, or an authorized\n /// operator of the current owner.\n /// @param _approved The new approved NFT controller\n /// @param _tokenId The NFT to approve\n function approve(address _approved, uint256 _tokenId) external payable;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage\n /// all of `msg.sender`'s assets\n /// @dev Emits the ApprovalForAll event. The contract MUST allow\n /// multiple operators per owner.\n /// @param _operator Address to add to the set of authorized operators\n /// @param _approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address _operator, bool _approved) external;\n\n /// @notice Get the approved address for a single NFT\n /// @dev Throws if `_tokenId` is not a valid NFT.\n /// @param _tokenId The NFT to find the approved address for\n /// @return The approved address for this NFT, or the zero address if there is none\n function getApproved(uint256 _tokenId) external view returns (address);\n\n /// @notice Query if an address is an authorized operator for another address\n /// @param _owner The address that owns the NFTs\n /// @param _operator The address that acts on behalf of the owner\n /// @return True if `_operator` is an approved operator for `_owner`, false otherwise\n function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n}\n\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\ninterface IERC721TokenReceiver {\n /// @notice Handle the receipt of an NFT\n /// @dev The ERC721 smart contract calls this function on the recipient\n /// after a `transfer`. This function MAY throw to revert and reject the\n /// transfer. Return of other than the magic value MUST result in the\n /// transaction being reverted.\n /// Note: the contract address is always the message sender.\n /// @param _operator The address which called `safeTransferFrom` function\n /// @param _from The address which previously owned the token\n /// @param _tokenId The NFT identifier which is being transferred\n /// @param _data Additional data with no specified format\n /// @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n /// unless throwing\n function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)\n external\n returns (bytes4);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.\ninterface IERC721Metadata is IERC721 {\n /// @notice A descriptive name for a collection of NFTs in this contract\n function name() external view returns (string memory _name);\n\n /// @notice An abbreviated name for NFTs in this contract\n function symbol() external view returns (string memory _symbol);\n\n /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\n /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC\n /// 3986. The URI may point to a JSON file that conforms to the \"ERC721\n /// Metadata JSON Schema\".\n function tokenURI(uint256 _tokenId) external view returns (string memory);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x780e9d63.\ninterface IERC721Enumerable is IERC721 {\n /// @notice Count NFTs tracked by this contract\n /// @return A count of valid NFTs tracked by this contract, where each one of\n /// them has an assigned and queryable owner not equal to the zero address\n function totalSupply() external view returns (uint256);\n\n /// @notice Enumerate valid NFTs\n /// @dev Throws if `_index` >= `totalSupply()`.\n /// @param _index A counter less than `totalSupply()`\n /// @return The token identifier for the `_index`th NFT,\n /// (sort order not specified)\n function tokenByIndex(uint256 _index) external view returns (uint256);\n\n /// @notice Enumerate NFTs assigned to an owner\n /// @dev Throws if `_index` >= `balanceOf(_owner)` or if\n /// `_owner` is the zero address, representing invalid NFTs.\n /// @param _owner An address where we are interested in NFTs owned by them\n /// @param _index A counter less than `balanceOf(_owner)`\n /// @return The token identifier for the `_index`th NFT assigned to `_owner`,\n /// (sort order not specified)\n function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);\n}\n" + }, + "forge-std/interfaces/IMulticall3.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\ninterface IMulticall3 {\n struct Call {\n address target;\n bytes callData;\n }\n\n struct Call3 {\n address target;\n bool allowFailure;\n bytes callData;\n }\n\n struct Call3Value {\n address target;\n bool allowFailure;\n uint256 value;\n bytes callData;\n }\n\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes[] memory returnData);\n\n function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);\n\n function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);\n\n function blockAndAggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n\n function getBasefee() external view returns (uint256 basefee);\n\n function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);\n\n function getBlockNumber() external view returns (uint256 blockNumber);\n\n function getChainId() external view returns (uint256 chainid);\n\n function getCurrentBlockCoinbase() external view returns (address coinbase);\n\n function getCurrentBlockDifficulty() external view returns (uint256 difficulty);\n\n function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);\n\n function getCurrentBlockTimestamp() external view returns (uint256 timestamp);\n\n function getEthBalance(address addr) external view returns (uint256 balance);\n\n function getLastBlockHash() external view returns (bytes32 blockHash);\n\n function tryAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (Result[] memory returnData);\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n}\n" + }, + "forge-std/mocks/MockERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC20} from \"../interfaces/IERC20.sol\";\n\n/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol\ncontract MockERC20 is IERC20 {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n uint8 internal _decimals;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function decimals() external view override returns (uint8) {\n return _decimals;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal _totalSupply;\n\n mapping(address => uint256) internal _balanceOf;\n\n mapping(address => mapping(address => uint256)) internal _allowance;\n\n function totalSupply() external view override returns (uint256) {\n return _totalSupply;\n }\n\n function balanceOf(address owner) external view override returns (uint256) {\n return _balanceOf[owner];\n }\n\n function allowance(address owner, address spender) external view override returns (uint256) {\n return _allowance[owner][spender];\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal INITIAL_CHAIN_ID;\n\n bytes32 internal INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_, uint8 decimals_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n _decimals = decimals_;\n\n INITIAL_CHAIN_ID = _pureChainId();\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount);\n\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n public\n virtual\n {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n _allowance[recoveredAddress][spender] = value;\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(_name)),\n keccak256(\"1\"),\n _pureChainId(),\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n _totalSupply = _add(_totalSupply, amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _totalSupply = _sub(_totalSupply, amount);\n\n emit Transfer(from, address(0), amount);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MATH LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"ERC20: addition overflow\");\n return c;\n }\n\n function _sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(a >= b, \"ERC20: subtraction underflow\");\n return a - b;\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n" + }, + "forge-std/mocks/MockERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC721Metadata, IERC721TokenReceiver} from \"../interfaces/IERC721.sol\";\n\n/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol\ncontract MockERC721 is IERC721Metadata {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE/LOGIC\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function tokenURI(uint256 id) public view virtual override returns (string memory) {}\n\n /*//////////////////////////////////////////////////////////////\n ERC721 BALANCE/OWNER STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _ownerOf;\n\n mapping(address => uint256) internal _balanceOf;\n\n function ownerOf(uint256 id) public view virtual override returns (address owner) {\n require((owner = _ownerOf[id]) != address(0), \"NOT_MINTED\");\n }\n\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ZERO_ADDRESS\");\n\n return _balanceOf[owner];\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 APPROVAL STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _getApproved;\n\n mapping(address => mapping(address => bool)) internal _isApprovedForAll;\n\n function getApproved(uint256 id) public view virtual override returns (address) {\n return _getApproved[id];\n }\n\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _isApprovedForAll[owner][operator];\n }\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 id) public payable virtual override {\n address owner = _ownerOf[id];\n\n require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], \"NOT_AUTHORIZED\");\n\n _getApproved[id] = spender;\n\n emit Approval(owner, spender, id);\n }\n\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _isApprovedForAll[msg.sender][operator] = approved;\n\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function transferFrom(address from, address to, uint256 id) public payable virtual override {\n require(from == _ownerOf[id], \"WRONG_FROM\");\n\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(\n msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id],\n \"NOT_AUTHORIZED\"\n );\n\n // Underflow of the sender's balance is impossible because we check for\n // ownership above and the recipient's balance can't realistically overflow.\n _balanceOf[from]--;\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n delete _getApproved[id];\n\n emit Transfer(from, to, id);\n }\n\n function safeTransferFrom(address from, address to, uint256 id) public payable virtual override {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function safeTransferFrom(address from, address to, uint256 id, bytes memory data)\n public\n payable\n virtual\n override\n {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC165 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721\n || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 id) internal virtual {\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(_ownerOf[id] == address(0), \"ALREADY_MINTED\");\n\n // Counter overflow is incredibly unrealistic.\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n emit Transfer(address(0), to, id);\n }\n\n function _burn(uint256 id) internal virtual {\n address owner = _ownerOf[id];\n\n require(owner != address(0), \"NOT_MINTED\");\n\n _balanceOf[owner]--;\n\n delete _ownerOf[id];\n\n delete _getApproved[id];\n\n emit Transfer(owner, address(0), id);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MINT LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _safeMint(address to, uint256 id) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function _safeMint(address to, uint256 id, bytes memory data) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n function _isContract(address _addr) private view returns (bool) {\n uint256 codeLength;\n\n // Assembly required for versions < 0.8.0 to check extcodesize.\n assembly {\n codeLength := extcodesize(_addr)\n }\n\n return codeLength > 0;\n }\n}\n" + }, + "forge-std/safeconsole.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\n/// @author philogy \n/// @dev Code generated automatically by script.\nlibrary safeconsole {\n uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;\n\n // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)\n // for the view-to-pure log trick.\n function _sendLogPayload(uint256 offset, uint256 size) private pure {\n function(uint256, uint256) internal view fnIn = _sendLogPayloadView;\n function(uint256, uint256) internal pure pureSendLogPayload;\n /// @solidity memory-safe-assembly\n assembly {\n pureSendLogPayload := fnIn\n }\n pureSendLogPayload(offset, size);\n }\n\n function _sendLogPayloadView(uint256 offset, uint256 size) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))\n }\n }\n\n function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {\n function(uint256, uint256, uint256) internal view fnIn = _memcopyView;\n function(uint256, uint256, uint256) internal pure pureMemcopy;\n /// @solidity memory-safe-assembly\n assembly {\n pureMemcopy := fnIn\n }\n pureMemcopy(fromOffset, toOffset, length);\n }\n\n function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))\n }\n }\n\n function logMemory(uint256 offset, uint256 length) internal pure {\n if (offset >= 0x60) {\n // Sufficient memory before slice to prepare call header.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(sub(offset, 0x60))\n m1 := mload(sub(offset, 0x40))\n m2 := mload(sub(offset, 0x20))\n // Selector of `log(bytes)`.\n mstore(sub(offset, 0x60), 0x0be77f56)\n mstore(sub(offset, 0x40), 0x20)\n mstore(sub(offset, 0x20), length)\n }\n _sendLogPayload(offset - 0x44, length + 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(sub(offset, 0x60), m0)\n mstore(sub(offset, 0x40), m1)\n mstore(sub(offset, 0x20), m2)\n }\n } else {\n // Insufficient space, so copy slice forward, add header and reverse.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n uint256 endOffset = offset + length;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(add(endOffset, 0x00))\n m1 := mload(add(endOffset, 0x20))\n m2 := mload(add(endOffset, 0x40))\n }\n _memcopy(offset, offset + 0x60, length);\n /// @solidity memory-safe-assembly\n assembly {\n // Selector of `log(bytes)`.\n mstore(add(offset, 0x00), 0x0be77f56)\n mstore(add(offset, 0x20), 0x20)\n mstore(add(offset, 0x40), length)\n }\n _sendLogPayload(offset + 0x1c, length + 0x44);\n _memcopy(offset + 0x60, offset, length);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(endOffset, 0x00), m0)\n mstore(add(endOffset, 0x20), m1)\n mstore(add(endOffset, 0x40), m2)\n }\n }\n }\n\n function log(address p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(address)`.\n mstore(0x00, 0x2c2ecbc2)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bool p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(bool)`.\n mstore(0x00, 0x32458eed)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(uint256 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(uint256)`.\n mstore(0x00, 0xf82c50f1)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bytes32 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(string)`.\n mstore(0x00, 0x41304fac)\n mstore(0x20, 0x20)\n writeString(0x40, p0)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,address)`.\n mstore(0x00, 0xdaf0d4aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,bool)`.\n mstore(0x00, 0x75b605d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,uint256)`.\n mstore(0x00, 0x8309e8a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,string)`.\n mstore(0x00, 0x759f86bb)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,address)`.\n mstore(0x00, 0x853c4849)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,bool)`.\n mstore(0x00, 0x2a110e83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,uint256)`.\n mstore(0x00, 0x399174d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,string)`.\n mstore(0x00, 0x8feac525)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,address)`.\n mstore(0x00, 0x69276c86)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,bool)`.\n mstore(0x00, 0x1c9d7eb3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,uint256)`.\n mstore(0x00, 0xf666715a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,string)`.\n mstore(0x00, 0x643fd0df)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,address)`.\n mstore(0x00, 0x319af333)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,bool)`.\n mstore(0x00, 0xc3b55635)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,uint256)`.\n mstore(0x00, 0xb60e72cc)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,string)`.\n mstore(0x00, 0x4b5c4277)\n mstore(0x20, 0x40)\n mstore(0x40, 0x80)\n writeString(0x60, p0)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,address)`.\n mstore(0x00, 0x018c84c2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,bool)`.\n mstore(0x00, 0xf2a66286)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,uint256)`.\n mstore(0x00, 0x17fe6185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,address,string)`.\n mstore(0x00, 0x007150be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,address)`.\n mstore(0x00, 0xf11699ed)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,bool)`.\n mstore(0x00, 0xeb830c92)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,uint256)`.\n mstore(0x00, 0x9c4f99fb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,bool,string)`.\n mstore(0x00, 0x212255cc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,address)`.\n mstore(0x00, 0x7bc0d848)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,bool)`.\n mstore(0x00, 0x678209a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,uint256)`.\n mstore(0x00, 0xb69bcaf6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,uint256,string)`.\n mstore(0x00, 0xa1f2e8aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,address)`.\n mstore(0x00, 0xf08744e8)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,bool)`.\n mstore(0x00, 0xcf020fb1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,uint256)`.\n mstore(0x00, 0x67dd6ff1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(address,string,string)`.\n mstore(0x00, 0xfb772265)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,address)`.\n mstore(0x00, 0xd2763667)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,bool)`.\n mstore(0x00, 0x18c9c746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,uint256)`.\n mstore(0x00, 0x5f7b9afb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,address,string)`.\n mstore(0x00, 0xde9a9270)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,address)`.\n mstore(0x00, 0x1078f68d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,bool)`.\n mstore(0x00, 0x50709698)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,uint256)`.\n mstore(0x00, 0x12f21602)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,bool,string)`.\n mstore(0x00, 0x2555fa46)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,address)`.\n mstore(0x00, 0x088ef9d2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,bool)`.\n mstore(0x00, 0xe8defba9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,uint256)`.\n mstore(0x00, 0x37103367)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,uint256,string)`.\n mstore(0x00, 0xc3fc3970)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,address)`.\n mstore(0x00, 0x9591b953)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,bool)`.\n mstore(0x00, 0xdbb4c247)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,uint256)`.\n mstore(0x00, 0x1093ee11)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(bool,string,string)`.\n mstore(0x00, 0xb076847f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,address)`.\n mstore(0x00, 0xbcfd9be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,bool)`.\n mstore(0x00, 0x9b6ec042)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,uint256)`.\n mstore(0x00, 0x5a9b5ed5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,address,string)`.\n mstore(0x00, 0x63cb41f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,address)`.\n mstore(0x00, 0x35085f7b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,bool)`.\n mstore(0x00, 0x20718650)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,uint256)`.\n mstore(0x00, 0x20098014)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,bool,string)`.\n mstore(0x00, 0x85775021)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,address)`.\n mstore(0x00, 0x5c96b331)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,bool)`.\n mstore(0x00, 0x4766da72)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,uint256)`.\n mstore(0x00, 0xd1ed7a3c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,uint256,string)`.\n mstore(0x00, 0x71d04af2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,address)`.\n mstore(0x00, 0x7afac959)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,bool)`.\n mstore(0x00, 0x4ceda75a)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,uint256)`.\n mstore(0x00, 0x37aa7d4c)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(uint256,string,string)`.\n mstore(0x00, 0xb115611f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,address)`.\n mstore(0x00, 0xfcec75e0)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,bool)`.\n mstore(0x00, 0xc91d5ed4)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,uint256)`.\n mstore(0x00, 0x0d26b925)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,address,string)`.\n mstore(0x00, 0xe0e9ad4f)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,address)`.\n mstore(0x00, 0x932bbb38)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,bool)`.\n mstore(0x00, 0x850b7ad6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,uint256)`.\n mstore(0x00, 0xc95958d6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,bool,string)`.\n mstore(0x00, 0xe298f47d)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,address)`.\n mstore(0x00, 0x1c7ec448)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,bool)`.\n mstore(0x00, 0xca7733b1)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,uint256)`.\n mstore(0x00, 0xca47c4eb)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,uint256,string)`.\n mstore(0x00, 0x5970e089)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,address)`.\n mstore(0x00, 0x95ed0195)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,bool)`.\n mstore(0x00, 0xb0e0f9b5)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,uint256)`.\n mstore(0x00, 0x5821efa1)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n // Selector of `log(string,string,string)`.\n mstore(0x00, 0x2ced7cef)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, 0xe0)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n writeString(0x100, p2)\n }\n _sendLogPayload(0x1c, 0x124);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n }\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,address)`.\n mstore(0x00, 0x665bf134)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,bool)`.\n mstore(0x00, 0x0e378994)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,uint256)`.\n mstore(0x00, 0x94250d77)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,address,string)`.\n mstore(0x00, 0xf808da20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,address)`.\n mstore(0x00, 0x9f1bc36e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,bool)`.\n mstore(0x00, 0x2cd4134a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,uint256)`.\n mstore(0x00, 0x3971e78c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,bool,string)`.\n mstore(0x00, 0xaa6540c8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,address)`.\n mstore(0x00, 0x8da6def5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,bool)`.\n mstore(0x00, 0x9b4254e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,uint256)`.\n mstore(0x00, 0xbe553481)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,uint256,string)`.\n mstore(0x00, 0xfdb4f990)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,address)`.\n mstore(0x00, 0x8f736d16)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,bool)`.\n mstore(0x00, 0x6f1a594e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,uint256)`.\n mstore(0x00, 0xef1cefe7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,address,string,string)`.\n mstore(0x00, 0x21bdaf25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,address)`.\n mstore(0x00, 0x660375dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,bool)`.\n mstore(0x00, 0xa6f50b0f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,uint256)`.\n mstore(0x00, 0xa75c59de)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,address,string)`.\n mstore(0x00, 0x2dd778e6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,address)`.\n mstore(0x00, 0xcf394485)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,bool)`.\n mstore(0x00, 0xcac43479)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,uint256)`.\n mstore(0x00, 0x8c4e5de6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,bool,string)`.\n mstore(0x00, 0xdfc4a2e8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,address)`.\n mstore(0x00, 0xccf790a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,bool)`.\n mstore(0x00, 0xc4643e20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,uint256)`.\n mstore(0x00, 0x386ff5f4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,uint256,string)`.\n mstore(0x00, 0x0aa6cfad)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,address)`.\n mstore(0x00, 0x19fd4956)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,bool)`.\n mstore(0x00, 0x50ad461d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,uint256)`.\n mstore(0x00, 0x80e6a20b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,bool,string,string)`.\n mstore(0x00, 0x475c5c33)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,address)`.\n mstore(0x00, 0x478d1c62)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,bool)`.\n mstore(0x00, 0xa1bcc9b3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,uint256)`.\n mstore(0x00, 0x100f650e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,address,string)`.\n mstore(0x00, 0x1da986ea)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,address)`.\n mstore(0x00, 0xa31bfdcc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,bool)`.\n mstore(0x00, 0x3bf5e537)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,uint256)`.\n mstore(0x00, 0x22f6b999)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,bool,string)`.\n mstore(0x00, 0xc5ad85f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,address)`.\n mstore(0x00, 0x20e3984d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,bool)`.\n mstore(0x00, 0x66f1bc67)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,uint256)`.\n mstore(0x00, 0x34f0e636)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,uint256,string)`.\n mstore(0x00, 0x4a28c017)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,address)`.\n mstore(0x00, 0x5c430d47)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,bool)`.\n mstore(0x00, 0xcf18105c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,uint256)`.\n mstore(0x00, 0xbf01f891)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,uint256,string,string)`.\n mstore(0x00, 0x88a8c406)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,address)`.\n mstore(0x00, 0x0d36fa20)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,bool)`.\n mstore(0x00, 0x0df12b76)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,uint256)`.\n mstore(0x00, 0x457fe3cf)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,address,string)`.\n mstore(0x00, 0xf7e36245)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,address)`.\n mstore(0x00, 0x205871c2)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,bool)`.\n mstore(0x00, 0x5f1d5c9f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,uint256)`.\n mstore(0x00, 0x515e38b6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,bool,string)`.\n mstore(0x00, 0xbc0b61fe)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,address)`.\n mstore(0x00, 0x63183678)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,bool)`.\n mstore(0x00, 0x0ef7e050)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,uint256)`.\n mstore(0x00, 0x1dc8e1b8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,uint256,string)`.\n mstore(0x00, 0x448830a8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,address)`.\n mstore(0x00, 0xa04e2f87)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,bool)`.\n mstore(0x00, 0x35a5071f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,uint256)`.\n mstore(0x00, 0x159f8927)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(address,string,string,string)`.\n mstore(0x00, 0x5d02c50b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,address)`.\n mstore(0x00, 0x1d14d001)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,bool)`.\n mstore(0x00, 0x46600be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,uint256)`.\n mstore(0x00, 0x0c66d1be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,address,string)`.\n mstore(0x00, 0xd812a167)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,address)`.\n mstore(0x00, 0x1c41a336)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,bool)`.\n mstore(0x00, 0x6a9c478b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,uint256)`.\n mstore(0x00, 0x07831502)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,bool,string)`.\n mstore(0x00, 0x4a66cb34)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,address)`.\n mstore(0x00, 0x136b05dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,bool)`.\n mstore(0x00, 0xd6019f1c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,uint256)`.\n mstore(0x00, 0x7bf181a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,uint256,string)`.\n mstore(0x00, 0x51f09ff8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,address)`.\n mstore(0x00, 0x6f7c603e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,bool)`.\n mstore(0x00, 0xe2bfd60b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,uint256)`.\n mstore(0x00, 0xc21f64c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,address,string,string)`.\n mstore(0x00, 0xa73c1db6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,address)`.\n mstore(0x00, 0xf4880ea4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,bool)`.\n mstore(0x00, 0xc0a302d8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,uint256)`.\n mstore(0x00, 0x4c123d57)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,address,string)`.\n mstore(0x00, 0xa0a47963)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,address)`.\n mstore(0x00, 0x8c329b1a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,bool)`.\n mstore(0x00, 0x3b2a5ce0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,uint256)`.\n mstore(0x00, 0x6d7045c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,bool,string)`.\n mstore(0x00, 0x2ae408d4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,address)`.\n mstore(0x00, 0x54a7a9a0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,bool)`.\n mstore(0x00, 0x619e4d0e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,uint256)`.\n mstore(0x00, 0x0bb00eab)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,uint256,string)`.\n mstore(0x00, 0x7dd4d0e0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,address)`.\n mstore(0x00, 0xf9ad2b89)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,bool)`.\n mstore(0x00, 0xb857163a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,uint256)`.\n mstore(0x00, 0xe3a9ca2f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,bool,string,string)`.\n mstore(0x00, 0x6d1e8751)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,address)`.\n mstore(0x00, 0x26f560a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,bool)`.\n mstore(0x00, 0xb4c314ff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,uint256)`.\n mstore(0x00, 0x1537dc87)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,address,string)`.\n mstore(0x00, 0x1bb3b09a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,address)`.\n mstore(0x00, 0x9acd3616)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,bool)`.\n mstore(0x00, 0xceb5f4d7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,uint256)`.\n mstore(0x00, 0x7f9bbca2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,bool,string)`.\n mstore(0x00, 0x9143dbb1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,address)`.\n mstore(0x00, 0x00dd87b9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,bool)`.\n mstore(0x00, 0xbe984353)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,uint256)`.\n mstore(0x00, 0x374bb4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,uint256,string)`.\n mstore(0x00, 0x8e69fb5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,address)`.\n mstore(0x00, 0xfedd1fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,bool)`.\n mstore(0x00, 0xe5e70b2b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,uint256)`.\n mstore(0x00, 0x6a1199e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,uint256,string,string)`.\n mstore(0x00, 0xf5bc2249)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,address)`.\n mstore(0x00, 0x2b2b18dc)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,bool)`.\n mstore(0x00, 0x6dd434ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,uint256)`.\n mstore(0x00, 0xa5cada94)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,address,string)`.\n mstore(0x00, 0x12d6c788)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,address)`.\n mstore(0x00, 0x538e06ab)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,bool)`.\n mstore(0x00, 0xdc5e935b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,uint256)`.\n mstore(0x00, 0x1606a393)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,bool,string)`.\n mstore(0x00, 0x483d0416)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,address)`.\n mstore(0x00, 0x1596a1ce)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,bool)`.\n mstore(0x00, 0x6b0e5d53)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,uint256)`.\n mstore(0x00, 0x28863fcb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,uint256,string)`.\n mstore(0x00, 0x1ad96de6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,address)`.\n mstore(0x00, 0x97d394d8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,bool)`.\n mstore(0x00, 0x1e4b87e5)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,uint256)`.\n mstore(0x00, 0x7be0c3eb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(bool,string,string,string)`.\n mstore(0x00, 0x1762e32a)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,address)`.\n mstore(0x00, 0x2488b414)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,bool)`.\n mstore(0x00, 0x091ffaf5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,uint256)`.\n mstore(0x00, 0x736efbb6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,address,string)`.\n mstore(0x00, 0x031c6f73)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,address)`.\n mstore(0x00, 0xef72c513)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,bool)`.\n mstore(0x00, 0xe351140f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,uint256)`.\n mstore(0x00, 0x5abd992a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,bool,string)`.\n mstore(0x00, 0x90fb06aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,address)`.\n mstore(0x00, 0x15c127b5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,bool)`.\n mstore(0x00, 0x5f743a7c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,uint256)`.\n mstore(0x00, 0x0c9cd9c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,uint256,string)`.\n mstore(0x00, 0xddb06521)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,address)`.\n mstore(0x00, 0x9cba8fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,bool)`.\n mstore(0x00, 0xcc32ab07)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,uint256)`.\n mstore(0x00, 0x46826b5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,address,string,string)`.\n mstore(0x00, 0x3e128ca3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,address)`.\n mstore(0x00, 0xa1ef4cbb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,bool)`.\n mstore(0x00, 0x454d54a5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,uint256)`.\n mstore(0x00, 0x078287f5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,address,string)`.\n mstore(0x00, 0xade052c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,address)`.\n mstore(0x00, 0x69640b59)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,bool)`.\n mstore(0x00, 0xb6f577a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,uint256)`.\n mstore(0x00, 0x7464ce23)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,bool,string)`.\n mstore(0x00, 0xdddb9561)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,address)`.\n mstore(0x00, 0x88cb6041)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,bool)`.\n mstore(0x00, 0x91a02e2a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,uint256)`.\n mstore(0x00, 0xc6acc7a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,uint256,string)`.\n mstore(0x00, 0xde03e774)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,address)`.\n mstore(0x00, 0xef529018)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,bool)`.\n mstore(0x00, 0xeb928d7f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,uint256)`.\n mstore(0x00, 0x2c1d0746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,bool,string,string)`.\n mstore(0x00, 0x68c8b8bd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,address)`.\n mstore(0x00, 0x56a5d1b1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,bool)`.\n mstore(0x00, 0x15cac476)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,uint256)`.\n mstore(0x00, 0x88f6e4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,address,string)`.\n mstore(0x00, 0x6cde40b8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,address)`.\n mstore(0x00, 0x9a816a83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,bool)`.\n mstore(0x00, 0xab085ae6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,uint256)`.\n mstore(0x00, 0xeb7f6fd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,bool,string)`.\n mstore(0x00, 0xa5b4fc99)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,address)`.\n mstore(0x00, 0xfa8185af)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,bool)`.\n mstore(0x00, 0xc598d185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,uint256)`.\n mstore(0x00, 0x193fb800)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,uint256,string)`.\n mstore(0x00, 0x59cfcbe3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,address)`.\n mstore(0x00, 0x42d21db7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,bool)`.\n mstore(0x00, 0x7af6ab25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,uint256)`.\n mstore(0x00, 0x5da297eb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,uint256,string,string)`.\n mstore(0x00, 0x27d8afd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,address)`.\n mstore(0x00, 0x6168ed61)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,bool)`.\n mstore(0x00, 0x90c30a56)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,uint256)`.\n mstore(0x00, 0xe8d3018d)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,address,string)`.\n mstore(0x00, 0x9c3adfa1)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,address)`.\n mstore(0x00, 0xae2ec581)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,bool)`.\n mstore(0x00, 0xba535d9c)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,uint256)`.\n mstore(0x00, 0xcf009880)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,bool,string)`.\n mstore(0x00, 0xd2d423cd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,address)`.\n mstore(0x00, 0x3b2279b4)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,bool)`.\n mstore(0x00, 0x691a8f74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,uint256)`.\n mstore(0x00, 0x82c25b74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,uint256,string)`.\n mstore(0x00, 0xb7b914ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,address)`.\n mstore(0x00, 0xd583c602)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,bool)`.\n mstore(0x00, 0xb3a6b6bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,uint256)`.\n mstore(0x00, 0xb028c9bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(uint256,string,string,string)`.\n mstore(0x00, 0x21ad0683)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,address)`.\n mstore(0x00, 0xed8f28f6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,bool)`.\n mstore(0x00, 0xb59dbd60)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,uint256)`.\n mstore(0x00, 0x8ef3f399)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,address,string)`.\n mstore(0x00, 0x800a1c67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,address)`.\n mstore(0x00, 0x223603bd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,bool)`.\n mstore(0x00, 0x79884c2b)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,uint256)`.\n mstore(0x00, 0x3e9f866a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,bool,string)`.\n mstore(0x00, 0x0454c079)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,address)`.\n mstore(0x00, 0x63fb8bc5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,bool)`.\n mstore(0x00, 0xfc4845f0)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,uint256)`.\n mstore(0x00, 0xf8f51b1e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,uint256,string)`.\n mstore(0x00, 0x5a477632)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,address)`.\n mstore(0x00, 0xaabc9a31)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,bool)`.\n mstore(0x00, 0x5f15d28c)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,uint256)`.\n mstore(0x00, 0x91d1112e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,address,string,string)`.\n mstore(0x00, 0x245986f2)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,address)`.\n mstore(0x00, 0x33e9dd1d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,bool)`.\n mstore(0x00, 0x958c28c6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,uint256)`.\n mstore(0x00, 0x5d08bb05)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,address,string)`.\n mstore(0x00, 0x2d8e33a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,address)`.\n mstore(0x00, 0x7190a529)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,bool)`.\n mstore(0x00, 0x895af8c5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,uint256)`.\n mstore(0x00, 0x8e3f78a9)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,bool,string)`.\n mstore(0x00, 0x9d22d5dd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,address)`.\n mstore(0x00, 0x935e09bf)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,bool)`.\n mstore(0x00, 0x8af7cf8a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,uint256)`.\n mstore(0x00, 0x64b5bb67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,uint256,string)`.\n mstore(0x00, 0x742d6ee7)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,address)`.\n mstore(0x00, 0xe0625b29)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,bool)`.\n mstore(0x00, 0x3f8a701d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,uint256)`.\n mstore(0x00, 0x24f91465)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,bool,string,string)`.\n mstore(0x00, 0xa826caeb)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,address)`.\n mstore(0x00, 0x5ea2b7ae)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,bool)`.\n mstore(0x00, 0x82112a42)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,uint256)`.\n mstore(0x00, 0x4f04fdc6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,address,string)`.\n mstore(0x00, 0x9ffb2f93)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,address)`.\n mstore(0x00, 0xe0e95b98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,bool)`.\n mstore(0x00, 0x354c36d6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,uint256)`.\n mstore(0x00, 0xe41b6f6f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,bool,string)`.\n mstore(0x00, 0xabf73a98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,address)`.\n mstore(0x00, 0xe21de278)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,bool)`.\n mstore(0x00, 0x7626db92)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,uint256)`.\n mstore(0x00, 0xa7a87853)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,uint256,string)`.\n mstore(0x00, 0x854b3496)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,address)`.\n mstore(0x00, 0x7c4632a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,bool)`.\n mstore(0x00, 0x7d24491d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,uint256)`.\n mstore(0x00, 0xc67ea9d1)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,uint256,string,string)`.\n mstore(0x00, 0x5ab84e1f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,address)`.\n mstore(0x00, 0x439c7bef)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,bool)`.\n mstore(0x00, 0x5ccd4e37)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,uint256)`.\n mstore(0x00, 0x7cc3c607)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,address,string)`.\n mstore(0x00, 0xeb1bff80)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,address)`.\n mstore(0x00, 0xc371c7db)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,bool)`.\n mstore(0x00, 0x40785869)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,uint256)`.\n mstore(0x00, 0xd6aefad2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,bool,string)`.\n mstore(0x00, 0x5e84b0ea)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,address)`.\n mstore(0x00, 0x1023f7b2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,bool)`.\n mstore(0x00, 0xc3a8a654)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,uint256)`.\n mstore(0x00, 0xf45d7d2c)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,uint256,string)`.\n mstore(0x00, 0x5d1a971a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,address)`.\n mstore(0x00, 0x6d572f44)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,bool)`.\n mstore(0x00, 0x2c1754ed)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,uint256)`.\n mstore(0x00, 0x8eafb02b)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n bytes32 m11;\n bytes32 m12;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n m11 := mload(0x160)\n m12 := mload(0x180)\n // Selector of `log(string,string,string,string)`.\n mstore(0x00, 0xde68f20a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, 0x140)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n writeString(0x160, p3)\n }\n _sendLogPayload(0x1c, 0x184);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n mstore(0x160, m11)\n mstore(0x180, m12)\n }\n }\n}\n" + }, + "forge-std/StdAssertions.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdAssertions {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n event log(string);\n event logs(bytes);\n\n event log_address(address);\n event log_bytes32(bytes32);\n event log_int(int256);\n event log_uint(uint256);\n event log_bytes(bytes);\n event log_string(string);\n\n event log_named_address(string key, address val);\n event log_named_bytes32(string key, bytes32 val);\n event log_named_decimal_int(string key, int256 val, uint256 decimals);\n event log_named_decimal_uint(string key, uint256 val, uint256 decimals);\n event log_named_int(string key, int256 val);\n event log_named_uint(string key, uint256 val);\n event log_named_bytes(string key, bytes val);\n event log_named_string(string key, string val);\n\n event log_array(uint256[] val);\n event log_array(int256[] val);\n event log_array(address[] val);\n event log_named_array(string key, uint256[] val);\n event log_named_array(string key, int256[] val);\n event log_named_array(string key, address[] val);\n\n bool private _failed;\n\n function failed() public view returns (bool) {\n if (_failed) {\n return _failed;\n } else {\n return vm.load(address(vm), bytes32(\"failed\")) != bytes32(0);\n }\n }\n\n function fail() internal virtual {\n vm.store(address(vm), bytes32(\"failed\"), bytes32(uint256(1)));\n _failed = true;\n }\n\n function assertTrue(bool data) internal pure virtual {\n vm.assertTrue(data);\n }\n\n function assertTrue(bool data, string memory err) internal pure virtual {\n vm.assertTrue(data, err);\n }\n\n function assertFalse(bool data) internal pure virtual {\n vm.assertFalse(data);\n }\n\n function assertFalse(bool data, string memory err) internal pure virtual {\n vm.assertFalse(data, err);\n }\n\n function assertEq(bool left, bool right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(int256 left, int256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(address left, address right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address left, address right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertEq(string memory left, string memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n // Legacy helper\n function assertEqUint(uint256 left, uint256 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertNotEq(bool left, bool right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(int256 left, int256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(address left, address right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address left, address right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertNotEq(string memory left, string memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertLt(uint256 left, uint256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertLt(int256 left, int256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertGt(uint256 left, uint256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertGt(int256 left, int256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertLe(uint256 left, uint256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertLe(int256 left, int256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertGe(uint256 left, uint256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertGe(int256 left, int256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n // Inherited from DSTest, not used but kept for backwards-compatibility\n function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {\n return keccak256(left) == keccak256(right);\n }\n\n function assertEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {\n assertEqCall(target, callDataA, target, callDataB, true);\n }\n\n function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)\n internal\n virtual\n {\n assertEqCall(targetA, callDataA, targetB, callDataB, true);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)\n internal\n virtual\n {\n assertEqCall(target, callDataA, target, callDataB, strictRevertData);\n }\n\n function assertEqCall(\n address targetA,\n bytes memory callDataA,\n address targetB,\n bytes memory callDataB,\n bool strictRevertData\n ) internal virtual {\n (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);\n (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);\n\n if (successA && successB) {\n assertEq(returnDataA, returnDataB, \"Call return data does not match\");\n }\n\n if (!successA && !successB && strictRevertData) {\n assertEq(returnDataA, returnDataB, \"Call revert data does not match\");\n }\n\n if (!successA && successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call revert data\", returnDataA);\n emit log_named_bytes(\" Right call return data\", returnDataB);\n revert(\"assertion failed\");\n }\n\n if (successA && !successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call return data\", returnDataA);\n emit log_named_bytes(\" Right call revert data\", returnDataB);\n revert(\"assertion failed\");\n }\n }\n}\n" + }, + "forge-std/StdChains.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n/**\n * StdChains provides information about EVM compatible chains that can be used in scripts/tests.\n * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are\n * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of\n * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the\n * alias used in this contract, which can be found as the first argument to the\n * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.\n *\n * There are two main ways to use this contract:\n * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or\n * `setChain(string memory chainAlias, Chain memory chain)`\n * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.\n *\n * The first time either of those are used, chains are initialized with the default set of RPC URLs.\n * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in\n * `defaultRpcUrls`.\n *\n * The `setChain` function is straightforward, and it simply saves off the given chain data.\n *\n * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say\n * we want to retrieve the RPC URL for `mainnet`:\n * - If you have specified data with `setChain`, it will return that.\n * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it\n * is valid (e.g. a URL is specified, or an environment variable is given and exists).\n * - If neither of the above conditions is met, the default data is returned.\n *\n * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.\n */\nabstract contract StdChains {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n bool private stdChainsInitialized;\n\n struct ChainData {\n string name;\n uint256 chainId;\n string rpcUrl;\n }\n\n struct Chain {\n // The chain name.\n string name;\n // The chain's Chain ID.\n uint256 chainId;\n // The chain's alias. (i.e. what gets specified in `foundry.toml`).\n string chainAlias;\n // A default RPC endpoint for this chain.\n // NOTE: This default RPC URL is included for convenience to facilitate quick tests and\n // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy\n // usage as you will be throttled and this is a disservice to others who need this endpoint.\n string rpcUrl;\n }\n\n // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.\n mapping(string => Chain) private chains;\n // Maps from the chain's alias to it's default RPC URL.\n mapping(string => string) private defaultRpcUrls;\n // Maps from a chain ID to it's alias.\n mapping(uint256 => string) private idToAlias;\n\n bool private fallbackToDefaultRpcUrls = true;\n\n // The RPC URL will be fetched from config or defaultRpcUrls if possible.\n function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {\n require(bytes(chainAlias).length != 0, \"StdChains getChain(string): Chain alias cannot be the empty string.\");\n\n initializeStdChains();\n chain = chains[chainAlias];\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(string): Chain with alias \\\"\", chainAlias, \"\\\" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {\n require(chainId != 0, \"StdChains getChain(uint256): Chain ID cannot be 0.\");\n initializeStdChains();\n string memory chainAlias = idToAlias[chainId];\n\n chain = chains[chainAlias];\n\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(uint256): Chain with ID \", vm.toString(chainId), \" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, ChainData memory chain) internal virtual {\n require(\n bytes(chainAlias).length != 0,\n \"StdChains setChain(string,ChainData): Chain alias cannot be the empty string.\"\n );\n\n require(chain.chainId != 0, \"StdChains setChain(string,ChainData): Chain ID cannot be 0.\");\n\n initializeStdChains();\n string memory foundAlias = idToAlias[chain.chainId];\n\n require(\n bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),\n string(\n abi.encodePacked(\n \"StdChains setChain(string,ChainData): Chain ID \",\n vm.toString(chain.chainId),\n \" already used by \\\"\",\n foundAlias,\n \"\\\".\"\n )\n )\n );\n\n uint256 oldChainId = chains[chainAlias].chainId;\n delete idToAlias[oldChainId];\n\n chains[chainAlias] =\n Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});\n idToAlias[chain.chainId] = chainAlias;\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, Chain memory chain) internal virtual {\n setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));\n }\n\n function _toUpper(string memory str) private pure returns (string memory) {\n bytes memory strb = bytes(str);\n bytes memory copy = new bytes(strb.length);\n for (uint256 i = 0; i < strb.length; i++) {\n bytes1 b = strb[i];\n if (b >= 0x61 && b <= 0x7A) {\n copy[i] = bytes1(uint8(b) - 32);\n } else {\n copy[i] = b;\n }\n }\n return string(copy);\n }\n\n // lookup rpcUrl, in descending order of priority:\n // current -> config (foundry.toml) -> environment variable -> default\n function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)\n private\n view\n returns (Chain memory)\n {\n if (bytes(chain.rpcUrl).length == 0) {\n try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {\n chain.rpcUrl = configRpcUrl;\n } catch (bytes memory err) {\n string memory envName = string(abi.encodePacked(_toUpper(chainAlias), \"_RPC_URL\"));\n if (fallbackToDefaultRpcUrls) {\n chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);\n } else {\n chain.rpcUrl = vm.envString(envName);\n }\n // Distinguish 'not found' from 'cannot read'\n // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions\n bytes memory oldNotFoundError =\n abi.encodeWithSignature(\"CheatCodeError\", string(abi.encodePacked(\"invalid rpc url \", chainAlias)));\n bytes memory newNotFoundError = abi.encodeWithSignature(\n \"CheatcodeError(string)\", string(abi.encodePacked(\"invalid rpc url: \", chainAlias))\n );\n bytes32 errHash = keccak256(err);\n if (\n (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))\n || bytes(chain.rpcUrl).length == 0\n ) {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, err), mload(err))\n }\n }\n }\n }\n return chain;\n }\n\n function setFallbackToDefaultRpcUrls(bool useDefault) internal {\n fallbackToDefaultRpcUrls = useDefault;\n }\n\n function initializeStdChains() private {\n if (stdChainsInitialized) return;\n\n stdChainsInitialized = true;\n\n // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`\n setChainWithDefaultRpcUrl(\"anvil\", ChainData(\"Anvil\", 31337, \"http://127.0.0.1:8545\"));\n setChainWithDefaultRpcUrl(\n \"mainnet\", ChainData(\"Mainnet\", 1, \"https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP\")\n );\n setChainWithDefaultRpcUrl(\n \"sepolia\", ChainData(\"Sepolia\", 11155111, \"https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001\")\n );\n setChainWithDefaultRpcUrl(\"holesky\", ChainData(\"Holesky\", 17000, \"https://rpc.holesky.ethpandaops.io\"));\n setChainWithDefaultRpcUrl(\"optimism\", ChainData(\"Optimism\", 10, \"https://mainnet.optimism.io\"));\n setChainWithDefaultRpcUrl(\n \"optimism_sepolia\", ChainData(\"Optimism Sepolia\", 11155420, \"https://sepolia.optimism.io\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_one\", ChainData(\"Arbitrum One\", 42161, \"https://arb1.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\n \"arbitrum_one_sepolia\", ChainData(\"Arbitrum One Sepolia\", 421614, \"https://sepolia-rollup.arbitrum.io/rpc\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_nova\", ChainData(\"Arbitrum Nova\", 42170, \"https://nova.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\"polygon\", ChainData(\"Polygon\", 137, \"https://polygon-rpc.com\"));\n setChainWithDefaultRpcUrl(\n \"polygon_amoy\", ChainData(\"Polygon Amoy\", 80002, \"https://rpc-amoy.polygon.technology\")\n );\n setChainWithDefaultRpcUrl(\"avalanche\", ChainData(\"Avalanche\", 43114, \"https://api.avax.network/ext/bc/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"avalanche_fuji\", ChainData(\"Avalanche Fuji\", 43113, \"https://api.avax-test.network/ext/bc/C/rpc\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain\", ChainData(\"BNB Smart Chain\", 56, \"https://bsc-dataseed1.binance.org\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain_testnet\",\n ChainData(\"BNB Smart Chain Testnet\", 97, \"https://rpc.ankr.com/bsc_testnet_chapel\")\n );\n setChainWithDefaultRpcUrl(\"gnosis_chain\", ChainData(\"Gnosis Chain\", 100, \"https://rpc.gnosischain.com\"));\n setChainWithDefaultRpcUrl(\"moonbeam\", ChainData(\"Moonbeam\", 1284, \"https://rpc.api.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\n \"moonriver\", ChainData(\"Moonriver\", 1285, \"https://rpc.api.moonriver.moonbeam.network\")\n );\n setChainWithDefaultRpcUrl(\"moonbase\", ChainData(\"Moonbase\", 1287, \"https://rpc.testnet.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\"base_sepolia\", ChainData(\"Base Sepolia\", 84532, \"https://sepolia.base.org\"));\n setChainWithDefaultRpcUrl(\"base\", ChainData(\"Base\", 8453, \"https://mainnet.base.org\"));\n setChainWithDefaultRpcUrl(\"blast_sepolia\", ChainData(\"Blast Sepolia\", 168587773, \"https://sepolia.blast.io\"));\n setChainWithDefaultRpcUrl(\"blast\", ChainData(\"Blast\", 81457, \"https://rpc.blast.io\"));\n setChainWithDefaultRpcUrl(\"fantom_opera\", ChainData(\"Fantom Opera\", 250, \"https://rpc.ankr.com/fantom/\"));\n setChainWithDefaultRpcUrl(\n \"fantom_opera_testnet\", ChainData(\"Fantom Opera Testnet\", 4002, \"https://rpc.ankr.com/fantom_testnet/\")\n );\n setChainWithDefaultRpcUrl(\"fraxtal\", ChainData(\"Fraxtal\", 252, \"https://rpc.frax.com\"));\n setChainWithDefaultRpcUrl(\"fraxtal_testnet\", ChainData(\"Fraxtal Testnet\", 2522, \"https://rpc.testnet.frax.com\"));\n setChainWithDefaultRpcUrl(\n \"berachain_bartio_testnet\", ChainData(\"Berachain bArtio Testnet\", 80084, \"https://bartio.rpc.berachain.com\")\n );\n setChainWithDefaultRpcUrl(\"flare\", ChainData(\"Flare\", 14, \"https://flare-api.flare.network/ext/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"flare_coston2\", ChainData(\"Flare Coston2\", 114, \"https://coston2-api.flare.network/ext/C/rpc\")\n );\n }\n\n // set chain info, with priority to chainAlias' rpc url in foundry.toml\n function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {\n string memory rpcUrl = chain.rpcUrl;\n defaultRpcUrls[chainAlias] = rpcUrl;\n chain.rpcUrl = \"\";\n setChain(chainAlias, chain);\n chain.rpcUrl = rpcUrl; // restore argument\n }\n}\n" + }, + "forge-std/StdCheats.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {console2} from \"./console2.sol\";\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdCheatsSafe {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n bool private gasMeteringOff;\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawTx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n // json value name = function\n string functionSig;\n bytes32 hash;\n // json value name = tx\n RawTx1559Detail txDetail;\n // json value name = type\n string opcode;\n }\n\n struct RawTx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n bytes gas;\n bytes nonce;\n address to;\n bytes txType;\n bytes value;\n }\n\n struct Tx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n bytes32 hash;\n Tx1559Detail txDetail;\n string opcode;\n }\n\n struct Tx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n uint256 gas;\n uint256 nonce;\n address to;\n uint256 txType;\n uint256 value;\n }\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct TxLegacy {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n string hash;\n string opcode;\n TxDetailLegacy transaction;\n }\n\n struct TxDetailLegacy {\n AccessList[] accessList;\n uint256 chainId;\n bytes data;\n address from;\n uint256 gas;\n uint256 gasPrice;\n bytes32 hash;\n uint256 nonce;\n bytes1 opcode;\n bytes32 r;\n bytes32 s;\n uint256 txType;\n address to;\n uint8 v;\n uint256 value;\n }\n\n struct AccessList {\n address accessAddress;\n bytes32[] storageKeys;\n }\n\n // Data structures to parse Receipt objects from the broadcast artifact.\n // The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawReceipt {\n bytes32 blockHash;\n bytes blockNumber;\n address contractAddress;\n bytes cumulativeGasUsed;\n bytes effectiveGasPrice;\n address from;\n bytes gasUsed;\n RawReceiptLog[] logs;\n bytes logsBloom;\n bytes status;\n address to;\n bytes32 transactionHash;\n bytes transactionIndex;\n }\n\n struct Receipt {\n bytes32 blockHash;\n uint256 blockNumber;\n address contractAddress;\n uint256 cumulativeGasUsed;\n uint256 effectiveGasPrice;\n address from;\n uint256 gasUsed;\n ReceiptLog[] logs;\n bytes logsBloom;\n uint256 status;\n address to;\n bytes32 transactionHash;\n uint256 transactionIndex;\n }\n\n // Data structures to parse the entire broadcast artifact, assuming the\n // transactions conform to EIP1559.\n\n struct EIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n Receipt[] receipts;\n uint256 timestamp;\n Tx1559[] transactions;\n TxReturn[] txReturns;\n }\n\n struct RawEIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n RawReceipt[] receipts;\n TxReturn[] txReturns;\n uint256 timestamp;\n RawTx1559[] transactions;\n }\n\n struct RawReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n bytes blockNumber;\n bytes data;\n bytes logIndex;\n bool removed;\n bytes32[] topics;\n bytes32 transactionHash;\n bytes transactionIndex;\n bytes transactionLogIndex;\n }\n\n struct ReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n uint256 blockNumber;\n bytes data;\n uint256 logIndex;\n bytes32[] topics;\n uint256 transactionIndex;\n uint256 transactionLogIndex;\n bool removed;\n }\n\n struct TxReturn {\n string internalType;\n string value;\n }\n\n struct Account {\n address addr;\n uint256 key;\n }\n\n enum AddressType {\n Payable,\n NonPayable,\n ZeroAddress,\n Precompile,\n ForgeAddress\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n function assumeNotBlacklisted(address token, address addr) internal view virtual {\n // Nothing to check if `token` is not a contract.\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.\");\n\n bool success;\n bytes memory returnData;\n\n // 4-byte selector for `isBlacklisted(address)`, used by USDC.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n\n // 4-byte selector for `isBlackListed(address)`, used by USDT.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for\n // backwards compatibility, since this name was used in the original PR which already has\n // a release. This function can be removed in a future release once we want a breaking change.\n function assumeNoBlacklisted(address token, address addr) internal view virtual {\n assumeNotBlacklisted(token, addr);\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {\n if (addressType == AddressType.Payable) {\n assumeNotPayable(addr);\n } else if (addressType == AddressType.NonPayable) {\n assumePayable(addr);\n } else if (addressType == AddressType.ZeroAddress) {\n assumeNotZeroAddress(addr);\n } else if (addressType == AddressType.Precompile) {\n assumeNotPrecompile(addr);\n } else if (addressType == AddressType.ForgeAddress) {\n assumeNotForgeAddress(addr);\n }\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3,\n AddressType addressType4\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n assumeAddressIsNot(addr, addressType4);\n }\n\n // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to\n // `addr` and checking the `success` return value.\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used.\n function _isPayable(address addr) private returns (bool) {\n require(\n addr.balance < UINT256_MAX,\n \"StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds\"\n );\n uint256 origBalanceTest = address(this).balance;\n uint256 origBalanceAddr = address(addr).balance;\n\n vm.deal(address(this), 1);\n (bool success,) = payable(addr).call{value: 1}(\"\");\n\n // reset balances\n vm.deal(address(this), origBalanceTest);\n vm.deal(addr, origBalanceAddr);\n\n return success;\n }\n\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used. See the\n // `_isPayable` method for more information.\n function assumePayable(address addr) internal virtual {\n vm.assume(_isPayable(addr));\n }\n\n function assumeNotPayable(address addr) internal virtual {\n vm.assume(!_isPayable(addr));\n }\n\n function assumeNotZeroAddress(address addr) internal pure virtual {\n vm.assume(addr != address(0));\n }\n\n function assumeNotPrecompile(address addr) internal pure virtual {\n assumeNotPrecompile(addr, _pureChainId());\n }\n\n function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {\n // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific\n // address), but the same rationale for excluding them applies so we include those too.\n\n // These are reserved by Ethereum and may be on all EVM-compatible chains.\n vm.assume(addr < address(0x1) || addr > address(0xff));\n\n // forgefmt: disable-start\n if (chainId == 10 || chainId == 420) {\n // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21\n vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));\n } else if (chainId == 42161 || chainId == 421613) {\n // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains\n vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));\n } else if (chainId == 43114 || chainId == 43113) {\n // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59\n vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));\n vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));\n vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));\n }\n // forgefmt: disable-end\n }\n\n function assumeNotForgeAddress(address addr) internal pure virtual {\n // vm, console, and Create2Deployer addresses\n vm.assume(\n addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67\n && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C\n );\n }\n\n function readEIP1559ScriptArtifact(string memory path)\n internal\n view\n virtual\n returns (EIP1559ScriptArtifact memory)\n {\n string memory data = vm.readFile(path);\n bytes memory parsedData = vm.parseJson(data);\n RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));\n EIP1559ScriptArtifact memory artifact;\n artifact.libraries = rawArtifact.libraries;\n artifact.path = rawArtifact.path;\n artifact.timestamp = rawArtifact.timestamp;\n artifact.pending = rawArtifact.pending;\n artifact.txReturns = rawArtifact.txReturns;\n artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);\n artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);\n return artifact;\n }\n\n function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {\n Tx1559[] memory txs = new Tx1559[](rawTxs.length);\n for (uint256 i; i < rawTxs.length; i++) {\n txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);\n }\n return txs;\n }\n\n function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {\n Tx1559 memory transaction;\n transaction.arguments = rawTx.arguments;\n transaction.contractName = rawTx.contractName;\n transaction.functionSig = rawTx.functionSig;\n transaction.hash = rawTx.hash;\n transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);\n transaction.opcode = rawTx.opcode;\n return transaction;\n }\n\n function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)\n internal\n pure\n virtual\n returns (Tx1559Detail memory)\n {\n Tx1559Detail memory txDetail;\n txDetail.data = rawDetail.data;\n txDetail.from = rawDetail.from;\n txDetail.to = rawDetail.to;\n txDetail.nonce = _bytesToUint(rawDetail.nonce);\n txDetail.txType = _bytesToUint(rawDetail.txType);\n txDetail.value = _bytesToUint(rawDetail.value);\n txDetail.gas = _bytesToUint(rawDetail.gas);\n txDetail.accessList = rawDetail.accessList;\n return txDetail;\n }\n\n function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".transactions\");\n RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));\n return rawToConvertedEIPTx1559s(rawTxs);\n }\n\n function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".transactions[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));\n return rawToConvertedEIPTx1559(rawTx);\n }\n\n // Analogous to readTransactions, but for receipts.\n function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".receipts\");\n RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));\n return rawToConvertedReceipts(rawReceipts);\n }\n\n function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".receipts[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));\n return rawToConvertedReceipt(rawReceipt);\n }\n\n function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {\n Receipt[] memory receipts = new Receipt[](rawReceipts.length);\n for (uint256 i; i < rawReceipts.length; i++) {\n receipts[i] = rawToConvertedReceipt(rawReceipts[i]);\n }\n return receipts;\n }\n\n function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {\n Receipt memory receipt;\n receipt.blockHash = rawReceipt.blockHash;\n receipt.to = rawReceipt.to;\n receipt.from = rawReceipt.from;\n receipt.contractAddress = rawReceipt.contractAddress;\n receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);\n receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);\n receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);\n receipt.status = _bytesToUint(rawReceipt.status);\n receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);\n receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);\n receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);\n receipt.logsBloom = rawReceipt.logsBloom;\n receipt.transactionHash = rawReceipt.transactionHash;\n return receipt;\n }\n\n function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)\n internal\n pure\n virtual\n returns (ReceiptLog[] memory)\n {\n ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);\n for (uint256 i; i < rawLogs.length; i++) {\n logs[i].logAddress = rawLogs[i].logAddress;\n logs[i].blockHash = rawLogs[i].blockHash;\n logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);\n logs[i].data = rawLogs[i].data;\n logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);\n logs[i].topics = rawLogs[i].topics;\n logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);\n logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);\n logs[i].removed = rawLogs[i].removed;\n }\n return logs;\n }\n\n // Deploy a contract by fetching the contract bytecode from\n // the artifacts directory\n // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`\n function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes): Deployment failed.\");\n }\n\n function deployCode(string memory what) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string): Deployment failed.\");\n }\n\n /// @dev deploy contract with value on construction\n function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes,uint256): Deployment failed.\");\n }\n\n function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,uint256): Deployment failed.\");\n }\n\n // creates a labeled address and the corresponding private key\n function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {\n privateKey = uint256(keccak256(abi.encodePacked(name)));\n addr = vm.addr(privateKey);\n vm.label(addr, name);\n }\n\n // creates a labeled address\n function makeAddr(string memory name) internal virtual returns (address addr) {\n (addr,) = makeAddrAndKey(name);\n }\n\n // Destroys an account immediately, sending the balance to beneficiary.\n // Destroying means: balance will be zero, code will be empty, and nonce will be 0\n // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce\n // only after tx ends, this will run immediately.\n function destroyAccount(address who, address beneficiary) internal virtual {\n uint256 currBalance = who.balance;\n vm.etch(who, abi.encode());\n vm.deal(who, 0);\n vm.resetNonce(who);\n\n uint256 beneficiaryBalance = beneficiary.balance;\n vm.deal(beneficiary, currBalance + beneficiaryBalance);\n }\n\n // creates a struct containing both a labeled address and the corresponding private key\n function makeAccount(string memory name) internal virtual returns (Account memory account) {\n (account.addr, account.key) = makeAddrAndKey(name);\n }\n\n function deriveRememberKey(string memory mnemonic, uint32 index)\n internal\n virtual\n returns (address who, uint256 privateKey)\n {\n privateKey = vm.deriveKey(mnemonic, index);\n who = vm.rememberKey(privateKey);\n }\n\n function _bytesToUint(bytes memory b) private pure returns (uint256) {\n require(b.length <= 32, \"StdCheats _bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n function isFork() internal view virtual returns (bool status) {\n try vm.activeFork() {\n status = true;\n } catch (bytes memory) {}\n }\n\n modifier skipWhenForking() {\n if (!isFork()) {\n _;\n }\n }\n\n modifier skipWhenNotForking() {\n if (isFork()) {\n _;\n }\n }\n\n modifier noGasMetering() {\n vm.pauseGasMetering();\n // To prevent turning gas monitoring back on with nested functions that use this modifier,\n // we check if gasMetering started in the off position. If it did, we don't want to turn\n // it back on until we exit the top level function that used the modifier\n //\n // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.\n // funcA will have `gasStartedOff` as false, funcB will have it as true,\n // so we only turn metering back on at the end of the funcA\n bool gasStartedOff = gasMeteringOff;\n gasMeteringOff = true;\n\n _;\n\n // if gas metering was on when this modifier was called, turn it back on at the end\n if (!gasStartedOff) {\n gasMeteringOff = false;\n vm.resumeGasMetering();\n }\n }\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n\n// Wrappers around cheatcodes to avoid footguns\nabstract contract StdCheats is StdCheatsSafe {\n using stdStorage for StdStorage;\n\n StdStorage private stdstore;\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n\n // Skip forward or rewind time by the specified number of seconds\n function skip(uint256 time) internal virtual {\n vm.warp(block.timestamp + time);\n }\n\n function rewind(uint256 time) internal virtual {\n vm.warp(block.timestamp - time);\n }\n\n // Setup a prank from an address that has some ether\n function hoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender, origin);\n }\n\n function hoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender, origin);\n }\n\n // Start perpetual prank from an address that has some ether\n function startHoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender);\n }\n\n function startHoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender);\n }\n\n // Start perpetual prank from an address that has some ether\n // tx.origin is set to the origin parameter\n function startHoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender, origin);\n }\n\n function startHoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender, origin);\n }\n\n function changePrank(address msgSender) internal virtual {\n console2_log_StdCheats(\"changePrank is deprecated. Please use vm.startPrank instead.\");\n vm.stopPrank();\n vm.startPrank(msgSender);\n }\n\n function changePrank(address msgSender, address txOrigin) internal virtual {\n vm.stopPrank();\n vm.startPrank(msgSender, txOrigin);\n }\n\n // The same as Vm's `deal`\n // Use the alternative signature for ERC20 tokens\n function deal(address to, uint256 give) internal virtual {\n vm.deal(to, give);\n }\n\n // Set the balance of an account for any ERC20 token\n // Use the alternative signature to update `totalSupply`\n function deal(address token, address to, uint256 give) internal virtual {\n deal(token, to, give, false);\n }\n\n // Set the balance of an account for any ERC1155 token\n // Use the alternative signature to update `totalSupply`\n function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {\n dealERC1155(token, to, id, give, false);\n }\n\n function deal(address token, address to, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0x18160ddd).checked_write(totSup);\n }\n }\n\n function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));\n require(\n totSupData.length != 0,\n \"StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply.\"\n );\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);\n }\n }\n\n function dealERC721(address token, address to, uint256 id) internal virtual {\n // check if token id is already minted and the actual owner.\n (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));\n require(successMinted, \"StdCheats deal(address,address,uint,bool): id not minted.\");\n\n // get owner current balance\n (, bytes memory fromBalData) =\n token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));\n uint256 fromPrevBal = abi.decode(fromBalData, (uint256));\n\n // get new user current balance\n (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 toPrevBal = abi.decode(toBalData, (uint256));\n\n // update balances\n stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);\n\n // update owner\n stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);\n }\n\n function deployCodeTo(string memory what, address where) internal virtual {\n deployCodeTo(what, \"\", 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {\n deployCodeTo(what, args, 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {\n bytes memory creationCode = vm.getCode(what);\n vm.etch(where, abi.encodePacked(creationCode, args));\n (bool success, bytes memory runtimeBytecode) = where.call{value: value}(\"\");\n require(success, \"StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.\");\n vm.etch(where, runtimeBytecode);\n }\n\n // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.\n function console2_log_StdCheats(string memory p0) private view {\n (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature(\"log(string)\", p0));\n status;\n }\n}\n" + }, + "forge-std/StdError.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdError {\n bytes public constant assertionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x01);\n bytes public constant arithmeticError = abi.encodeWithSignature(\"Panic(uint256)\", 0x11);\n bytes public constant divisionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x12);\n bytes public constant enumConversionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x21);\n bytes public constant encodeStorageError = abi.encodeWithSignature(\"Panic(uint256)\", 0x22);\n bytes public constant popError = abi.encodeWithSignature(\"Panic(uint256)\", 0x31);\n bytes public constant indexOOBError = abi.encodeWithSignature(\"Panic(uint256)\", 0x32);\n bytes public constant memOverflowError = abi.encodeWithSignature(\"Panic(uint256)\", 0x41);\n bytes public constant zeroVarError = abi.encodeWithSignature(\"Panic(uint256)\", 0x51);\n}\n" + }, + "forge-std/StdInvariant.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nabstract contract StdInvariant {\n struct FuzzSelector {\n address addr;\n bytes4[] selectors;\n }\n\n struct FuzzArtifactSelector {\n string artifact;\n bytes4[] selectors;\n }\n\n struct FuzzInterface {\n address addr;\n string[] artifacts;\n }\n\n address[] private _excludedContracts;\n address[] private _excludedSenders;\n address[] private _targetedContracts;\n address[] private _targetedSenders;\n\n string[] private _excludedArtifacts;\n string[] private _targetedArtifacts;\n\n FuzzArtifactSelector[] private _targetedArtifactSelectors;\n\n FuzzSelector[] private _excludedSelectors;\n FuzzSelector[] private _targetedSelectors;\n\n FuzzInterface[] private _targetedInterfaces;\n\n // Functions for users:\n // These are intended to be called in tests.\n\n function excludeContract(address newExcludedContract_) internal {\n _excludedContracts.push(newExcludedContract_);\n }\n\n function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {\n _excludedSelectors.push(newExcludedSelector_);\n }\n\n function excludeSender(address newExcludedSender_) internal {\n _excludedSenders.push(newExcludedSender_);\n }\n\n function excludeArtifact(string memory newExcludedArtifact_) internal {\n _excludedArtifacts.push(newExcludedArtifact_);\n }\n\n function targetArtifact(string memory newTargetedArtifact_) internal {\n _targetedArtifacts.push(newTargetedArtifact_);\n }\n\n function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {\n _targetedArtifactSelectors.push(newTargetedArtifactSelector_);\n }\n\n function targetContract(address newTargetedContract_) internal {\n _targetedContracts.push(newTargetedContract_);\n }\n\n function targetSelector(FuzzSelector memory newTargetedSelector_) internal {\n _targetedSelectors.push(newTargetedSelector_);\n }\n\n function targetSender(address newTargetedSender_) internal {\n _targetedSenders.push(newTargetedSender_);\n }\n\n function targetInterface(FuzzInterface memory newTargetedInterface_) internal {\n _targetedInterfaces.push(newTargetedInterface_);\n }\n\n // Functions for forge:\n // These are called by forge to run invariant tests and don't need to be called in tests.\n\n function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {\n excludedArtifacts_ = _excludedArtifacts;\n }\n\n function excludeContracts() public view returns (address[] memory excludedContracts_) {\n excludedContracts_ = _excludedContracts;\n }\n\n function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {\n excludedSelectors_ = _excludedSelectors;\n }\n\n function excludeSenders() public view returns (address[] memory excludedSenders_) {\n excludedSenders_ = _excludedSenders;\n }\n\n function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {\n targetedArtifacts_ = _targetedArtifacts;\n }\n\n function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {\n targetedArtifactSelectors_ = _targetedArtifactSelectors;\n }\n\n function targetContracts() public view returns (address[] memory targetedContracts_) {\n targetedContracts_ = _targetedContracts;\n }\n\n function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {\n targetedSelectors_ = _targetedSelectors;\n }\n\n function targetSenders() public view returns (address[] memory targetedSenders_) {\n targetedSenders_ = _targetedSenders;\n }\n\n function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {\n targetedInterfaces_ = _targetedInterfaces;\n }\n}\n" + }, + "forge-std/StdJson.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing JSON files\n// To parse:\n// ```\n// using stdJson for string;\n// string memory json = vm.readFile(\"\");\n// json.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdJson for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdJson {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory json, string memory key) internal view returns (bool) {\n return vm.keyExistsJson(json, key);\n }\n\n function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJson(json, key);\n }\n\n function readUint(string memory json, string memory key) internal pure returns (uint256) {\n return vm.parseJsonUint(json, key);\n }\n\n function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseJsonUintArray(json, key);\n }\n\n function readInt(string memory json, string memory key) internal pure returns (int256) {\n return vm.parseJsonInt(json, key);\n }\n\n function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {\n return vm.parseJsonIntArray(json, key);\n }\n\n function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {\n return vm.parseJsonBytes32(json, key);\n }\n\n function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseJsonBytes32Array(json, key);\n }\n\n function readString(string memory json, string memory key) internal pure returns (string memory) {\n return vm.parseJsonString(json, key);\n }\n\n function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {\n return vm.parseJsonStringArray(json, key);\n }\n\n function readAddress(string memory json, string memory key) internal pure returns (address) {\n return vm.parseJsonAddress(json, key);\n }\n\n function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {\n return vm.parseJsonAddressArray(json, key);\n }\n\n function readBool(string memory json, string memory key) internal pure returns (bool) {\n return vm.parseJsonBool(json, key);\n }\n\n function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {\n return vm.parseJsonBoolArray(json, key);\n }\n\n function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJsonBytes(json, key);\n }\n\n function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseJsonBytesArray(json, key);\n }\n\n function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(json, key) ? readUint(json, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(json, key) ? readUintArray(json, key) : defaultValue;\n }\n\n function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(json, key) ? readInt(json, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(json, key) ? readIntArray(json, key) : defaultValue;\n }\n\n function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(json, key) ? readBytes32(json, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;\n }\n\n function readStringOr(string memory json, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(json, key) ? readString(json, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(json, key) ? readStringArray(json, key) : defaultValue;\n }\n\n function readAddressOr(string memory json, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(json, key) ? readAddress(json, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;\n }\n\n function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(json, key) ? readBool(json, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;\n }\n\n function readBytesOr(string memory json, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(json, key) ? readBytes(json, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeJson(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeJson(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdMath {\n int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;\n\n function abs(int256 a) internal pure returns (uint256) {\n // Required or it will fail when `a = type(int256).min`\n if (a == INT256_MIN) {\n return 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n }\n\n return uint256(a > 0 ? a : -a);\n }\n\n function delta(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a - b : b - a;\n }\n\n function delta(int256 a, int256 b) internal pure returns (uint256) {\n // a and b are of the same sign\n // this works thanks to two's complement, the left-most bit is the sign bit\n if ((a ^ b) > -1) {\n return delta(abs(a), abs(b));\n }\n\n // a and b are of opposite signs\n return abs(a) + abs(b);\n }\n\n function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n\n return absDelta * 1e18 / b;\n }\n\n function percentDelta(int256 a, int256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n uint256 absB = abs(b);\n\n return absDelta * 1e18 / absB;\n }\n}\n" + }, + "forge-std/StdStorage.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {Vm} from \"./Vm.sol\";\n\nstruct FindData {\n uint256 slot;\n uint256 offsetLeft;\n uint256 offsetRight;\n bool found;\n}\n\nstruct StdStorage {\n mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;\n bytes32[] _keys;\n bytes4 _sig;\n uint256 _depth;\n address _target;\n bytes32 _set;\n bool _enable_packed_slots;\n bytes _calldata;\n}\n\nlibrary stdStorageSafe {\n event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);\n event WARNING_UninitedSlot(address who, uint256 slot);\n\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return bytes4(keccak256(bytes(sigStr)));\n }\n\n function getCallParams(StdStorage storage self) internal view returns (bytes memory) {\n if (self._calldata.length == 0) {\n return flatten(self._keys);\n } else {\n return self._calldata;\n }\n }\n\n // Calls target contract with configured parameters\n function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {\n bytes memory cald = abi.encodePacked(self._sig, getCallParams(self));\n (bool success, bytes memory rdat) = self._target.staticcall(cald);\n bytes32 result = bytesToBytes32(rdat, 32 * self._depth);\n\n return (success, result);\n }\n\n // Tries mutating slot value to determine if the targeted value is stored in it.\n // If current value is 0, then we are setting slot value to type(uint256).max\n // Otherwise, we set it to 0. That way, return value should always be affected.\n function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n (bool success, bytes32 prevReturnValue) = callTarget(self);\n\n bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);\n vm.store(self._target, slot, testVal);\n\n (, bytes32 newReturnValue) = callTarget(self);\n\n vm.store(self._target, slot, prevSlotValue);\n\n return (success && (prevReturnValue != newReturnValue));\n }\n\n // Tries setting one of the bits in slot to 1 until return value changes.\n // Index of resulted bit is an offset packed slot has from left/right side\n function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {\n for (uint256 offset = 0; offset < 256; offset++) {\n uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);\n vm.store(self._target, slot, bytes32(valueToPut));\n\n (bool success, bytes32 data) = callTarget(self);\n\n if (success && (uint256(data) > 0)) {\n return (true, offset);\n }\n }\n return (false, 0);\n }\n\n function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n\n (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);\n (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);\n\n // `findOffset` may mutate slot value, so we are setting it to initial value\n vm.store(self._target, slot, prevSlotValue);\n return (foundLeft && foundRight, offsetLeft, offsetRight);\n }\n\n function find(StdStorage storage self) internal returns (FindData storage) {\n return find(self, true);\n }\n\n /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against\n // slot complexity:\n // if flat, will be bytes32(uint256(uint));\n // if map, will be keccak256(abi.encode(key, uint(slot)));\n // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));\n // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);\n function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = getCallParams(self);\n\n // calldata to test against\n if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n vm.record();\n (, bytes32 callResult) = callTarget(self);\n (bytes32[] memory reads,) = vm.accesses(address(who));\n\n if (reads.length == 0) {\n revert(\"stdStorage find(StdStorage): No storage use detected for target.\");\n } else {\n for (uint256 i = reads.length; --i >= 0;) {\n bytes32 prev = vm.load(who, reads[i]);\n if (prev == bytes32(0)) {\n emit WARNING_UninitedSlot(who, uint256(reads[i]));\n }\n\n if (!checkSlotMutatesCall(self, reads[i])) {\n continue;\n }\n\n (uint256 offsetLeft, uint256 offsetRight) = (0, 0);\n\n if (self._enable_packed_slots) {\n bool found;\n (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);\n if (!found) {\n continue;\n }\n }\n\n // Check that value between found offsets is equal to the current call result\n uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;\n\n if (uint256(callResult) != curVal) {\n continue;\n }\n\n emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =\n FindData(uint256(reads[i]), offsetLeft, offsetRight, true);\n break;\n }\n }\n\n require(\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,\n \"stdStorage find(StdStorage): Slot(s) not found.\"\n );\n\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n self._target = _target;\n return self;\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n self._sig = _sig;\n return self;\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n self._sig = sigs(_sig);\n return self;\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n self._calldata = _calldata;\n return self;\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n self._keys.push(bytes32(uint256(uint160(who))));\n return self;\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n self._keys.push(bytes32(amt));\n return self;\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n self._keys.push(key);\n return self;\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n self._enable_packed_slots = true;\n return self;\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n self._depth = _depth;\n return self;\n }\n\n function read(StdStorage storage self) private returns (bytes memory) {\n FindData storage data = find(self, false);\n uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);\n uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;\n clear(self);\n return abi.encode(value);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return abi.decode(read(self), (bytes32));\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n int256 v = read_int(self);\n if (v == 0) return false;\n if (v == 1) return true;\n revert(\"stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.\");\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return abi.decode(read(self), (address));\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return abi.decode(read(self), (uint256));\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return abi.decode(read(self), (int256));\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n return (uint256(parent_slot), key);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n bool found;\n bytes32 root_slot;\n bytes32 parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n while (found) {\n root_slot = parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));\n }\n return uint256(root_slot);\n }\n\n function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {\n bytes32 out;\n\n uint256 max = b.length > 32 ? 32 : b.length;\n for (uint256 i = 0; i < max; i++) {\n out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);\n }\n return out;\n }\n\n function flatten(bytes32[] memory b) private pure returns (bytes memory) {\n bytes memory result = new bytes(b.length * 32);\n for (uint256 i = 0; i < b.length; i++) {\n bytes32 k = b[i];\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(result, add(32, mul(32, i))), k)\n }\n }\n\n return result;\n }\n\n function clear(StdStorage storage self) internal {\n delete self._target;\n delete self._sig;\n delete self._keys;\n delete self._depth;\n delete self._enable_packed_slots;\n delete self._calldata;\n }\n\n // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`\n // (slotValue & mask) >> offsetRight will be the value of the given packed variable\n function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {\n // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;\n // using assembly because (1 << 256) causes overflow\n assembly {\n mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))\n }\n }\n\n // Returns slot value with updated packed variable.\n function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)\n internal\n pure\n returns (bytes32 newValue)\n {\n return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));\n }\n}\n\nlibrary stdStorage {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return stdStorageSafe.sigs(sigStr);\n }\n\n function find(StdStorage storage self) internal returns (uint256) {\n return find(self, true);\n }\n\n function find(StdStorage storage self, bool _clear) internal returns (uint256) {\n return stdStorageSafe.find(self, _clear).slot;\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n return stdStorageSafe.target(self, _target);\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, who);\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, amt);\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, key);\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n return stdStorageSafe.with_calldata(self, _calldata);\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n return stdStorageSafe.enable_packed_slots(self);\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n return stdStorageSafe.depth(self, _depth);\n }\n\n function clear(StdStorage storage self) internal {\n stdStorageSafe.clear(self);\n }\n\n function checked_write(StdStorage storage self, address who) internal {\n checked_write(self, bytes32(uint256(uint160(who))));\n }\n\n function checked_write(StdStorage storage self, uint256 amt) internal {\n checked_write(self, bytes32(amt));\n }\n\n function checked_write_int(StdStorage storage self, int256 val) internal {\n checked_write(self, bytes32(uint256(val)));\n }\n\n function checked_write(StdStorage storage self, bool write) internal {\n bytes32 t;\n /// @solidity memory-safe-assembly\n assembly {\n t := write\n }\n checked_write(self, t);\n }\n\n function checked_write(StdStorage storage self, bytes32 set) internal {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = stdStorageSafe.getCallParams(self);\n\n if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n find(self, false);\n }\n FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n if ((data.offsetLeft + data.offsetRight) > 0) {\n uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));\n require(\n uint256(set) < maxVal,\n string(\n abi.encodePacked(\n \"stdStorage find(StdStorage): Packed slot. We can't fit value greater than \",\n vm.toString(maxVal)\n )\n )\n );\n }\n bytes32 curVal = vm.load(who, bytes32(data.slot));\n bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);\n\n vm.store(who, bytes32(data.slot), valToSet);\n\n (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);\n\n if (!success || callResult != set) {\n vm.store(who, bytes32(data.slot), curVal);\n revert(\"stdStorage find(StdStorage): Failed to write value.\");\n }\n clear(self);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return stdStorageSafe.read_bytes32(self);\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n return stdStorageSafe.read_bool(self);\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return stdStorageSafe.read_address(self);\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.read_uint(self);\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return stdStorageSafe.read_int(self);\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n return stdStorageSafe.parent(self);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.root(self);\n }\n}\n" + }, + "forge-std/StdStyle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\nlibrary StdStyle {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n string constant RED = \"\\u001b[91m\";\n string constant GREEN = \"\\u001b[92m\";\n string constant YELLOW = \"\\u001b[93m\";\n string constant BLUE = \"\\u001b[94m\";\n string constant MAGENTA = \"\\u001b[95m\";\n string constant CYAN = \"\\u001b[96m\";\n string constant BOLD = \"\\u001b[1m\";\n string constant DIM = \"\\u001b[2m\";\n string constant ITALIC = \"\\u001b[3m\";\n string constant UNDERLINE = \"\\u001b[4m\";\n string constant INVERSE = \"\\u001b[7m\";\n string constant RESET = \"\\u001b[0m\";\n\n function styleConcat(string memory style, string memory self) private pure returns (string memory) {\n return string(abi.encodePacked(style, self, RESET));\n }\n\n function red(string memory self) internal pure returns (string memory) {\n return styleConcat(RED, self);\n }\n\n function red(uint256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(int256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(address self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(bool self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes(bytes memory self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes32(bytes32 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function green(string memory self) internal pure returns (string memory) {\n return styleConcat(GREEN, self);\n }\n\n function green(uint256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(int256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(address self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(bool self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes(bytes memory self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes32(bytes32 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function yellow(string memory self) internal pure returns (string memory) {\n return styleConcat(YELLOW, self);\n }\n\n function yellow(uint256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(int256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(address self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(bool self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes(bytes memory self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes32(bytes32 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function blue(string memory self) internal pure returns (string memory) {\n return styleConcat(BLUE, self);\n }\n\n function blue(uint256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(int256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(address self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(bool self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes(bytes memory self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes32(bytes32 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function magenta(string memory self) internal pure returns (string memory) {\n return styleConcat(MAGENTA, self);\n }\n\n function magenta(uint256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(int256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(address self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(bool self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes(bytes memory self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes32(bytes32 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function cyan(string memory self) internal pure returns (string memory) {\n return styleConcat(CYAN, self);\n }\n\n function cyan(uint256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(int256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(address self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(bool self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes(bytes memory self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes32(bytes32 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function bold(string memory self) internal pure returns (string memory) {\n return styleConcat(BOLD, self);\n }\n\n function bold(uint256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(int256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(address self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(bool self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes(bytes memory self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes32(bytes32 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function dim(string memory self) internal pure returns (string memory) {\n return styleConcat(DIM, self);\n }\n\n function dim(uint256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(int256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(address self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(bool self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes(bytes memory self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes32(bytes32 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function italic(string memory self) internal pure returns (string memory) {\n return styleConcat(ITALIC, self);\n }\n\n function italic(uint256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(int256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(address self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(bool self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes(bytes memory self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes32(bytes32 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function underline(string memory self) internal pure returns (string memory) {\n return styleConcat(UNDERLINE, self);\n }\n\n function underline(uint256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(int256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(address self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(bool self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes(bytes memory self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes32(bytes32 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function inverse(string memory self) internal pure returns (string memory) {\n return styleConcat(INVERSE, self);\n }\n\n function inverse(uint256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(int256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(address self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(bool self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes(bytes memory self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes32(bytes32 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n}\n" + }, + "forge-std/StdToml.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing TOML files\n// To parse:\n// ```\n// using stdToml for string;\n// string memory toml = vm.readFile(\"\");\n// toml.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdToml for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdToml {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory toml, string memory key) internal view returns (bool) {\n return vm.keyExistsToml(toml, key);\n }\n\n function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseToml(toml, key);\n }\n\n function readUint(string memory toml, string memory key) internal pure returns (uint256) {\n return vm.parseTomlUint(toml, key);\n }\n\n function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseTomlUintArray(toml, key);\n }\n\n function readInt(string memory toml, string memory key) internal pure returns (int256) {\n return vm.parseTomlInt(toml, key);\n }\n\n function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {\n return vm.parseTomlIntArray(toml, key);\n }\n\n function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {\n return vm.parseTomlBytes32(toml, key);\n }\n\n function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseTomlBytes32Array(toml, key);\n }\n\n function readString(string memory toml, string memory key) internal pure returns (string memory) {\n return vm.parseTomlString(toml, key);\n }\n\n function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {\n return vm.parseTomlStringArray(toml, key);\n }\n\n function readAddress(string memory toml, string memory key) internal pure returns (address) {\n return vm.parseTomlAddress(toml, key);\n }\n\n function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {\n return vm.parseTomlAddressArray(toml, key);\n }\n\n function readBool(string memory toml, string memory key) internal pure returns (bool) {\n return vm.parseTomlBool(toml, key);\n }\n\n function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {\n return vm.parseTomlBoolArray(toml, key);\n }\n\n function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseTomlBytes(toml, key);\n }\n\n function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseTomlBytesArray(toml, key);\n }\n\n function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(toml, key) ? readUint(toml, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;\n }\n\n function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(toml, key) ? readInt(toml, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;\n }\n\n function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;\n }\n\n function readStringOr(string memory toml, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(toml, key) ? readString(toml, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;\n }\n\n function readAddressOr(string memory toml, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;\n }\n\n function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(toml, key) ? readBool(toml, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;\n }\n\n function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeToml(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeToml(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {IMulticall3} from \"./interfaces/IMulticall3.sol\";\nimport {MockERC20} from \"./mocks/MockERC20.sol\";\nimport {MockERC721} from \"./mocks/MockERC721.sol\";\nimport {VmSafe} from \"./Vm.sol\";\n\nabstract contract StdUtils {\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS\n //////////////////////////////////////////////////////////////////////////*/\n\n IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n uint256 private constant INT256_MIN_ABS =\n 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n uint256 private constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n require(min <= max, \"StdUtils bound(uint256,uint256,uint256): Max is less than min.\");\n // If x is between min and max, return x directly. This is to ensure that dictionary values\n // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188\n if (x >= min && x <= max) return x;\n\n uint256 size = max - min + 1;\n\n // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.\n // This helps ensure coverage of the min/max values.\n if (x <= 3 && size > x) return min + x;\n if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);\n\n // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.\n if (x > max) {\n uint256 diff = x - max;\n uint256 rem = diff % size;\n if (rem == 0) return max;\n result = min + rem - 1;\n } else if (x < min) {\n uint256 diff = min - x;\n uint256 rem = diff % size;\n if (rem == 0) return min;\n result = max - rem + 1;\n }\n }\n\n function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", result);\n }\n\n function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n require(min <= max, \"StdUtils bound(int256,int256,int256): Max is less than min.\");\n\n // Shifting all int256 values to uint256 to use _bound function. The range of two types are:\n // int256 : -(2**255) ~ (2**255 - 1)\n // uint256: 0 ~ (2**256 - 1)\n // So, add 2**255, INT256_MIN_ABS to the integer values.\n //\n // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.\n // So, use `~uint256(x) + 1` instead.\n uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);\n uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);\n uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);\n\n uint256 y = _bound(_x, _min, _max);\n\n // To move it back to int256 value, subtract INT256_MIN_ABS at here.\n result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);\n }\n\n function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", vm.toString(result));\n }\n\n function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {\n result = _bound(privateKey, 1, SECP256K1_ORDER - 1);\n }\n\n function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {\n require(b.length <= 32, \"StdUtils bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce\n /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol)\n function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {\n console2_log_StdUtils(\"computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.\");\n return vm.computeCreateAddress(deployer, nonce);\n }\n\n function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)\n internal\n pure\n virtual\n returns (address)\n {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initcodeHash, deployer);\n }\n\n /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initCodeHash);\n }\n\n /// @dev returns an initialized mock ERC20 contract\n function deployMockERC20(string memory name, string memory symbol, uint8 decimals)\n internal\n returns (MockERC20 mock)\n {\n mock = new MockERC20();\n mock.initialize(name, symbol, decimals);\n }\n\n /// @dev returns an initialized mock ERC721 contract\n function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) {\n mock = new MockERC721();\n mock.initialize(name, symbol);\n }\n\n /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {\n return hashInitCode(creationCode, \"\");\n }\n\n /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n /// @param args the ABI-encoded arguments to the constructor of C\n function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(creationCode, args));\n }\n\n // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.\n function getTokenBalances(address token, address[] memory addresses)\n internal\n virtual\n returns (uint256[] memory balances)\n {\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdUtils getTokenBalances(address,address[]): Token address is not a contract.\");\n\n // ABI encode the aggregate call to Multicall3.\n uint256 length = addresses.length;\n IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);\n for (uint256 i = 0; i < length; ++i) {\n // 0x70a08231 = bytes4(\"balanceOf(address)\"))\n calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});\n }\n\n // Make the aggregate call.\n (, bytes[] memory returnData) = multicall.aggregate(calls);\n\n // ABI decode the return data and return the balances.\n balances = new uint256[](length);\n for (uint256 i = 0; i < length; ++i) {\n balances[i] = abi.decode(returnData[i], (uint256));\n }\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n PRIVATE FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {\n return address(uint160(uint256(bytesValue)));\n }\n\n // This section is used to prevent the compilation of console, which shortens the compilation time when console is\n // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid\n // any breaking changes to function signatures.\n function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)\n internal\n pure\n returns (function(bytes memory) internal pure fnOut)\n {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castLogPayloadViewToPure(_sendLogPayloadView)(payload);\n }\n\n function _sendLogPayloadView(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE2_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function console2_log_StdUtils(string memory p0) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function console2_log_StdUtils(string memory p0, uint256 p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function console2_log_StdUtils(string memory p0, string memory p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n}\n" + }, + "forge-std/Test.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\n// 💬 ABOUT\n// Forge Std's default Test.\n\n// 🧩 MODULES\nimport {console} from \"./console.sol\";\nimport {console2} from \"./console2.sol\";\nimport {safeconsole} from \"./safeconsole.sol\";\nimport {StdAssertions} from \"./StdAssertions.sol\";\nimport {StdChains} from \"./StdChains.sol\";\nimport {StdCheats} from \"./StdCheats.sol\";\nimport {stdError} from \"./StdError.sol\";\nimport {StdInvariant} from \"./StdInvariant.sol\";\nimport {stdJson} from \"./StdJson.sol\";\nimport {stdMath} from \"./StdMath.sol\";\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {StdStyle} from \"./StdStyle.sol\";\nimport {stdToml} from \"./StdToml.sol\";\nimport {StdUtils} from \"./StdUtils.sol\";\nimport {Vm} from \"./Vm.sol\";\n\n// 📦 BOILERPLATE\nimport {TestBase} from \"./Base.sol\";\n\n// ⭐️ TEST\nabstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {\n // Note: IS_TEST() must return true.\n bool public IS_TEST = true;\n}\n" + }, + "forge-std/Vm.sol": { + "content": "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\n/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may\n/// result in Script simulations differing from on-chain execution. It is recommended to only use\n/// these cheats in scripts.\ninterface VmSafe {\n /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.\n enum CallerMode {\n // No caller modification is currently active.\n None,\n // A one time broadcast triggered by a `vm.broadcast()` call is currently active.\n Broadcast,\n // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.\n RecurrentBroadcast,\n // A one time prank triggered by a `vm.prank()` call is currently active.\n Prank,\n // A recurrent prank triggered by a `vm.startPrank()` call is currently active.\n RecurrentPrank\n }\n\n /// The kind of account access that occurred.\n enum AccountAccessKind {\n // The account was called.\n Call,\n // The account was called via delegatecall.\n DelegateCall,\n // The account was called via callcode.\n CallCode,\n // The account was called via staticcall.\n StaticCall,\n // The account was created.\n Create,\n // The account was selfdestructed.\n SelfDestruct,\n // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).\n Resume,\n // The account's balance was read.\n Balance,\n // The account's codesize was read.\n Extcodesize,\n // The account's codehash was read.\n Extcodehash,\n // The account's code was copied.\n Extcodecopy\n }\n\n /// Forge execution contexts.\n enum ForgeContext {\n // Test group execution context (test, coverage or snapshot).\n TestGroup,\n // `forge test` execution context.\n Test,\n // `forge coverage` execution context.\n Coverage,\n // `forge snapshot` execution context.\n Snapshot,\n // Script group execution context (dry run, broadcast or resume).\n ScriptGroup,\n // `forge script` execution context.\n ScriptDryRun,\n // `forge script --broadcast` execution context.\n ScriptBroadcast,\n // `forge script --resume` execution context.\n ScriptResume,\n // Unknown `forge` execution context.\n Unknown\n }\n\n /// An Ethereum log. Returned by `getRecordedLogs`.\n struct Log {\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The address of the log's emitter.\n address emitter;\n }\n\n /// An RPC URL and its alias. Returned by `rpcUrlStructs`.\n struct Rpc {\n // The alias of the RPC URL.\n string key;\n // The RPC URL.\n string url;\n }\n\n /// An RPC log object. Returned by `eth_getLogs`.\n struct EthGetLogs {\n // The address of the log's emitter.\n address emitter;\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The block hash.\n bytes32 blockHash;\n // The block number.\n uint64 blockNumber;\n // The transaction hash.\n bytes32 transactionHash;\n // The transaction index in the block.\n uint64 transactionIndex;\n // The log index.\n uint256 logIndex;\n // Whether the log was removed.\n bool removed;\n }\n\n /// A single entry in a directory listing. Returned by `readDir`.\n struct DirEntry {\n // The error message, if any.\n string errorMessage;\n // The path of the entry.\n string path;\n // The depth of the entry.\n uint64 depth;\n // Whether the entry is a directory.\n bool isDir;\n // Whether the entry is a symlink.\n bool isSymlink;\n }\n\n /// Metadata information about a file.\n /// This structure is returned from the `fsMetadata` function and represents known\n /// metadata about a file such as its permissions, size, modification\n /// times, etc.\n struct FsMetadata {\n // True if this metadata is for a directory.\n bool isDir;\n // True if this metadata is for a symlink.\n bool isSymlink;\n // The size of the file, in bytes, this metadata is for.\n uint256 length;\n // True if this metadata is for a readonly (unwritable) file.\n bool readOnly;\n // The last modification time listed in this metadata.\n uint256 modified;\n // The last access time of this metadata.\n uint256 accessed;\n // The creation time listed in this metadata.\n uint256 created;\n }\n\n /// A wallet with a public and private key.\n struct Wallet {\n // The wallet's address.\n address addr;\n // The wallet's public key `X`.\n uint256 publicKeyX;\n // The wallet's public key `Y`.\n uint256 publicKeyY;\n // The wallet's private key.\n uint256 privateKey;\n }\n\n /// The result of a `tryFfi` call.\n struct FfiResult {\n // The exit code of the call.\n int32 exitCode;\n // The optionally hex-decoded `stdout` data.\n bytes stdout;\n // The `stderr` data.\n bytes stderr;\n }\n\n /// Information on the chain and fork.\n struct ChainInfo {\n // The fork identifier. Set to zero if no fork is active.\n uint256 forkId;\n // The chain ID of the current fork.\n uint256 chainId;\n }\n\n /// The result of a `stopAndReturnStateDiff` call.\n struct AccountAccess {\n // The chain and fork the access occurred.\n ChainInfo chainInfo;\n // The kind of account access that determines what the account is.\n // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.\n // If kind is Create, then the account is the newly created account.\n // If kind is SelfDestruct, then the account is the selfdestruct recipient.\n // If kind is a Resume, then account represents a account context that has resumed.\n AccountAccessKind kind;\n // The account that was accessed.\n // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.\n address account;\n // What accessed the account.\n address accessor;\n // If the account was initialized or empty prior to the access.\n // An account is considered initialized if it has code, a\n // non-zero nonce, or a non-zero balance.\n bool initialized;\n // The previous balance of the accessed account.\n uint256 oldBalance;\n // The potential new balance of the accessed account.\n // That is, all balance changes are recorded here, even if reverts occurred.\n uint256 newBalance;\n // Code of the account deployed by CREATE.\n bytes deployedCode;\n // Value passed along with the account access\n uint256 value;\n // Input data provided to the CREATE or CALL\n bytes data;\n // If this access reverted in either the current or parent context.\n bool reverted;\n // An ordered list of storage accesses made during an account access operation.\n StorageAccess[] storageAccesses;\n // Call depth traversed during the recording of state differences\n uint64 depth;\n }\n\n /// The storage accessed during an `AccountAccess`.\n struct StorageAccess {\n // The account whose storage was accessed.\n address account;\n // The slot that was accessed.\n bytes32 slot;\n // If the access was a write.\n bool isWrite;\n // The previous value of the slot.\n bytes32 previousValue;\n // The new value of the slot.\n bytes32 newValue;\n // If the access was reverted.\n bool reverted;\n }\n\n /// Gas used. Returned by `lastCallGas`.\n struct Gas {\n // The gas limit of the call.\n uint64 gasLimit;\n // The total gas used.\n uint64 gasTotalUsed;\n // DEPRECATED: The amount of gas used for memory expansion. Ref: \n uint64 gasMemoryUsed;\n // The amount of gas refunded.\n int64 gasRefunded;\n // The amount of gas remaining.\n uint64 gasRemaining;\n }\n\n // ======== Crypto ========\n\n /// Derives a private key from the name, labels the account with that name, and returns the wallet.\n function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key and returns the wallet.\n function createWallet(uint256 privateKey) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.\n function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derives secp256r1 public key from the provided `privateKey`.\n function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);\n\n /// Adds a private key to the local forge wallet and returns the address.\n function rememberKey(uint256 privateKey) external returns (address keyAddr);\n\n /// Signs data with a `Wallet`.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// Raises error if none of the signers passed into the script have provided address.\n function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256r1 curve.\n function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);\n\n /// Signs data with a `Wallet`.\n function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Raises error if none of the signers passed into the script have provided address.\n function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n // ======== Environment ========\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and returns true if it exists, else returns false.\n function envExists(string calldata name) external view returns (bool result);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bool defaultValue) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)\n external\n view\n returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)\n external\n view\n returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)\n external\n view\n returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)\n external\n view\n returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, address defaultValue) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)\n external\n view\n returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)\n external\n view\n returns (uint256[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)\n external\n view\n returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name, string calldata delim) external view returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);\n\n /// Returns true if `forge` command was executed in given context.\n function isContext(ForgeContext context) external view returns (bool result);\n\n /// Sets environment variables.\n function setEnv(string calldata name, string calldata value) external;\n\n // ======== EVM ========\n\n /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.\n function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);\n\n /// Gets the address for a given private key.\n function addr(uint256 privateKey) external pure returns (address keyAddr);\n\n /// Gets all the logs according to specified filter.\n function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)\n external\n returns (EthGetLogs[] memory logs);\n\n /// Gets the current `block.blobbasefee`.\n /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlobBaseFee() external view returns (uint256 blobBaseFee);\n\n /// Gets the current `block.number`.\n /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockNumber() external view returns (uint256 height);\n\n /// Gets the current `block.timestamp`.\n /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockTimestamp() external view returns (uint256 timestamp);\n\n /// Gets the map key and parent of a mapping at a given slot, for a given address.\n function getMappingKeyAndParentOf(address target, bytes32 elementSlot)\n external\n returns (bool found, bytes32 key, bytes32 parent);\n\n /// Gets the number of elements in the mapping at the given slot, for a given address.\n function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length);\n\n /// Gets the elements at index idx of the mapping at the given slot, for a given address. The\n /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).\n function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value);\n\n /// Gets the nonce of an account.\n function getNonce(address account) external view returns (uint64 nonce);\n\n /// Get the nonce of a `Wallet`.\n function getNonce(Wallet calldata wallet) external returns (uint64 nonce);\n\n /// Gets all the recorded logs.\n function getRecordedLogs() external returns (Log[] memory logs);\n\n /// Gets the gas used in the last call.\n function lastCallGas() external view returns (Gas memory gas);\n\n /// Loads a storage slot from an address.\n function load(address target, bytes32 slot) external view returns (bytes32 data);\n\n /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.\n function pauseGasMetering() external;\n\n /// Records all storage reads and writes.\n function record() external;\n\n /// Record all the transaction logs.\n function recordLogs() external;\n\n /// Reset gas metering (i.e. gas usage is set to gas limit).\n function resetGasMetering() external;\n\n /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.\n function resumeGasMetering() external;\n\n /// Performs an Ethereum JSON-RPC request to the current fork URL.\n function rpc(string calldata method, string calldata params) external returns (bytes memory data);\n\n /// Performs an Ethereum JSON-RPC request to the given endpoint.\n function rpc(string calldata urlOrAlias, string calldata method, string calldata params)\n external\n returns (bytes memory data);\n\n /// Starts recording all map SSTOREs for later retrieval.\n function startMappingRecording() external;\n\n /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,\n /// along with the context of the calls\n function startStateDiffRecording() external;\n\n /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.\n function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);\n\n /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.\n function stopMappingRecording() external;\n\n // ======== Filesystem ========\n\n /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.\n /// `path` is relative to the project root.\n function closeFile(string calldata path) external;\n\n /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.\n /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.\n /// Both `from` and `to` are relative to the project root.\n function copyFile(string calldata from, string calldata to) external returns (uint64 copied);\n\n /// Creates a new, empty directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - User lacks permissions to modify `path`.\n /// - A parent of the given path doesn't exist and `recursive` is false.\n /// - `path` already exists and `recursive` is false.\n /// `path` is relative to the project root.\n function createDir(string calldata path, bool recursive) external;\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function deployCode(string calldata artifactPath) external returns (address deployedAddress);\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n /// Additionally accepts abi-encoded constructor arguments.\n function deployCode(string calldata artifactPath, bytes calldata constructorArgs)\n external\n returns (address deployedAddress);\n\n /// Returns true if the given path points to an existing entity, else returns false.\n function exists(string calldata path) external returns (bool result);\n\n /// Performs a foreign function call via the terminal.\n function ffi(string[] calldata commandInput) external returns (bytes memory result);\n\n /// Given a path, query the file system to get information about a file, directory, etc.\n function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);\n\n /// Gets the artifact path from code (aka. creation code).\n function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);\n\n /// Gets the artifact path from deployed code (aka. runtime code).\n function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);\n\n /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);\n\n /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);\n\n /// Returns true if the path exists on disk and is pointing at a directory, else returns false.\n function isDir(string calldata path) external returns (bool result);\n\n /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.\n function isFile(string calldata path) external returns (bool result);\n\n /// Get the path of the current project root.\n function projectRoot() external view returns (string memory path);\n\n /// Prompts the user for a string value in the terminal.\n function prompt(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for an address in the terminal.\n function promptAddress(string calldata promptText) external returns (address);\n\n /// Prompts the user for a hidden string value in the terminal.\n function promptSecret(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for hidden uint256 in the terminal (usually pk).\n function promptSecretUint(string calldata promptText) external returns (uint256);\n\n /// Prompts the user for uint256 in the terminal.\n function promptUint(string calldata promptText) external returns (uint256);\n\n /// Reads the directory at the given path recursively, up to `maxDepth`.\n /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.\n /// Follows symbolic links if `followLinks` is true.\n function readDir(string calldata path) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth, bool followLinks)\n external\n view\n returns (DirEntry[] memory entries);\n\n /// Reads the entire content of file to string. `path` is relative to the project root.\n function readFile(string calldata path) external view returns (string memory data);\n\n /// Reads the entire content of file as binary. `path` is relative to the project root.\n function readFileBinary(string calldata path) external view returns (bytes memory data);\n\n /// Reads next line of file to string.\n function readLine(string calldata path) external view returns (string memory line);\n\n /// Reads a symbolic link, returning the path that the link points to.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` is not a symbolic link.\n /// - `path` does not exist.\n function readLink(string calldata linkPath) external view returns (string memory targetPath);\n\n /// Removes a directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` doesn't exist.\n /// - `path` isn't a directory.\n /// - User lacks permissions to modify `path`.\n /// - The directory is not empty and `recursive` is false.\n /// `path` is relative to the project root.\n function removeDir(string calldata path, bool recursive) external;\n\n /// Removes a file from the filesystem.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` points to a directory.\n /// - The file doesn't exist.\n /// - The user lacks permissions to remove the file.\n /// `path` is relative to the project root.\n function removeFile(string calldata path) external;\n\n /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.\n function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);\n\n /// Returns the time since unix epoch in milliseconds.\n function unixTime() external returns (uint256 milliseconds);\n\n /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFile(string calldata path, string calldata data) external;\n\n /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFileBinary(string calldata path, bytes calldata data) external;\n\n /// Writes line to file, creating a file if it does not exist.\n /// `path` is relative to the project root.\n function writeLine(string calldata path, string calldata data) external;\n\n // ======== JSON ========\n\n /// Checks if `key` exists in a JSON object.\n function keyExistsJson(string calldata json, string calldata key) external view returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `address`.\n function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);\n\n /// Parses a string of JSON data at `key` and coerces it to `address[]`.\n function parseJsonAddressArray(string calldata json, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool`.\n function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool[]`.\n function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes`.\n function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32`.\n function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.\n function parseJsonBytes32Array(string calldata json, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.\n function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256`.\n function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256[]`.\n function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a JSON object.\n function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of JSON data at `key` and coerces it to `string`.\n function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `string[]`.\n function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256`.\n function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.\n function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a JSON object.\n function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a JSON object at `key`.\n function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)\n external\n returns (string memory json);\n\n /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.\n /// Returns the stringified version of the specific JSON file up to that moment.\n function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(string calldata typeDescription, bytes calldata value)\n external\n pure\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(\n string calldata objectKey,\n string calldata valueKey,\n string calldata typeDescription,\n bytes calldata value\n ) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)\n external\n returns (string memory json);\n\n /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.\n function writeJson(string calldata json, string calldata path) external;\n\n /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = \n /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.\n function writeJson(string calldata json, string calldata path, string calldata valueKey) external;\n\n /// Checks if `key` exists in a JSON object\n /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.\n function keyExists(string calldata json, string calldata key) external view returns (bool);\n\n // ======== Scripting ========\n\n /// Takes a signed transaction and broadcasts it to the network.\n function broadcastRawTransaction(bytes calldata data) external;\n\n /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function broadcast() external;\n\n /// Has the next call (at this call depth only) create a transaction with the address provided\n /// as the sender that can later be signed and sent onchain.\n function broadcast(address signer) external;\n\n /// Has the next call (at this call depth only) create a transaction with the private key\n /// provided as the sender that can later be signed and sent onchain.\n function broadcast(uint256 privateKey) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function startBroadcast() external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the address\n /// provided that can later be signed and sent onchain.\n function startBroadcast(address signer) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the private key\n /// provided that can later be signed and sent onchain.\n function startBroadcast(uint256 privateKey) external;\n\n /// Stops collecting onchain transactions.\n function stopBroadcast() external;\n\n // ======== String ========\n\n /// Returns the index of the first occurrence of a `key` in an `input` string.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.\n /// Returns 0 in case of an empty `key`.\n function indexOf(string calldata input, string calldata key) external pure returns (uint256);\n\n /// Parses the given `string` into an `address`.\n function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);\n\n /// Parses the given `string` into a `bool`.\n function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);\n\n /// Parses the given `string` into `bytes`.\n function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);\n\n /// Parses the given `string` into a `bytes32`.\n function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);\n\n /// Parses the given `string` into a `int256`.\n function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);\n\n /// Parses the given `string` into a `uint256`.\n function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);\n\n /// Replaces occurrences of `from` in the given `string` with `to`.\n function replace(string calldata input, string calldata from, string calldata to)\n external\n pure\n returns (string memory output);\n\n /// Splits the given `string` into an array of strings divided by the `delimiter`.\n function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);\n\n /// Converts the given `string` value to Lowercase.\n function toLowercase(string calldata input) external pure returns (string memory output);\n\n /// Converts the given value to a `string`.\n function toString(address value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes calldata value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes32 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bool value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(uint256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(int256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given `string` value to Uppercase.\n function toUppercase(string calldata input) external pure returns (string memory output);\n\n /// Trims leading and trailing whitespace from the given `string` value.\n function trim(string calldata input) external pure returns (string memory output);\n\n // ======== Testing ========\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n int256 left,\n int256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are equal.\n function assertEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are equal.\n function assertEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are equal and includes error message into revert string on failure.\n function assertEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are equal.\n function assertEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are equal.\n function assertEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256 values are equal.\n function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are equal.\n function assertEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal.\n function assertEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are equal.\n function assertEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.\n function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are equal.\n function assertEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.\n function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal.\n function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal.\n function assertEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are equal.\n function assertEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are equal and includes error message into revert string on failure.\n function assertEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are equal.\n function assertEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is false.\n function assertFalse(bool condition) external pure;\n\n /// Asserts that the given condition is false and includes error message into revert string on failure.\n function assertFalse(bool condition, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n function assertGe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n function assertGe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n function assertGt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n function assertGt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n function assertLe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n function assertLe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n function assertLt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n function assertLt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are not equal.\n function assertNotEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are not equal.\n function assertNotEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are not equal.\n function assertNotEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal.\n function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal.\n function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal.\n function assertNotEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal.\n function assertNotEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are not equal.\n function assertNotEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal.\n function assertNotEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are not equal.\n function assertNotEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are not equal.\n function assertNotEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is true.\n function assertTrue(bool condition) external pure;\n\n /// Asserts that the given condition is true and includes error message into revert string on failure.\n function assertTrue(bool condition, string calldata error) external pure;\n\n /// If the condition is false, discard this run's fuzz inputs and generate new ones.\n function assume(bool condition) external pure;\n\n /// Discard this run's fuzz inputs and generate new ones if next call reverted.\n function assumeNoRevert() external pure;\n\n /// Writes a breakpoint to jump to in the debugger.\n function breakpoint(string calldata char) external;\n\n /// Writes a conditional breakpoint to jump to in the debugger.\n function breakpoint(string calldata char, bool value) external;\n\n /// Returns the Foundry version.\n /// Format: ++\n /// Sample output: 0.2.0+faa94c384+202407110019\n /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.\n /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000)\n /// to compare timestamps while ignoring minor time differences.\n function getFoundryVersion() external view returns (string memory version);\n\n /// Returns the RPC url for the given alias.\n function rpcUrl(string calldata rpcAlias) external view returns (string memory json);\n\n /// Returns all rpc urls and their aliases as structs.\n function rpcUrlStructs() external view returns (Rpc[] memory urls);\n\n /// Returns all rpc urls and their aliases `[alias, url][]`.\n function rpcUrls() external view returns (string[2][] memory urls);\n\n /// Suspends execution of the main thread for `duration` milliseconds.\n function sleep(uint256 duration) external;\n\n // ======== Toml ========\n\n /// Checks if `key` exists in a TOML table.\n function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `address`.\n function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);\n\n /// Parses a string of TOML data at `key` and coerces it to `address[]`.\n function parseTomlAddressArray(string calldata toml, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool`.\n function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool[]`.\n function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes`.\n function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32`.\n function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.\n function parseTomlBytes32Array(string calldata toml, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.\n function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256`.\n function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256[]`.\n function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a TOML table.\n function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of TOML data at `key` and coerces it to `string`.\n function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `string[]`.\n function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256`.\n function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.\n function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a TOML table.\n function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a TOML table at `key`.\n function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.\n function writeToml(string calldata json, string calldata path) external;\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = \n /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.\n function writeToml(string calldata json, string calldata path, string calldata valueKey) external;\n\n // ======== Utilities ========\n\n /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer)\n external\n pure\n returns (address);\n\n /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);\n\n /// Compute the address a contract will be deployed at for a given deployer address and nonce.\n function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);\n\n /// Utility cheatcode to copy storage of `from` contract to another `to` contract.\n function copyStorage(address from, address to) external;\n\n /// Returns ENS namehash for provided string.\n function ensNamehash(string calldata name) external pure returns (bytes32);\n\n /// Gets the label for the specified address.\n function getLabel(address account) external view returns (string memory currentLabel);\n\n /// Labels an address in call traces.\n function label(address account, string calldata newLabel) external;\n\n /// Pauses collection of call traces. Useful in cases when you want to skip tracing of\n /// complex calls which are not useful for debugging.\n function pauseTracing() external view;\n\n /// Returns a random `address`.\n function randomAddress() external returns (address);\n\n /// Returns an random `bool`.\n function randomBool() external view returns (bool);\n\n /// Returns an random byte array value of the given length.\n function randomBytes(uint256 len) external view returns (bytes memory);\n\n /// Returns an random `int256` value.\n function randomInt() external view returns (int256);\n\n /// Returns an random `int256` value of given bits.\n function randomInt(uint256 bits) external view returns (int256);\n\n /// Returns a random uint256 value.\n function randomUint() external returns (uint256);\n\n /// Returns random uint256 value between the provided range (=min..=max).\n function randomUint(uint256 min, uint256 max) external returns (uint256);\n\n /// Returns an random `uint256` value of given bits.\n function randomUint(uint256 bits) external view returns (uint256);\n\n /// Unpauses collection of call traces.\n function resumeTracing() external view;\n\n /// Utility cheatcode to set arbitrary storage for given target address.\n function setArbitraryStorage(address target) external;\n\n /// Encodes a `bytes` value to a base64url string.\n function toBase64URL(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64url string.\n function toBase64URL(string calldata data) external pure returns (string memory);\n\n /// Encodes a `bytes` value to a base64 string.\n function toBase64(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64 string.\n function toBase64(string calldata data) external pure returns (string memory);\n}\n\n/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used\n/// in tests, but it is not recommended to use these cheats in scripts.\ninterface Vm is VmSafe {\n // ======== EVM ========\n\n /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.\n function activeFork() external view returns (uint256 forkId);\n\n /// In forking mode, explicitly grant the given address cheatcode access.\n function allowCheatcodes(address account) external;\n\n /// Sets `block.blobbasefee`\n function blobBaseFee(uint256 newBlobBaseFee) external;\n\n /// Sets the blobhashes in the transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function blobhashes(bytes32[] calldata hashes) external;\n\n /// Sets `block.chainid`.\n function chainId(uint256 newChainId) external;\n\n /// Clears all mocked calls.\n function clearMockedCalls() external;\n\n /// Sets `block.coinbase`.\n function coinbase(address newCoinbase) external;\n\n /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Sets an address' balance.\n function deal(address account, uint256 newBalance) external;\n\n /// Removes the snapshot with the given ID created by `snapshot`.\n /// Takes the snapshot ID to delete.\n /// Returns `true` if the snapshot was successfully deleted.\n /// Returns `false` if the snapshot does not exist.\n function deleteSnapshot(uint256 snapshotId) external returns (bool success);\n\n /// Removes _all_ snapshots previously created by `snapshot`.\n function deleteSnapshots() external;\n\n /// Sets `block.difficulty`.\n /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.\n /// Reverts if used on unsupported EVM versions.\n function difficulty(uint256 newDifficulty) external;\n\n /// Dump a genesis JSON file's `allocs` to disk.\n function dumpState(string calldata pathToStateJson) external;\n\n /// Sets an address' code.\n function etch(address target, bytes calldata newRuntimeBytecode) external;\n\n /// Sets `block.basefee`.\n function fee(uint256 newBasefee) external;\n\n /// Gets the blockhashes from the current transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function getBlobhashes() external view returns (bytes32[] memory hashes);\n\n /// Returns true if the account is marked as persistent.\n function isPersistent(address account) external view returns (bool persistent);\n\n /// Load a genesis JSON file's `allocs` into the in-memory revm state.\n function loadAllocs(string calldata pathToAllocsJson) external;\n\n /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup\n /// Meaning, changes made to the state of this account will be kept when switching forks.\n function makePersistent(address account) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1, address account2) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address[] calldata accounts) external;\n\n /// Reverts a call to an address with specified revert data.\n function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;\n\n /// Reverts a call to an address with a specific `msg.value`, with specified revert data.\n function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)\n external;\n\n /// Mocks a call to an address, returning specified data.\n /// Calldata can either be strict or a partial match, e.g. if you only\n /// pass a Solidity selector to the expected calldata, then the entire Solidity\n /// function will be mocked.\n function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;\n\n /// Mocks a call to an address with a specific `msg.value`, returning specified data.\n /// Calldata match takes precedence over `msg.value` in case of ambiguity.\n function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;\n\n /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls\n /// `target` with the same calldata. This functionality is similar to a delegate call made to\n /// `target` contract from `callee`.\n /// Can be used to substitute a call to a function with another implementation that captures\n /// the primary logic of the original function but is easier to reason about.\n /// If calldata is not a strict match then partial match by selector is attempted.\n function mockFunction(address callee, address target, bytes calldata data) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address.\n function prank(address msgSender) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.\n function prank(address msgSender, address txOrigin) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(bytes32 newPrevrandao) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(uint256 newPrevrandao) external;\n\n /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.\n function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin);\n\n /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.\n function resetNonce(address account) external;\n\n /// Revert the state of the EVM to a previous snapshot\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted.\n /// Returns `false` if the snapshot does not exist.\n /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`.\n function revertTo(uint256 snapshotId) external returns (bool success);\n\n /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted and deleted.\n /// Returns `false` if the snapshot does not exist.\n function revertToAndDelete(uint256 snapshotId) external returns (bool success);\n\n /// Revokes persistent status from the address, previously added via `makePersistent`.\n function revokePersistent(address account) external;\n\n /// See `revokePersistent(address)`.\n function revokePersistent(address[] calldata accounts) external;\n\n /// Sets `block.height`.\n function roll(uint256 newHeight) external;\n\n /// Updates the currently active fork to given block number\n /// This is similar to `roll` but for the currently active fork.\n function rollFork(uint256 blockNumber) external;\n\n /// Updates the currently active fork to given transaction. This will `rollFork` with the number\n /// of the block the transaction was mined in and replays all transaction mined before it in the block.\n function rollFork(bytes32 txHash) external;\n\n /// Updates the given fork to given block number.\n function rollFork(uint256 forkId, uint256 blockNumber) external;\n\n /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.\n function rollFork(uint256 forkId, bytes32 txHash) external;\n\n /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.\n function selectFork(uint256 forkId) external;\n\n /// Set blockhash for the current block.\n /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.\n function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;\n\n /// Sets the nonce of an account. Must be higher than the current nonce of the account.\n function setNonce(address account, uint64 newNonce) external;\n\n /// Sets the nonce of an account to an arbitrary value.\n function setNonceUnsafe(address account, uint64 newNonce) external;\n\n /// Snapshot the current state of the evm.\n /// Returns the ID of the snapshot that was created.\n /// To revert a snapshot use `revertTo`.\n function snapshot() external returns (uint256 snapshotId);\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.\n function startPrank(address msgSender) external;\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.\n function startPrank(address msgSender, address txOrigin) external;\n\n /// Resets subsequent calls' `msg.sender` to be `address(this)`.\n function stopPrank() external;\n\n /// Stores a value to an address' storage slot.\n function store(address target, bytes32 slot, bytes32 value) external;\n\n /// Fetches the given transaction from the active fork and executes it on the current state.\n function transact(bytes32 txHash) external;\n\n /// Fetches the given transaction from the given fork and executes it on the current state.\n function transact(uint256 forkId, bytes32 txHash) external;\n\n /// Sets `tx.gasprice`.\n function txGasPrice(uint256 newGasPrice) external;\n\n /// Sets `block.timestamp`.\n function warp(uint256 newTimestamp) external;\n\n // ======== Testing ========\n\n /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;\n\n /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)\n external;\n\n /// Expects a call to an address with the specified calldata.\n /// Calldata can either be a strict or a partial match.\n function expectCall(address callee, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified calldata.\n function expectCall(address callee, bytes calldata data, uint64 count) external;\n\n /// Expects a call to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;\n\n /// Expect a call to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;\n\n /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)\n external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(\n bool checkTopic0,\n bool checkTopic1,\n bool checkTopic2,\n bool checkTopic3,\n bool checkData,\n address emitter\n ) external;\n\n /// Prepare an expected anonymous log with all topic and data checks enabled.\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmitAnonymous() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(address emitter) external;\n\n /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)\n external;\n\n /// Prepare an expected log with all topic and data checks enabled.\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmit() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(address emitter) external;\n\n /// Expects an error on next call that starts with the revert data.\n function expectPartialRevert(bytes4 revertData) external;\n\n /// Expects an error on next call to reverter address, that starts with the revert data.\n function expectPartialRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error on next call with any revert data.\n function expectRevert() external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes4 revertData) external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes calldata revertData) external;\n\n /// Expects an error with any revert data on next call to reverter address.\n function expectRevert(address reverter) external;\n\n /// Expects an error from reverter address on next call, with any revert data.\n function expectRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error from reverter address on next call, that exactly matches the revert data.\n function expectRevert(bytes calldata revertData, address reverter) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other\n /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.\n function expectSafeMemory(uint64 min, uint64 max) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.\n /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges\n /// to the set.\n function expectSafeMemoryCall(uint64 min, uint64 max) external;\n\n /// Marks a test as skipped. Must be called at the top level of a test.\n function skip(bool skipTest) external;\n\n /// Marks a test as skipped with a reason. Must be called at the top level of a test.\n function skip(bool skipTest, string calldata reason) external;\n\n /// Stops all safe memory expectation in the current subcontext.\n function stopExpectSafeMemory() external;\n}\n" + }, + "lib/ERC1155Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport 'lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol';\n\ncontract ERC1155Mintable is ERC1155(\"//uri\"), ERC1155Burnable {\n function mint(address to, uint256 id, uint256 amount) public {\n _mint(to, id, amount, bytes(\"\"));\n }\n}\n" + }, + "lib/ERC20Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\n\ncontract ERC20Mintable is ERC20(\"n\", \"s\") {\n function mint(address to, uint256 amount) public {\n _mint(to, amount);\n }\n}\n" + }, + "lib/ERC721Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol\";\n\ncontract ERC721Mintable is ERC721(\"n\", \"s\") {\n function mint(address to, uint256 tokenId) public {\n _mint(to, tokenId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() external {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC1155.sol\";\nimport \"./IERC1155Receiver.sol\";\nimport \"./extensions/IERC1155MetadataURI.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n *\n * _Available since v3.1._\n */\ncontract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {\n using Address for address;\n\n // Mapping from token ID to account balances\n mapping(uint256 => mapping(address => uint256)) private _balances;\n\n // Mapping from account to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256) public view virtual override returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {\n require(account != address(0), \"ERC1155: address zero is not a valid owner\");\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] memory accounts, uint256[] memory ids)\n public\n view\n virtual\n override\n returns (uint256[] memory)\n {\n require(accounts.length == ids.length, \"ERC1155: accounts and ids length mismatch\");\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts[i], ids[i]);\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeTransferFrom(from, to, id, amount, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeBatchTransferFrom(from, to, ids, amounts, data);\n }\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n\n emit TransferSingle(operator, from, to, id, amount);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n }\n\n emit TransferBatch(operator, from, to, ids, amounts);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the amounts in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _balances[id][to] += amount;\n emit TransferSingle(operator, address(0), to, id, amount);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; i++) {\n _balances[ids[i]][to] += amounts[i];\n }\n\n emit TransferBatch(operator, address(0), to, ids, amounts);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);\n }\n\n /**\n * @dev Destroys `amount` tokens of token type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `amount` tokens of token type `id`.\n */\n function _burn(\n address from,\n uint256 id,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n\n emit TransferSingle(operator, from, address(0), id, amount);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n */\n function _burnBatch(\n address from,\n uint256[] memory ids,\n uint256[] memory amounts\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n for (uint256 i = 0; i < ids.length; i++) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n }\n\n emit TransferBatch(operator, from, address(0), ids, amounts);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC1155: setting approval status for self\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `ids` and `amounts` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `id` and `amount` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {\n uint256[] memory array = new uint256[](1);\n array[0] = element;\n\n return array;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1155.sol\";\n\n/**\n * @dev Extension of {ERC1155} that allows token holders to destroy both their\n * own tokens and those that they have been approved to use.\n *\n * _Available since v3.1._\n */\nabstract contract ERC1155Burnable is ERC1155 {\n function burn(\n address account,\n uint256 id,\n uint256 value\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burn(account, id, value);\n }\n\n function burnBatch(\n address account,\n uint256[] memory ids,\n uint256[] memory values\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burnBatch(account, ids, values);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)\n external\n view\n returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes calldata data\n ) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) external;\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC1155Receiver.sol\";\n\n/**\n * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.\n *\n * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be\n * stuck.\n *\n * @dev _Available since v3.1._\n */\ncontract ERC1155Holder is ERC1155Receiver {\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155Receiver.sol\";\nimport \"../../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\nabstract contract ERC1155Receiver is ERC165, IERC1155Receiver {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.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 * For a generic mechanism see {ERC20PresetMinterPauser}.\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 * 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 *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => 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 * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\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 override 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 override 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 value {ERC20} uses, unless this function is\n * 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 override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override 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 `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` 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 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\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 `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `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 * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` 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 function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\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" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\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 amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` 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(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256, /* firstTokenId */\n uint256 batchSize\n ) internal virtual {\n if (batchSize > 1) {\n if (from != address(0)) {\n _balances[from] -= batchSize;\n }\n if (to != address(0)) {\n _balances[to] += batchSize;\n }\n }\n }\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Receiver.sol\";\n\n/**\n * @dev Implementation of the {IERC721Receiver} interface.\n *\n * Accepts all token transfers.\n * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.\n */\ncontract ERC721Holder is IERC721Receiver {\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n *\n * Always returns `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "lib/openzeppelin-contracts/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface.\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n // prepare call\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n\n // perform static call\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly {\n success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0x00)\n }\n\n return success && returnSize >= 0x20 && returnValue > 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableMap.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableMap.js.\n\npragma solidity ^0.8.0;\n\nimport \"./EnumerableSet.sol\";\n\n/**\n * @dev Library for managing an enumerable variant of Solidity's\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\n * type.\n *\n * Maps have the following properties:\n *\n * - Entries are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableMap for EnumerableMap.UintToAddressMap;\n *\n * // Declare a set state variable\n * EnumerableMap.UintToAddressMap private myMap;\n * }\n * ```\n *\n * The following map types are supported:\n *\n * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0\n * - `address -> uint256` (`AddressToUintMap`) since v4.6.0\n * - `bytes32 -> bytes32` (`Bytes32ToBytes32Map`) since v4.6.0\n * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0\n * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableMap.\n * ====\n */\nlibrary EnumerableMap {\n using EnumerableSet for EnumerableSet.Bytes32Set;\n\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Map type with\n // bytes32 keys and values.\n // The Map implementation uses private functions, and user-facing\n // implementations (such as Uint256ToAddressMap) are just wrappers around\n // the underlying Map.\n // This means that we can only create new EnumerableMaps for types that fit\n // in bytes32.\n\n struct Bytes32ToBytes32Map {\n // Storage of keys\n EnumerableSet.Bytes32Set _keys;\n mapping(bytes32 => bytes32) _values;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n bytes32 value\n ) internal returns (bool) {\n map._values[key] = value;\n return map._keys.add(key);\n }\n\n /**\n * @dev Removes a key-value pair from a map. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {\n delete map._values[key];\n return map._keys.remove(key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) {\n return map._keys.contains(key);\n }\n\n /**\n * @dev Returns the number of key-value pairs in the map. O(1).\n */\n function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) {\n return map._keys.length();\n }\n\n /**\n * @dev Returns the key-value pair stored at position `index` in the map. O(1).\n *\n * Note that there are no guarantees on the ordering of entries inside the\n * array, and it may change when more entries are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) {\n bytes32 key = map._keys.at(index);\n return (key, map._values[key]);\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) {\n bytes32 value = map._values[key];\n if (value == bytes32(0)) {\n return (contains(map, key), bytes32(0));\n } else {\n return (true, value);\n }\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), \"EnumerableMap: nonexistent key\");\n return value;\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), errorMessage);\n return value;\n }\n\n // UintToUintMap\n\n struct UintToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToUintMap storage map,\n uint256 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToUintMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key)));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToUintMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key), errorMessage));\n }\n\n // UintToAddressMap\n\n struct UintToAddressMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToAddressMap storage map,\n uint256 key,\n address value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToAddressMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), address(uint160(uint256(value))));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, address(uint160(uint256(value))));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToAddressMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage))));\n }\n\n // AddressToUintMap\n\n struct AddressToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n AddressToUintMap storage map,\n address key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(AddressToUintMap storage map, address key) internal returns (bool) {\n return remove(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(AddressToUintMap storage map, address key) internal view returns (bool) {\n return contains(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(AddressToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (address(uint160(uint256(key))), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key))));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(AddressToUintMap storage map, address key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n AddressToUintMap storage map,\n address key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage));\n }\n\n // Bytes32ToUintMap\n\n struct Bytes32ToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToUintMap storage map,\n bytes32 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, key, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) {\n return remove(map._inner, key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) {\n return contains(map._inner, key);\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(Bytes32ToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (key, uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, key);\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) {\n return uint256(get(map._inner, key));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToUintMap storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, key, errorMessage));\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableSet for EnumerableSet.AddressSet;\n *\n * // Declare a set state variable\n * EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSet {\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Set type with\n // bytes32 values.\n // The Set implementation uses private functions, and user-facing\n // implementations (such as AddressSet) are just wrappers around the\n // underlying Set.\n // This means that we can only create new EnumerableSets for types that fit\n // in bytes32.\n\n struct Set {\n // Storage of set values\n bytes32[] _values;\n // Position of the value in the `values` array, plus 1 because index 0\n // means a value is not in the set.\n mapping(bytes32 => uint256) _indexes;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function _add(Set storage set, bytes32 value) private returns (bool) {\n if (!_contains(set, value)) {\n set._values.push(value);\n // The value is stored at length-1, but we add 1 to all indexes\n // and use 0 as a sentinel value\n set._indexes[value] = set._values.length;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function _remove(Set storage set, bytes32 value) private returns (bool) {\n // We read and store the value's index to prevent multiple reads from the same storage slot\n uint256 valueIndex = set._indexes[value];\n\n if (valueIndex != 0) {\n // Equivalent to contains(set, value)\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n // the array, and then remove the last element (sometimes called as 'swap and pop').\n // This modifies the order of the array, as noted in {at}.\n\n uint256 toDeleteIndex = valueIndex - 1;\n uint256 lastIndex = set._values.length - 1;\n\n if (lastIndex != toDeleteIndex) {\n bytes32 lastValue = set._values[lastIndex];\n\n // Move the last value to the index where the value to delete is\n set._values[toDeleteIndex] = lastValue;\n // Update the index for the moved value\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\n }\n\n // Delete the slot where the moved value was stored\n set._values.pop();\n\n // Delete the index for the deleted slot\n delete set._indexes[value];\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\n return set._indexes[value] != 0;\n }\n\n /**\n * @dev Returns the number of values on the set. O(1).\n */\n function _length(Set storage set) private view returns (uint256) {\n return set._values.length;\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\n return set._values[index];\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function _values(Set storage set) private view returns (bytes32[] memory) {\n return set._values;\n }\n\n // Bytes32Set\n\n struct Bytes32Set {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _add(set._inner, value);\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _remove(set._inner, value);\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n return _contains(set._inner, value);\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(Bytes32Set storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n return _at(set._inner, index);\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n bytes32[] memory store = _values(set._inner);\n bytes32[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // AddressSet\n\n struct AddressSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(AddressSet storage set, address value) internal returns (bool) {\n return _add(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(AddressSet storage set, address value) internal returns (bool) {\n return _remove(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(AddressSet storage set, address value) internal view returns (bool) {\n return _contains(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(AddressSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\n return address(uint160(uint256(_at(set._inner, index))));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(AddressSet storage set) internal view returns (address[] memory) {\n bytes32[] memory store = _values(set._inner);\n address[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // UintSet\n\n struct UintSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(UintSet storage set, uint256 value) internal returns (bool) {\n return _add(set._inner, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\n return _remove(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n return _contains(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(UintSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n return uint256(_at(set._inner, index));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(UintSet storage set) internal view returns (uint256[] memory) {\n bytes32[] memory store = _values(set._inner);\n uint256[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n}\n" + }, + "lib/solmate/src/tokens/ERC20.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\nabstract contract ERC20 {\n /*//////////////////////////////////////////////////////////////\n EVENTS\n //////////////////////////////////////////////////////////////*/\n\n event Transfer(address indexed from, address indexed to, uint256 amount);\n\n event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string public name;\n\n string public symbol;\n\n uint8 public immutable decimals;\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 public totalSupply;\n\n mapping(address => uint256) public balanceOf;\n\n mapping(address => mapping(address => uint256)) public allowance;\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal immutable INITIAL_CHAIN_ID;\n\n bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n CONSTRUCTOR\n //////////////////////////////////////////////////////////////*/\n\n constructor(\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n\n INITIAL_CHAIN_ID = block.chainid;\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual returns (bool) {\n allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual returns (bool) {\n balanceOf[msg.sender] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual returns (bool) {\n uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;\n\n balanceOf[from] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n // Unchecked because the only math done is incrementing\n // the owner's nonce which cannot realistically overflow.\n unchecked {\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n allowance[recoveredAddress][spender] = value;\n }\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return\n keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(\"1\"),\n block.chainid,\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n totalSupply += amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n balanceOf[from] -= amount;\n\n // Cannot underflow because a user's balance\n // will never be larger than the total supply.\n unchecked {\n totalSupply -= amount;\n }\n\n emit Transfer(from, address(0), amount);\n }\n}\n" + }, + "lib/solmate/src/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Gas optimized reentrancy protection for smart contracts.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)\nabstract contract ReentrancyGuard {\n uint256 private locked = 1;\n\n modifier nonReentrant() virtual {\n require(locked == 1, \"REENTRANCY\");\n\n locked = 2;\n\n _;\n\n locked = 1;\n }\n}\n" + }, + "lib/solmate/src/utils/SafeTransferLib.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20} from \"../tokens/ERC20.sol\";\n\n/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)\n/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.\n/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.\nlibrary SafeTransferLib {\n /*//////////////////////////////////////////////////////////////\n ETH OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferETH(address to, uint256 amount) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Transfer the ETH and store if it succeeded or not.\n success := call(gas(), to, amount, 0, 0, 0, 0)\n }\n\n require(success, \"ETH_TRANSFER_FAILED\");\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferFrom(\n ERC20 token,\n address from,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), from) // Append the \"from\" argument.\n mstore(add(freeMemoryPointer, 36), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 68), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FROM_FAILED\");\n }\n\n function safeTransfer(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FAILED\");\n }\n\n function safeApprove(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"APPROVE_FAILED\");\n }\n}\n" + } + }, + "settings": { + "evmVersion": "paris", + "optimizer": { + "enabled": true, + "mode": "3" + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout" + ], + "": [ + "ast" + ] + } + }, + "detectMissingLibraries": false, + "forceEVMLA": false, + "enableEraVMExtensions": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/deployments/zkSyncSepolia/.chainId b/deployments/zkSyncSepolia/.chainId new file mode 100644 index 0000000..f1efb20 --- /dev/null +++ b/deployments/zkSyncSepolia/.chainId @@ -0,0 +1 @@ +300 \ No newline at end of file diff --git a/deployments/zkSyncSepolia/MagicSwapV2Router.json b/deployments/zkSyncSepolia/MagicSwapV2Router.json new file mode 100644 index 0000000..b98605f --- /dev/null +++ b/deployments/zkSyncSepolia/MagicSwapV2Router.json @@ -0,0 +1,4500 @@ +{ + "address": "0xa314cA85f158776847ad0A9dbB6C41Fd3DA5F953", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "MagicSwapV2InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountADeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountBDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmounts", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExcessiveInputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientAAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientBAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientOutputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedNft", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityRemoved", + "type": "event" + }, + { + "inputs": [], + "name": "BURN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ONE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountADesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountTokenDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountMinted", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountIn", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountOut", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsOut", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveB", + "type": "uint256" + } + ], + "name": "quote", + "outputs": [ + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityETHWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapETHForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapETHForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactETHForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collectionIn", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountIn", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_collectionOut", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountOut", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapTokensForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "withdrawVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0xa314cA85f158776847ad0A9dbB6C41Fd3DA5F953", + "transactionIndex": 0, + "gasUsed": "136062491", + "logsBloom": "0x00000002000400080000010000000000000004000000400000000000000000000008000000000000000000000001000000000000000000000080000000000000200100000000040000000028000040000400000000000000000000000000080400000000020100000000000000000800000000000000400000000010000000000000001000000000000004000100000000000100000000000000000000000080800000000000100000000000880100000000000004000000002000010000000000000002008000000000000000000000000010020100000000000000000020000200000000010000000000000000000000000040000000000000000080100000", + "blockHash": "0xbf1e0d7d8cebd4102eec3b884b219f5703179e4b4daa3de25847a91e3ead9ed5", + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 3908529, + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x000000000000000000000000000000000000000000000000001af74d1026d580", + "logIndex": 0, + "blockHash": "0xbf1e0d7d8cebd4102eec3b884b219f5703179e4b4daa3de25847a91e3ead9ed5" + }, + { + "transactionIndex": 0, + "blockNumber": 3908529, + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000cd0000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ebe25496660b0f2063a543ca6405823037f6547f295bbde32cb65467569a2c00c", + "logIndex": 1, + "blockHash": "0xbf1e0d7d8cebd4102eec3b884b219f5703179e4b4daa3de25847a91e3ead9ed5" + }, + { + "transactionIndex": 0, + "blockNumber": 3908529, + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0xbe25496660b0f2063a543ca6405823037f6547f295bbde32cb65467569a2c00c" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000001269210c10000000000000000000013700010009c000013700100804100000d0b0000213d000000010020019000000000003204350000137002008041000013700020009c000000000101043b00004dbe000104304dbc4db70000040f00000d0b0000c13d000000000001004b0000000000210435000000c001100210000000000100041400000040022002100000000001010433000000400100043d000000000121019f000000400200043d000009d30000213d000000000202043b0003000000010355000000200030008c00000000003104350000000003010019000000000112019f0000000000100443000000000002004b000000000048004b0000000004034019000000000701034f0000000008980436000000007907043c4dbc4db20000040f000000000006004b000000400010043f000000000003004b0000006003300270000000000802001900000060011002100000002002100039000000c002200210000000000200041400000000004304350000000004620019000013b9011001c700001372063001980000001f0530018f00001370033001970000002004000039000000400030043f000013ab0010009c000000000004004b000013b201000041000000040010043f000000000010043f000013d201000041000021bc0000613d000000000065043500000d0b0000413d000000000200003900000000001204350000801002000039000000008a08043c000000000707043b0000004001100210000000040020008c000009d30000c13d00000004001004430000000000230435000000200300003900000000020204330000000d02000029000013bf02000041000000000686019f000000000767022f0000010006600089000000000805043300000003066002100000000009a904360000001f014000390000000001000019000000000021004b0000000e0200002900000060031000390000004402100039000000000059004b000000000201043b0000001f0640018f00000000066701cf000000000868022f00000000086801cf000000000771034f000000000801034f000100000003001f000000000303043b000000000001042d0000002402100039000080050200003900001376011001c70000000001000412000013730010009c00000000040000190000000e010000290000137501000041000000000012004b000000000800001900000007020000290000002002200039000013ab0020009c000000000005004b000000200330003900000004021000390000000c02000029000013730020009c000000400300043d000000000008004b000013e80010009c000000000034043500001bc80000613d00001bc80000013d0000000d010000290000000201100367000013700030009c0000000103000031000000000a000019000000200740019000000000005404350000006402100039000013b0011001c70000800202000039000013b6011001c700000024000004430000000a02000029000032f20000213d000000400210003900000001020040390000000b010000290000000007000019000000c003100039000000a003000039000013f603000041000013f5040000410000008003100039000013f404000041000000a003100039000000000131019f0000137302200197000000000042004b000013b501000041000013730040009c000013b300a0009c0000137003008041000013b2011001c700000041010000390000000a010000290000000201000367000000010200c03900001373011001970000000901000029000000000808043b000013ab0080009c0000000c0300002900000034041000390000000003030433000013c2011001c7000000000034004b000000000404043b000d00000002001d000e00000002001d4dbc46c30000040f000013ab0090009c0000000006000019000013f30010009c000000400030008c00000000050504330000000c010000290000000000240435000113700030019d0000000b02000029000000000007004b000000400020043f000013b3080040410000002803000039000000600110018f0000000005000019000013ab0030009c000000000043004b000000000300001900000060033002100000137004008041000013700040009c0000006001300210000000000161034f00000040033002100000002004400039000000000032004b00000000001404350000000d030000290000002001000039000013b30400404100000004021003700000137003000041000000000161019f00000000015101cf000000000151022f0000010005500089000000000656022f00000000065601cf0000000305500210000000000505043b000013ab0040009c000000000053004b000000400400043d0000000902000029000000000200041600001378011001c700000d0b0000613d0000800b02000039000013ae011001c7000013ad010000410000000802000029000113700010019d0000006001100270000000000604043300000001020000390000000909000029000000400400003900001370020000410000000401200039000013ab0060009c0000000a03000029000000000013004b00003dcb0000213d0000000002090019000000040090008c000000000058004b0000003f0110003900000000050004100000002006600039000000000606043b000013b30090009c000013ab00c0009c000000600030008c0000000000130435000c00000002001d000000000078004b000000000039004b000013b30700404100000024021003700000000803000029000800000001001d00000000020000190000000009000019000046060000213d000000000b0000190000000000520435000000000031004b000000000069004b00000000002c004b000000000017004b000013b30a0080410000000001000416000013730030009c0000137000b0009c000000000035004b00000000040000390000001101000039000e00000001001d0000000501100210000013730050009c00000a3f0000613d000000000056004b000900000002001d0000137302100197000a00000001001d000c00000001001d0000000002000411000000070100002900000b940000413d000013ac0030009cffffffffffffffff000042820000213d00002d640000c13d00002b5e0000213d0000000a0b0000290000000004000414000024260000213d000000000001042f000000000353019f00000000050104330000000305000367000000000009004b000013c6011001c70000002503000039000000040100002900000001040040390000000000420435000000200200003900000005010000290000000801000029000000000909043b0000000b0300002900000000080ac019000000000057004b000013b300e0009c000000400040043f00003dc90000613d000032f00000613d000000070c000029000000080a000029000013de01100197000000000041004b00000000078704360000001f01300039000000010010019000000001010040390000000001000039000000000903001900000001004001900000000002040019000b00000001001d00000a3f0000413d000000000074004b0000000e03000029000000400060043f0000002402200039000000000403043b00000023032000390000002402400039000000000105001900004dbd0001042e0000002400100443000700000001001d000000200770003900003dd10000a13d0000006004000039000032f80000a13d000000010220018f0000000003020433000000060d000029000000400b00043d000024d90000213d000000000045004b0000000006000039000013b3098001970000001e03000039000013be030000410000000003040019000013c103000041000013c003000041000013730410019700000004020000290000000b0400002900000000020300190000000403400039000d00000003001d0000000903000029000900000001001d000001f70000013d000000000068004b000000000401043b00000000000a004b000013b30a8001970000003201000039000013ab0070009c000013b306004041000000000113019f000013730430019700002d640000213d00000000090b001900000000057b0019000013ac0010009c0000000201000029000000010060019000000001060040390000000000410435000000060200002900008009020000390000000002014019000000600210018f00000005030000294dbc36670000040f0000000301000029000000000201043300000005044002100000000004000415000700000002001d0000000d04000029000000000054004b000600000001001d0000004402100370000013b30400804100000000060300190000000d06000029000000400090043f000013b308002041000000020500036700000002022003670000002005500039000013b300f0009c000013b308700197000000050dc00210000000000046004b000046040000613d000035770000213d000013700060009c0000000000160435000000400600043d000013730330019700000028020000390000001201000029000000c003400210000000000a69013f00000000007b004b000000000335034f000013ab0050009c0000000004010433000013b300b0009c0000000005000039000000e00110018f0000006007400190000000200040008c00000000011204360000000703000029000000000661034f000000400080043f0000000507600210000c00000004001d0000000006060433000c00000003001d00000005020000294dbc27dd0000040f0000000403200039000a00000003001d00000000030004140000002001300039000d00000001001d000000000978013f0000000100b00190000000010b004039000000000b0000390000003f03300039000000200bb00039000000200dd000390000004000e0043f000013ab00e0009c000000000047004b000000060100002900000006030000294dbc25930000040f00000000008304350000000000920435000013b30080009c000000000067004b324c696272617279556e69737761705600004d050000213d000042800000613d000042800000213d0000000409000029000000040160003900000024016000390000006401600039000000000025004b000032f20000c13d00000014090000290000001302000029000000006806043c000000000605034f00002b5c0000413d0000000401b0003900000000001b043500000004002004430000000001030433000013cb0010009c000027840000213d000027860000213d0000000000020435000000000301043300000003020000290000006002200210000000a004100039000013b3044001970000010004400089000000000545022f00000000054501cf000000000016004b000013700410019700000020088000390000000104000031000013b101000041000000c001300210000013b30060009c0000000c05000029000000000331034f000b00000002001d000000040010008c000013af02000041000000400500043d000b00000003001d000800000002001d000000000087004b0000000009930019000013b409300197000000000093004b000000000b0200190000004000c0043f0000000100d00190000000010d004039000000000d0000390000000000c2004b0000000000ed04350000137300e0009c000000000d01001900000000006c004b000000000c2d00190000000000c10435000013b308300197000000000072004b000000000301043b0000010003300089000000000434022f00000003033002104dbc36eb0000040f0000000002000410000000000076004b0000000100900190000000010900403900000000090000390000002009900039000000800200003900000000008a004b000000050b900210000e00000003001d00004d0b0000a13d00004ad00000a13d00004ad60000213d0000002000b0008c00000000002c0435000046040000213d000046120000613d000000010050019000000001050040390000137000c0009c000000200a00008a00000005031002100000137000a0009c0000001301000029000032f00000213d000000000049004b0000137304200197000000040090044300000000033401cf000000000535022f00000000053501cf000000000445034f0000001f0330018f00000000020500190000137003100198000000000223019f0000006003400210000000200e00008a000013e905000041000000c0041000390000004404100039000000440400003900002b5e0000c13d0000001f0110003900000000042300190000002401b000390000000000030435000013b80030009c0000000f0b000029000f0000000b001d0000000004010019000000000053043500000000000b004b000000000c000019000000000400003100000000034301cf000000000343022f0000000304400210000000400050043f00000002030000390000800d020000390000000807000029000013b30b008041000013b309004041000000000025043500000003030000290000000002034019000013730030019800000000030440190000000202000367000013b306600197000013b307008041000000010210008a000013b701000041000000000121004900000000060500190000004403000039000080050100003900000080030000390000000021010434000001d90000613d000700000003001d00000000021204360000000008030019000000050430021000000d0b0000813d000500000001001d000a00000004001d000b00000005001d000a00000002001d000000000e0000190000000000960435000000000975034f000000000a0a043b00000000093b00190000003f02b00039000000000835034f000000000807c01900000000060000310000000006860436000000007807043c0000000005030019000000000402043b000013b303004041000000000038004b000000000023004b000000000302043b000027100050008c000000000027043500003f980000613d00003f920000213d000d00000005001d00000014030000390000140503000041000039640000213d000039660000213d0000002401c00039000000040040008c0000006001000039000000000575019f00000000056501cf000000000565022f00000000076701cf0000000007040433000000000557034f000000000807034f00000003070003670000000004530019000013de05400198000000000341043600000000033100190000000003064019000000a4011000390000000005730019000000a4026000390000008402600039000013f80100004100000060039002100000006003800210000000000304a0190000000201100039000000020420008a000000000500a019000000000400201900000000040500190000000009042019000000000804401900000005057002100000000107100039000000010320008a000000400230021000000060021000390000002003100039000000000302401900000014020000290000000001a2001900000000067601cf000000000676022f0000010007700089000000000878022f00000000087801cf00000003077002100000001f0740019000000000080a001900000000056a001900000000030a4019000013fb01000041000000400a00043d000000010010008c000032f00000413d000033230000613d000000400c00043d00000000010b043300000000040b4019000000200aa000390000000f020000290000278c0000a13d0000000000c1004b00000000020b04330000001f0030008c0000000001b20019000000100c0000290000000e0a00002900000000030b4019000025600000213d0000000000620435000000000028004b000025030000213d000024db0000213d000024280000213d000000000026043500000000004a004b000013b30b004041000013b30c002041000013b300c0009c000013b3077001970000000507800210000000000706043b000000000705034f0000000001360019000013de03300197000013b30a00204100000000090bc019000000000079004b000000000305001900000000000104350000000c0020006b00000004030000290000004003100039000000000014004b000000000747001900000024044000390000000004020019000000000052004b4dbc37720000040f000000000065004b000a00000006001d00000040012002104dbc4d940000040f0000137502000041000000070010006b0000000906000029000000000064004b000000000541034f000000000060007c00000007060000290000000d0000006b00000bc40000013d0000006402100370000013b30330019700000000032300190000004402000039000b00000004001d0000002007400039000000000745034f000000000704c01900000000007a004b0000002001100039000013b30740019700000000001e004b000013b30f700197000000000a08c019000000000083004b000013b30a0040410000000000ae004b000000000fae013f000013b30e3001970000000008b60049000000000908043b000013b3092001970000008401100370000000c40050008c0000000001040019000000800010043f000000020200002900000000030004124dbc37d60000040f000000000b0b043b000000400070043f000000000027004b000000000026004b000013b309008041000013b306002041000000840030008c000000040050008c00000080040000393a20494e53554646020000020000000000004d030000613d00004ace0000613d000027100520011a0000004401c000390000006401c000390000460c0000a13d000046060000c13d0000460c0000613d000042880000a13d000042880000613d0000428e0000613d000b00000007001d00003f9a0000a13d0000004402600039000000200300008a0000000f01000029000000100300002900003dc90000213d000013df0010009c00003dfc0000613d000013bf01000041000000070500002900000000030d04330000000001a1016f000035770000c13d000013fd030000410000003103000039000013fa03000041000013f9030000410000333c0000613d00000000022100190000006005200210000013af03000041000000000204a0190000006005300210000d00000006001d0000004003a00039000013fc0020009c00000000020a0433000000e00210018f00000060064001900000000001060433000000110200002900000000030c0433000000120a000029000013e601000041000013700100004100000000020b40190000000000d10435000027be0000613d0000004000b0043f00000000010e04330000000003020019000025380000213d00000001022000390000001f0410018f000013de031001980000137001100197000000010100003100001373051001970000000704000029000000000703001900000000038704360000000003370049000000000409c019000000000b4a013f000013b309002041000000000806043b000000000605c019000013b305008041000000000bab04360000000007ab00190000001f09a0018f000000000b9704360000000000bc0435000000000b370049000000000b0cc0190000000000bd004b000000000ebd013f000013b30d800197000013b30bb001970000000000b8004b000000000ba40049000000050a900210000000010aa000390000000007b704360000137300b0009c0000000000870435000000800b00003900000000070ac019000000000c7b013f000013b30b90019700000000077400490000002009700039000000000968013f000013b3065001970000001f0550008a000000000075004b000000020030008c4dbc35e30000040f000000000024004b000013b80010009c00000009050000290000196e0000413d000017210000413d000014350000613d0000127a0000613d00000000040300190000000e030040290000000a090000290000135f0000613d000000000362001900001372064001980000001f0540018f000100000004001f00000020073001900000001f0630018f000013700430019700000007011000290000000709000029000000070570002900000009057000290000000e04000029000013c4011001c700000004013000390000000104400039000900000009001d000000400900043d000000040640003900000023064000390000000000860435000000000841034f00000000030000310000000002010019000500000005001d000d00000004001d000013dc02000041000000000300003900000bc00000013d000400000001001d4dbc4b210000040f4dbc47890000040f00000000050100190000000e01100029000400000002001d000000090400002900000006060000290000000c0000006b000900000003001d000000050220021000000000040004100000000005030433000013b30600804100000000007304350000000000630435000013b30030009c000013b406600197000800000004001d0000004403400039000b00040020003d000600000003001d000000a402100370000000840210037000000000040ec019000013b30e0020410000000000e7004b00000000004f004b000013b304e00197000000000807043b000000000e7a013f000000000082004b000000000019004b000013b30820019700000024032000390000000000ab0435000000000a35034f000000000ca20019000013b40a200197000000000e0a043b000000000a25034f0000000100f00190000000010f004039000000000f0000390000003f01d00039000013b301004041000013ac0020009c00000b9d0000013d000013c3010000410000000804000029000500000002001d000600000002001d000000000601043b4dbc33a20000040f0000003f03a00039000000000073004b000000000037004b0000000007720019000000000804043b0000000b06000029000000000063004b0000000b031003600000000003250049536166654552433248656c7065723a3a5472616e73666572ffffffffffffffe0000000040000000000004d170000c13d00004d110000c13d00004d030000213d00004d050000c13d00004ace0000213d000048fe0000c13d000048f80000c13d000000120100003900001407020000410000140602000041000048150000c13d000048250000c13d00000040017002100000137007008041000013700070009c000a00000008001d000200000001001d000042820000c13d00000006035000290000000603300029000513730010019b000300000002001d000d00000000000200003deb0000613d00003dd70000613d00003dc10000613d000000100200002900003dd10000613d00003dcb0000c13d0000002401200039000000440120003900000000090c001900000000057c001900000000030c40190000001f0010008c000013de03100197000013700c008041000000030b0000290000357d0000413d000000020b000029000300000003001d0000333c0000013d0000004401600039000000200010008c000000a003200039000013f70020009c00000064030000390000002001200039000000440320003900000064042000390000001202000029000000000502a0190000000006022019000013fc0050009c00000000051a04360000000f03000029000033120000613d000032fe0000613d000013730710019700000005015002100000000103500039000000000051004b000032bd0000613d000032f80000613d000000140100002900000000011304360000000003340019000032f00000c13d00000000004a0435001000000005001d000000000904043b0000004001100039000100000004001d0000001d03000039000013f003000041000013eb03000041000013ea0200004100000036020000390000002a03000039000013ed03000041000013ec0300004100002bf60000613d00002b9a0000613d4dbc25810000040f00000000010b001900000004070000290000000004540436000000010500008a000013e706000041000000240510003900002b5c0000c13d00000000000404350000002404100039000013e7040000410000137000e0009c000000020f0000290000004000f0043f000a0000000b001d000300000006001d000027be0000013d000013730250019700000001010000290000000c06000029000f00000002001d0000000001020433000027860000c13d000013de043001980000137302400197000200000004001d000000000015004b000000000086004b000024db0000c13d000013b3050040410000004000a0043f0000000100a00190000000010a004039000000000a000039000024260000c13d000024280000c13d000013df0030009c0000003403000039000013c903000041000013c80300004100000002050000290000000001230049000000001801043c0000000005630019000000a004200039000000000651034f000000000881034f000000800c200039000000000981034f000000000b91034f000000e007200039000000600a200039000000c007200039000000000871034f000000400320003900000020032000390000000405000029000200000005001d000013c5020000414dbc3e410000040f0000000003000410000000000121034f000001d90000413d0000135f0000013d00001a9d0000013d00000000050204330000000d05000029000900000006001d000000640250037000000000030220190000000a05700029000000000603043300000001010000390000000c090000290000000b090000290000000e090000290000000e0570002900000000087a00190000000000cb0435000000000c0c043b000013b303002041000013b307300197000000000c03043b000013b303200197000000000500003100000001020000290000000c040000290000000a08000029000000000098004b0000000008890019000013b4088001970000003f08700039000000000603043b000000000074043500000000063600190000002403300039000013b302200197000013730060009c000e00000005001d000c00000007001d4dbc25740000040f4dbc3a170000040f0000000005040019000600000007001d000900000004001d000013c701000041001000000003001d000013d902000041000000000502043b00000000060004100000000005000411000013db020000410000000503300210000000a40050008c0000000b050000294dbc49590000040f000013b401100197000011060000c13d0000000c0010006b0000006401100370000000200110008a0000000001030019000000000501043b000000a40110037000000a3f0000c13d000000000706c0190000000006260019000d00000007001d0000000506300210000000010070019000000001070040390000000007000039000000400700043d000000000604c0190000000000460435000000800040043f0000008006600039000013cb0060009c0000003f063000390000000503400210000000c402000039000000e40050008c000000090010006b0000000a0000006b0000004402400039000000040240003900000000010004110000000001000410000000440150003900000000002004430000000a040000290000000203000367000000000a4f013f0000000b048000290000000b033000290000000008d600490000000b012000290000001f0440008a000000000235034f000000000104c019000000000401c019000013b301008041000000000089004b000000000a89013f0000001f0110008a0000002403100039000000840020008c4dbc236d0000040f000013aa01000041000200000002001d00000004003004430000000000300443000013750300004100000080010000390000000000d20435000013b304002041000013b302004041000000050a800210000000000a48013f000013b30070009c000013b3080080410004000000000002736166655472616e020000000000000000000024000000007fffffffffffffff000000440000000000000000ffffffff00004d7c0000613d0000002401a000390000004401a000390000006401a0003900000000002a043500004d400000613d00004d530000613d00004d030000413d00004d300000613d00004d1d0000613d0000000f0010006c00004d110000213d00004d110000613d0000000806000029000000020a00002900020000000a001d00000000030820190000006003200210000700000006001d00004aef0000613d000000000208401900004adc0000613d0000000002070433000013730810019700004ad60000c13d0000002c020000390000140e020000410000140d020000410000490e0000613d00000000054200d900002710024000c9000049210000613d0000006001b002100000137206b001980000001f05b0018f0000004001c0021000000040018002100000137008008041000013700080009c000000040280003900000000002804350000002402800039000000440280003900000000053700d9000000060440008a0000000008c20019000000600220018f0000001f0240003900010000000b001f000013700b300197000000040c00002900040000000c001d000000c001400210000000010b0000310000140a02000041000048380000613d0000475e0000613d000000040270003900000024027000390000004402700039000047200000613d000100000001001d000000400160021000001370060080410000465f0000013d000046440000613d000046000000613d00000000003704350000000602100029000000010400002900000003055000290000000206000029000042d30000613d0000000c0b0000290000000a0c000029000900000005001d000042a40000613d000042900000613d000000000406001900000000076100190000003f0310003900000000020000310000000b0010006c000100000006001d00003fb40000613d00003fa00000613d00003fc50000613d000200000003001d00003e150000613d000000050400002900003e280000613d000000000331016f000000000131016f000000240420003900003dec0000613d00003dd80000613d00003dc90000413d00003a040000613d00001407030000410000140603000041000014090300004100001408030000410000006401200039000000090010006c0000399f0000c13d000039990000c13d000039af0000613d000039900000613d0000000002b10019000039640000613d000039640000413d0000000402b0003900000000002b0435000039660000c13d0000000506000029000500000006001d000400000007001d000037b90000613d0000375c0000613d000036d50000613d0000002d030000390000140003000041000013ff03000041000036510000613d000035d00000613d000400000004001d000000800c000039000000600d00003900030000000b001d0000357f0000613d0000357d0000c13d00000000010c04330000357d0000213d000000010c000029000035b40000613d000035b30000613d00010000000c001d000035610000613d00000000070c001900000000014c00190000000004a30170000000000c3d04360000000000d1004b00000000011d0019000000400d00043d00000000004b0435000000800b10003900020000000b001d00000000010b4019000033070000013d000000600c000039000d00000008001d0000334f0000613d000300000004001d0000001f03100039000031680000613d0000000003052019001100000005001d0000006004100210000000000105401900001373031001970000000605000029000033130000613d000032ff0000613d0000001103000029000000000307201900000060031002100000000001074019000000003503043c000000020330036700000000022400190000001f0120018f001400000004001d000013b4033001970000003f032000390000000502100210000033650000613d0000338f0000613d00120000000c001d000032da0000613d00000000070b001900000000014b0019000000000b3c04360000000001c40019000013de0410019700120000000a001d000000800a100039000000120b00002900120000000b001d000100000002001d000000100100002900001373091001970000000005650436000000004604043c0000000204400367001100000003001d00000000054504360000000004a2034f000013b304900197000000000482034f0000000204000029000000000406c019000000000a04043b000000000442034f0000000104b0006a00000000000d004b000000000d00001900000000009b004b00002bf60000013d00002b9a0000013d00000000010f0019000000600200003900000000001b004b000000c00240021000000001066000390000000004740436000000200cc0003900000000050c0433000013ab00d0009c0000000000910435000500000004001d00002bad0000613d00002b5c0000213d00002bda0000613d00002bd90000613d00000005070000290000000004e30170000000000135043600000000015400190000000004e1016f0000000001e1016f000000010f000029000000010420018f00000000004f0435000000800f10003900000000020e043300000000090e001900000000057e001900000000020f043300000000090f001900000000057f001900020000000f001d0000137000f0009c000000000018004b000027fb0000613d000a00000000000200000000030604330000000005070433000000000252043600000000050a043300000000030a0433000013ab00b0009c000026f80000613d0000000002120019000000a402b000390000004401b00039000027840000613d000027980000613d0000000501d0002900000000010a0433000000010020008c000013b30550019700000000044500190000000000560435000027840000c13d000027840000413d0000000006760436000000005705043c00000000003b0435000100000005001d001000000000000200000000013204360000000001210019000025720000213d000000000703043b00000000070200190000000008680019000000000072043500000024066000390000000508700210000024d90000c13d000000000602043b00000024025003700000000401500370000013ac0040009c000013730070009c0000000007570019000013ab00a0009c00000000003a004b000013b4055001970000003f05400039000000000338034f000023650000213d000000000664001900000000061404360000000005540019000013de054001970000003f04400039000013de044001970000001f04100039000021fc0000613d000010380000013d0000232d0000613d000020910000613d000000020010008c000013ba040000410000000001610019000000000151034f0000001f0460018f000013b30a5001970000000004640049000000050680021000000005081003600000000000da0435000000800d0000394dbc2d660000040f00000004026000390000000203000029000013d10400004100000000065300190000001f0450018f000013b30a600197000000000454004900000005058002100000002006500039000000000882034f0000000000ba0435000012cc0000613d000e00000004001d0000001f0440018f000013de0340019800000000064304360000000005530019000013de053001970000001f0340003900000004011000290000000005060019000000000551034f000000000070007c0000000607000029000000010030019000000001030040390000000a01200029000000000321034f0000000001310436000000840550037000001373052001974dbc2c110000040f000013b40820019700000000040bc019000013b30b00204100000000000e004b000000000825034f0000000a0500002900000000040304330000000601100029000800000005001d000000000502c01900000000030260190000000e0340014f00001378012001c7000000000300041600000004025000390000000e05000029000013c7020000410000000b045003600000000b02200029000000000e1a0019000013b40aa001970000003f0ad000390000000a03300029000700200030003d000000000803c0190000000003d60049000000000325034f000000000309c019000000000873013f0000001f0430008a00000000033600490000000b0020006b0000008402500370000000000602a0190000000003060019000000010500c0390000000e0030006b00001373032001970000000401100039000013bf0300004100000044031000390000000e0040006b00000009011000290000000902100029000013c5010000410000002401300039000013da020000410000000c021000290000000c057000290000000b021000290000000b057000290000000e0120002900000006040000290000000803200360000013b30e7001970000000a07000029000000000308c019000000000605043b000013cc0010009c0000000003350019000000050540021000000e670000613d000100000000001d000000000103043b000700000004001d000800000007001d00000009080000290000000a06000029000a00000009001d00000000006804350000000d08000029000013b4083001970000003f037000390000002303400039000000010080019000000001080040390000000008000039000013b4072001970000003f026000390000000506400210000000040230003900000023023000394dbc23430000040f000000050500002900000004060000294dbc242e0000040f00000002060003674dbc243b0000040f000000010300c039000000040030008c000000e403100370000001040050008c4dbc25050000040f00000000050004124dbc25620000040f00000000010700190000000004000411000000000702043b4dbc3fe50000040f0000000007080019000000000309001900000000055600190000089e0000613d000900000007001d0000000d0010006c0000000a01300029000a13b40010019b0000000e0010006c00000000011300194dbc42e80000040f0000000007070433000006910000613d00000084031003700000000c0050006b000000000062004b000013b404400197000000000621034f00000000042400190000000e06000029000e00000007001d0000000006670019000000000607001900000009011003600000000b02100360000000a4031003700000002403100370000a00000005001d000013ce011001c70000000401500039000000240250003900000064015000390000008401500039000000a401500039000000c4045000390000000000150435000013cd01000041000000010300008a000013b502000041000000ff0010008c000000c4021003700000004403300370000000000815034f000000000315034f000000000108c019000000000a19013f000013b301800197000000000c02043b000000000215034f000000000ea10019000013b40a100197000000000115034f00000000001f004b000013b30140019700000020071000390000000b0460006a0000000e017000290000000e03300029000013b307002041000000000725034f0000000e02200029000000000709c019000000000847013f000013b3041001970000000e0250006a000000000141019f000000000141034f000000050000006b000400000003001d000300000001001d00000000040004160000006402000039000000000d0d043b00000000005c004b000000000204c0190000000004a50049000000000421034f000000000e8a013f000013b30a300197000013b308600197000000000306c0190000002007300039000000000631034f0000000d03300029000013b3063001970000004403100370000000840050008c921a4f1b32fb5aa20198c7cd6599abee6182a61bca7ec11ed428b3d22b9d43b2494349454e545f4f4f554e540000000055545055545f414d494349454e545f49554e5400000000004e5055545f414d4f8c23283800000000494349454e545f414d4f554e54000000494349454e545f4c4951554944495459666c6f77000000006d756c2d6f76657264732d6d6174682dc9c6539600000000e6a4390500000000ffffffffffffff60736665723a20747261696c6564000000616e736665722066ffffffffffffff80445f5041544800003a20494e56414c490000ffffffffffff0902f1ac0000000046726f6d3a2074727472616e7366657264000000000000006f6d206661696c65616e736665724672022c0d9f00000000ffffffffffffff5f7fc7c103c00ca494dd8520db7e2c088b06188af794c2fb302020dba91b30cc0066830639b23b7f43d1698b06c2ef3301d7e17535f16c21e9010004df694643e27bfad8045d85a470e500b653ca82273b927e7db2dcc703c0c5d2460186f7233cffffffffffffff9fffffffffffffffa000000001000000007472616374000000206e6f6e2d636f6e2063616c6c20746f416464726573733ae9f48e9a0000000086937eb4000000006f6e20646964206e206f706572617469303a20455243323065640000000000006f742073756363656f77616e636500007a65726f20616c6c20746f206e6f6e2d6e6f6e2d7a65726f76652066726f6d20303a20617070726f6c206661696c65646576656c2063616c303a206c6f772d6cffffffffffffff3f095ea7b300000000dd62ed3e0000000018160ddd0000000070a08231000000004c4c45de0000000042842e0e00000000f242432a0000000006d81bf400000000000000000000000100000004000000809c9340e1000000007a7bb3c60000000057415354000000009a3ee1c80000000014d12aaf2f997fa869bf93ee7948c15302dc9675dd46e6178eb0a36d3e3c933d83020aff00000000f1dd931400000000fff6cae9000000006f3fd4e9aaaf9b065c18d227f08f8ade8bb1ef5e144119411cc03654c8d84a55b40d0368000000004e487b71000000009f1559f749ad183cab42fdb52e42e3c82e748df93827ab24640b72aee190d6acbc34e2e9000000000000002000000000000000e400000000d505accf000000000de0b6b3a7640000ffffffffffffff7f0000006000000000736665724554483a696c6564000000006e7366657220666120455448207472616a62784200000000a9059cbb00000000d0e30db000000000000000840000000043414c5f414444523a204944454e5449455353455300000008c379a00000000044445245535300003a205a45524f5f411010b170000000009f7a0a3f0000000000000040000000000a28d6ad585ab7130ccf097f4b26db3871fb438ebb04cc73b8a6abab51386a30ffffffffffffffdf2e1a7d4d00000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf265800000000000000089afcb4400000000000000640000000023b872dd0000000008cc6b5d955391325d622183e25ac5afcd93958e4c903827796b89b91644bc9800000020000000800000000011c14f640000000002751cec0000000018cbafe500000000152dd62300000000152dd622000000002195995c000000001f00ca740000000038ed1739000000002a672bd6000000002a672bd5000000001f00ca730000000050838b34000000004a25d94a000000007836d2010000000051257b3c0000000051257b3b000000007ff36ab5000000007fce8fed00000000ac72d40c000000009470dbea000000008803dbee000000008803dbed000000007fce8fec000000004a25d94900000000ad615dec00000000ad5c464800000000b5306a5200000000b317533000000000b317532f00000000c2ee3a0800000000baa2abde00000000caced41b00000000c45a015500000000c45a015400000000baa2abdd00000000ded9382a00000000d06ca61f00000000ea326d0a00000000e8e3370000000000e8e336ff00000000f305d71900000000ef94387400000000fccc281300000000fb3bdb4100000000f369fff700000000f369fff600000000ef94387300000000d06ca61e00000000ad5c4647030b4eda00000000ab882de59d99a32eff553aecb10793d015d089f94afb7896310ab089e4439a4c000000c000000100000000020000000000000000ffffffe000000001ffffffe000004dbc0000043200004dba0021042300004db50021042100004db10000613d0000140f011001c700004d9a0000413d000000000161043a000000000606003100000005066002700000000506200210000000040100003900004da20000413d000000050030008c00004d320000013d00004d890000613d00004d780000c13d00004d7c0000013d00004d6c0000c13d0000004001a00210000013700a00804100004d5f0000013d00004d350000013d00004b540000c13d0000000002070019000000010370008c00000000023200d90000000801400029000000040400002900000000055300d900000000064300d900004cf00000613d0000000d0080006b00000000034500a90000271005300089000027100030008c00004d110000413d0000000d0480006b00004d170000013d00004ce40000613d00004ce00000613d00000000028400d90000000e0700002900000000025400d900000000045800a9000000060800002900004d710000613d00004cba0000613d00004ca90000c13d00004cad0000613d0000002006400190000000070a00002900070000000a001d000600000008001d00004cc00000013d00004c910000c13d0000140a04000041000013730340019700004d460000613d00000000080304330000000401a000390000000803200029000b00000006001d0000000f0020006c0000000b0050006c000013fc0060009c000000010600002900004d650000613d00004bf50000613d00004be40000c13d00004be80000613d00004bfb0000013d00004bcc0000c13d00000000061a0436000000000502001900000003075000290000000505300210000000030640002900000005041002100000000f0030006b000f000200200092000c13730010019b00004d010000613d000000010320008c00004b410000c13d0000000205500367000000000446001900004b450000613d0000001f0340018f000800000003001d000000000335043600004d050000813d00004d8f0000a13d000000010030008c0000000043030434000f00000000000200004af10000013d00004b170000613d00004b060000c13d00004b0a0000613d0000498c0000c13d0000000e024000290000000e056000290000000a0040006b00004ace0000413d000000010500002900004aff0000613d00004a2b0000613d00004a1a0000c13d00004a1e0000613d00004a300000013d00004a020000c13d0000000307400029000000030610002900004acc0000813d000c13730020019b00004ac60000613d00004ad00000613d0000497a0000c13d0000497e0000613d0000001f0130018f00000000011404360000000f04000029000f00000005001d0000003f0430003900004ad60000813d00004b1d0000a13d0000000031030434000049530000613d000049420000c13d000049460000613d0000492d0000013d000048f80000613d000000010110003a00000000017200d900000000055700d900000000064700d9000048ef0000613d00000000074500a90000271005600089000048f80000213d000027100060008c000048f80000413d000000000413004b000048fe0000013d000048e30000613d000048df0000613d00000000060c043300000000021400d900000000027400d900000000041700a9000049390000413d000049330000c13d000049330000213d00000001070000290000493b0000613d000048b90000613d000048a80000c13d000048ac0000613d000100000007001d000048c00000013d0000488d0000c13d000049140000613d0000000406c00039000048700000613d0000485f0000c13d000048630000613d000048440000013d0000002b020000390000140c020000410000140b02000041000048010000613d00000000011700d9000048520000613d000000000142001a000048250000413d000000000042001a000027100540011a00000000056400d900002710046000c9000000000407001f000000050440027000000000052700d900000000073200a9000048100000613d00000000045200d900000000041200d900000000021500a90000271005500089000047fe0000613d000000050440008a000048250000213d000048500000413d0000484a0000c13d0000484a0000213d0000000306000029000048580000613d000047cc0000613d000047bb0000c13d000047bf0000613d000047d30000013d000047a00000c13d0000482b0000613d0000000407c0003900000000060200190006000000000002000047670000013d00000000012400d9000047780000c13d00000000033400d9000047720000c13d00000000051400d900000000041300a9000047540000613d00000064027000390000471a0000213d000000000107043300000060037000390000471a0000813d000013f20070009c0000003404700039000000200270003900000060046002100000000003028019000047350000613d00001373006001980000000006024019000047220000613d000013730530019700010000000000020000461c0000013d000046440000013d000046b40000c13d000046a70000613d000046960000c13d0000469a0000613d0000001e02000039000013be020000410000002502000039000013c102000041000013c002000041000046510000613d000046400000c13d000046b90000613d000045ef0000c13d000045f30000613d00000000061304360000000004430019000013de04300197000046000000013d000045da0000c13d000045cd0000c13d000046020000a13d000000000312004b000044810000c13d000046380000613d000045a70000613d000045820000413d000045890000613d000046280000613d000046140000613d000045070000813d000046270000613d000046130000613d000045b50000813d000045af0000613d000044630000413d000000000351034f0000446c0000a13d000000040010006c000046880000613d000046040000c13d000046040000413d000046ad0000613d000044320000613d000044210000c13d000044250000613d0000000b0b000029000b0000000b001d000044380000013d000044090000c13d0000002403b0003900000000020604330000006001600039000013f30060009c00000028010000390000003402600039000000000102a019000046780000613d0000000003014019000046650000613d000000000232034f00000020035000390000460c0000413d000000000152034f0000468e0000613d000043870000013d000043850000613d0000000002064019000600000006001d000500000007001d000043910000613d00000000071604360000465d0000213d000043440000413d0000434d0000a13d0000000804300029000813b40030019b000046060000813d0000465a0000c13d0000000b0010006b000046040000813d000013f10010009c000046570000213d000042e20000013d000042980000013d000042cd0000613d000042bc0000c13d000042c00000613d0000414a0000c13d000042b40000613d000042700000613d0000424b0000413d000042520000613d000041d00000813d000042a30000613d0000428f0000613d0000427e0000813d000042780000613d0000412c0000413d0000000000cb004b0000000003b1034f000041350000a13d0000000000bc004b0000000000c0007c0000000701200029000042800000c13d000042800000413d000041170000613d000040c50000c13d000041060000013d000041060000613d000040db0000c13d000040df0000613d000041040000613d000040ed0000c13d0000000002052019000000600430021000000000030540190000002002300039000000000231034f000042e00000213d000a00000007001d000040280000413d000040310000a13d0000000704300029000713b40030019b000042820000813d000042dd0000213d00003fdf0000613d00003fce0000c13d00003fd20000613d00003e5d0000c13d00003fc60000613d00003f830000613d00003f5e0000413d00003f650000613d00003f920000813d000013f20010009c0000006005100210000900000008001d000000000103401900003ee30000813d000000010550002900003f910000813d000100200030003d00003f8b0000613d000000003202043400003dee0000013d00003e3b0000013d00003de00000013d00003e220000613d00003e110000c13d00003e150000013d00003e040000c13d00003c930000c13d00003e090000613d0000001006000029001000000006001d00003db90000613d00003d940000413d00003d9b0000613d0000000c08000029000c00000008001d000b00000009001d0000000f0210002900003d190000813d000000110550002900000013060000290000000f035000290000000f0330002900003dc70000813d000813730010019b00003dc90000c13d00003c7e0000613d00003c2f0000c13d00003c6d0000013d00003c6d0000613d00003c450000c13d00003c490000613d00003c6b0000613d00003c570000c13d000000010300002900003e390000413d000000020020006c000000130220002900003dc10000013d00003a6e0000c13d00000011024000290000001105600029000c00000006001d0000000c0040006b000000030500002900003dfd0000613d00003b0d0000613d00003afc0000c13d00003b000000613d000000040a00002900040000000a001d000300000005001d00003b120000013d00003ae40000c13d0000000f024000290000000f0610002900003ba90000813d000e13730020019b000000110100002900003a5b0000c13d000000110400002900003a5f0000613d001100000001001d0000001303000029001300000004001d00003dcb0000813d00003e350000a13d00003e320000213d000000130010006c001000000001001d001200000003001d001300000006001d001300000000000200003a110000613d00003a000000c13d000013bd0100004100003a040000013d000039e70000c13d000039da0000613d000039c90000c13d000039cd0000613d000039b70000013d000039f30000013d000013bc010000410000395a0000813d000000030040006c000039f20000413d000000020010006c000039ec0000213d00000000013400d9000000080010006c00000000011400d900000008054000fa00000008041000b90000395f0000a13d000000080500002900000000041400d9000000090050006c00000000053400d900000009054000fa00000009043000b9000000090000006b0000395c0000613d00000000003101a000000000030460190000000a0350014f0000004003b00039000013fc0040009c0000000004050433000013fc0010009c000039e00000613d000039160000613d000039050000c13d000039090000613d000000060b00002900060000000b001d0000391b0000013d000038ec0000c13d00000000051b043600000060035002100000000005028019000039800000613d0000396d0000613d0000000001b10019000039f90000613d0000387d0000613d0000386c0000c13d000038700000613d000000010b00002900010000000b001d000038860000613d00001404020000410000002402b000390000388f0000013d000038470000613d00000000020c0433000039640000a13d000000000bc10019000039c20000613d0000382c0000613d0000381b0000c13d0000381f0000613d000038330000013d000038010000c13d00000000007104350000000401c000390000000000610435000013730650019700000000001c043500001403010000410000396c0000613d000037c20000613d000037a80000c13d000037ac0000613d000037bc0000c13d000037bc0000213d0000378c0000013d0000378b0000613d000037b90000013d000037930000c13d000037820000c13d000037bc0000813d000014020010009c000037700000c13d000037700000a13d000037700000213d000037550000613d000037060000c13d000037440000013d000037440000613d0000371c0000c13d000037200000613d000037560000c13d000037560000213d000037420000613d0000372e0000c13d000000a002600039000037560000813d000014010060009c0000002403600039000000200160003900000044036000390000137301300197000036e90000c13d000036e90000a13d000036e90000213d000036ce0000613d0000367f0000c13d000036bd0000013d000036bd0000613d000036950000c13d000036990000613d000036cf0000c13d000036cf0000213d000036bb0000613d000036a70000c13d00000000030504330000008002500039000036cf0000813d000013fe0050009c0000002403500039000013c5030000410000002001500039000036650000c13d000036650000a13d000036650000213d0000364a0000613d000035fb0000c13d000000000114019f0000006004400210000036390000013d000036390000613d000036110000c13d000036150000613d0000364b0000c13d0000364b0000213d000036370000613d000036230000c13d000000000404043300000080024000390000364b0000813d000013fe0040009c0000dead0500003900000020014000390000004401400039000035dd0000613d000035cc0000c13d0000004002c00210000035d00000013d000035950000c13d000035a50000013d000035ab0000c13d0000352c0000c13d000035610000013d000034570000c13d000035500000613d000000020c00002900020000000c001d00030000000d001d000035440000c13d000035290000613d000035180000c13d0000351c0000613d0000355a0000613d000035020000013d000034eb0000c13d0000359a0000c13d000035c50000613d000034b70000613d000034a60000c13d000034aa0000613d000034bd0000013d0000348d0000c13d0000347d0000613d00020000000d001d000034710000c13d000034540000613d000034430000c13d000034470000613d000035510000613d0000342d0000013d000034160000c13d000035500000813d00000000040b04330000357d0000a13d0000000001b40019000000600410018f0000358e0000613d000033e20000613d000033d10000c13d000033d50000613d000033e80000013d000033b70000c13d000400000009001d0000000404b000390000002404b00039000013e6030000410000339d0000c13d000033180000013d0000004002b00210000013700b0080410000330c0000013d000033760000c13d000033150000013d000033490000613d000033380000c13d0000332b0000c13d000033870000c13d00000000010a001900002f050000c13d000032da0000013d00002e330000c13d000032f80000413d000031900000c13d000033300000613d0000001106000029001100000006001d000032b50000613d000032900000413d000032970000613d0000000b07000029000c00000009001d0000001002100029000032160000813d000f00000004001d0000001205500029000000140600002900000010035000290000001003300029000032c30000813d000913730010019b0000317b0000613d000031570000c13d00000002070000290000315b0000613d00000000013500190000000005130436000031680000013d0000313e0000c13d0000312b0000c13d0000335d0000613d0000001402200029000032bd0000013d00002f6c0000c13d0000001202400029000c00000005001d00000012056000290000000d0040006b000033240000613d0000300b0000613d00002ffa0000c13d00002ffe0000613d000000050a00002900050000000a001d000400000005001d000030100000013d00002fe20000c13d00000010024000290000001006100029000030a70000813d000f13730020019b000200800000003d000300600000003d00002f570000c13d000000120400002900002f5b0000613d001200000001001d0000001403000029000033590000a13d00002f290000613d00002f1d0000c13d00002f020000613d00002ef10000c13d00002ef50000613d000032d30000613d00002edb0000013d00002ec50000c13d0000337b0000c13d000033960000613d00002e920000613d00002e810000c13d00002e850000613d00002e970000013d00002e680000c13d00002e580000613d00002e4c0000c13d00002e300000613d00002e1f0000c13d00002e230000613d000032cb0000613d00002e090000013d00002df30000c13d00002f290000813d000000110020006c000032f00000a13d0000336f0000613d00002dc10000613d00002db00000c13d00002db40000613d00002dc60000013d00002d970000c13d001400000009001d0000004002200039000013730120019700002d760000c13d000000020400003900000060035000390000001305000029000032f20000813d000013f20030009c001300000003001d00002d950000613d001400000000000200002d5e0000c13d000000002402043c000000000242034f00002d620000613d00000000017500190000001f0370018f000000000516043600000060033000390000000005360049000000000508c019000000000a59013f000013b30940019700000000057500490000000507100210000000000142034f0000000204800029000000000974013f000013b304800197000000200480003900002d2c0000c13d000000000c4c0436000000009409043c000000000992034f00002d300000613d0000000006bc00190000001f0ab0018f000000000ca6043600000000004c0435000000400c300039000000000436004900000000040cc01900000000004d004b000000000e4d013f000013b30d9001970000000004b50049000000050ba00210000000000492034f0000000209900029000000000a74013f00002cf60000413d000000010bb000390000000006c604360000137300c0009c000000000c04043b00002cff0000613d000000a006300039000000000094043500000000006b043500000080060000390000008004300039000013b300d0009c00000000004c004b000000000d4c013f000013b30ca0019700000000044500490000000504900210000000020a90002900000000040ac019000000000674013f000013b30710019700000020084000390000000001450049000000000b1304360000000201200360000000000413004900002cb90000c13d000000000a4a0436000000008408043c00002cbd0000613d00000000039a00190000001f0790018f000000000a3b0436000000c006100039000000000a47013f000013b30780019700000000049500490000000509300210000000000382034f00000000083a0019000000000407c019000000000094004b000000000694013f000013b304a001970000002004a0003900002c870000c13d0000000000bf004b000000000f4f043600000000c40c043c000000000cc2034f00002c8b0000613d000000000bef00190000001f0de0018f000000000fdb0436000000a006100039000013b30040009c0000000000f7004b0000000004f7013f000013b307c00197000013b30ff001970000000000fc004b000000000fe50049000000050ed00210000000000dc2034f000000000c3c0019000000000d0fc019000013b30f008041000000000f00001900000000008c004b000013b30d00404100000000009d004b000000000e9d013f000013b30dc00197000000000ca2034f00002c510000413d0000000000ce004b000000010ee00039000000000bfb04360000137300f0009c000000000f0f043b000000000fd2034f00002c5a0000613d00000000000c004b000001000b10003900000000004e0435000000800e100039000000e00b10003900000000060bc01900000000006e004b000000000f6e013f000013b30ed0019700000000006d004b00000000066500490000000506c00210000000200d600039000000000c0b043b000000000b62034f000000000b0dc019000013b30d008041000000000c9b013f000013b30b6001970000000006a2034f000000200a3000390000001f0860008a0000000006350049000000600410003900002d640000813d000013f10050009c000000000532034f0000006006000039000000200510003900020000000000020000004002e00210000013700e00804100002c030000613d00002bf20000c13d00002bc30000c13d00002bd30000013d00002ba70000613d00002b960000c13d00002b8a0000c13d00002b7e0000c13d00002b720000c13d000013ef0100004100002c090000c13d00002a2c0000c13d000000800e00003900002c0c0000013d000000400210021000002b490000613d0000294b0000c13d000500800000003d00002b640000c13d00000000010d04330000000002d1001900002b8f0000613d00002b100000613d00002aff0000c13d00000000090d001900002b030000613d00000000057d0019000000090d00002900090000000d001d00000000020d40190000137000d0009c0000000001d2004900002b170000613d00002ad90000413d0000000002620436000000000607043300002adf0000613d00000000025404360000006405d00039000000000224004900002aca0000413d00000000070a043300002ad00000613d0000004406d00039000000000524004900002abb0000413d000013730770019700000000070c043300002ac20000613d000000a404d000390000008404d000390000000402d0003900000000002d0435000013ee020000410000002402d00039000000010400c0390000004000d0043f00000000001d004b000000000de1001900002b830000613d00002a900000613d00002a7f0000c13d00002a830000613d000000060e00002900060000000e001d00000000020e401900002a980000013d00002a660000c13d0000002401e000390000000401e0003900000000001e0435000013af010000410000000000b104350000004401e00039000000400e00043d00002a550000613d000000020e00002900020000000e001d00002a490000c13d00002b460000613d00002a290000613d00002a180000c13d00000000070e001900002a1c0000613d00000000014e0019000000000e01001900002b3b0000613d00002a000000013d000500010000003d000029e40000c13d0000000000d5043500002bc80000c13d0000000001f2001900002beb0000613d000029ad0000613d0000299c0000c13d000029a00000613d000000050f00002900050000000f001d00000000020f4019000029b70000013d000029830000c13d0000000401f000390000002401f0003900000000001f0435000000400f00043d000029740000613d000029670000c13d00002b330000613d000000020000006b000029480000613d000029370000c13d0000293b0000613d000000000141001900002b270000613d00010000000f001d0000291f0000013d000200010000003d000029030000c13d0000000000d4043500002a550000813d0000000000b2004b0000000001e1001900002bbc0000613d000028d20000613d000028c10000c13d000028c50000613d000000050e00002900050000000e001d00000000010e4019000028dd0000613d0000000402e000390000002402e0003900000000002e0435000013e60200004100002a550000c13d00000000002d004b000000050b00602900000000004201700000000102006039000000050020006b00000000002b004b000000000ef1001900002b770000613d000028810000613d000028700000c13d000028740000613d00000000010f40190000288c0000613d00000000002f0435000013e502000041000000000b0b043300002b5c0000a13d000013ab00f0009c000000000fb1001900002b6b0000613d0000283b0000613d0000282a0000c13d0000282e0000613d000028430000013d000028110000c13d00060000000d001d00070000000c001d00080000000a001d000013730d500197000013e4010000410000137309400197000027fc0000613d00000000013200d9000013cc023000d1000027e60000413d00000001088000390000000003370019000027f50000413d000000000037001a0000000021030434000000000c010019000000000a020019000027d80000c13d000027cb0000613d000027ba0000c13d000027ad0000c13d000027a00000c13d0000002101000039000027d10000613d000027710000613d000027600000c13d000027640000613d000000c003300210000000400440021000001370040000410000000001b10049000027750000013d000027440000c13d0000273b0000013d000027330000413d000000000141043600000000040604330000273a0000613d0000006403b000390000000001120049000027240000413d0000272a0000613d000000000232043600000000030704330000004404b0003900000000031200490000271c0000013d000027120000413d00001373055001970000271a0000613d0000008402b00039000013e301000041000025a60000413d00000000001c004b000000010cc00039000027b20000613d000013e201000041000027a50000013d000026f80000c13d000000c401100039000026900000413d000026970000613d000000c402b00039000013e1010000410000006401b00039000000a0020000390000008401b000390000000401d00029000026b80000613d000027920000213d000000000051043500000060011000390000263c0000413d0000000047040434000026410000813d000000000036004b00000000067400190000000008850019000013b4085001970000003f057000390000000046040434000000000506c019000000000875013f0000001f0540003900000060054000390000004006100039000000010600c0390000004005400039000000010050008c000000000221043600000000520404340000008002100039000000800020008c00000000024300490000000004b200190000000003b30019000027840000a13d000013de02100197000000000151019f00000000014101cf000000000141022f0000000304500210000025e40000613d0000001f05300190000025d30000c13d00000000060b0019000000000501034f000025d70000613d00000000024b00190000000b0e0000290000000c0d000029000027990000613d000c0000000d001d000b0000000e001d000025ce0000013d0000000301000367000025b50000c13d00100000000c001d0000000403b00039000013e003000041000000060ed00029000e0000000a001d000313730010019b000500200020003d000400200030003d000027000000613d000600000005001d00000000510a0434000000000a010019000013de022001970000001f023000390000000002310019000025860000413d000000000624001900000000052100190000258d0000613d00000000430104340000257b0000a13d000000240230037000000004013003700000006401300370000025720000a13d000000830010008c00000064055003700000004404500370000025600000813d000025600000a13d000000830040008c0000252e0000413d000000000654034f000025370000613d00000024055000390000253a0000c13d0000253a0000213d00000000088200190000003f027000390000253a0000813d000013df0060009c000000000224034f000025380000813d0000002302500039000000040140037000000024014003700000000204000367000025380000a13d000000430030008c000000840160037000000064016003700000000005350019000000000446034f0000000404300039000025030000813d0000002304300039000000440360037000000004036003700000002402600370000025030000a13d000000a30010008c0000006404500370000024c90000413d000000000765034f000024d00000613d0000003f038000390000000403600039000000000937013f00000023076000390000004406500370000024970000413d0000000000970435000000000965034f0000249e0000613d000000000029004b0000000009920019000013b4092001970000003f02800039000000000225034f000000000207c019000000000832013f000013b3034001970000002302600039000024620000413d0000246b0000613d0000000007710019000013b4071001970000003f01600039000024db0000813d000024d90000813d0000002301200039000024d90000a13d000000a30040008c000024340000413d00000000015104360000243a0000613d00000000014204360000000001090019000000000801043b000000c401800370000000000701043b000000a4018003700000002405700039000000000558034f000000040570003900000000050ac019000000000b56013f000000230670003900000084068003700000006404800370000023fa0000413d0000000000a60435000000000a48034f000024010000613d000000000aa30019000013b40a300197000000000753013f0000004403800370000023c80000413d000000000738034f000023cf0000613d000000000228034f000000000652013f000013b3051001970000002402800370000023930000413d000000000528034f0000239c0000613d0000000000390435000000000095004b0000000005590019000024280000813d000024260000813d00000004028003700000000208000367000024260000a13d000000e30010008c0000235a0000413d000000000613034f000023630000a13d0000000002150019000023670000c13d000023670000213d000013b4064001970000003f045000390000000505200210000023670000813d000013df0020009c0000233e0000c13d000012820000013d000013d80400004100000000010200190000000a04100029000023370000613d000022f30000613d000022e20000c13d000022e60000613d000022a90000c13d000022ad0000613d0000000b058000290000000408100360000022770000c13d0000227b0000613d0000000b08800029000022420000413d0000224b0000613d0000000b077000290000000b0540006a0000000706100360000021eb0000c13d000021ef0000613d000021c50000c13d000022f70000013d000022cb0000c13d0000000e02100360000021cf0000013d000021ca0000c13d0000216a0000c13d00000000015100190000213e0000c13d000021420000613d0000000d058000290000000a081003600000210c0000c13d000021100000613d0000000d088000290000000b08100360000020d70000413d000020e00000613d0000000d077000290000000d0540006a0000000c061003600000000903100360000020800000c13d000020840000613d00001b270000013d000021bd0000613d000020520000613d000013d501000041000013d702000041000021760000813d0000217c0000613d000000080220006c000021d40000013d0000216f0000c13d000021620000613d00001fe90000613d000300000000001d000c000c0010002d0000000c0010002a00001f8e0000c13d00001f920000613d0000000a0580002900001f5c0000c13d00001f600000613d0000000a08800029000000070810036000001f270000413d00001f300000613d0000000a077000290000000a0540006a00000008061003600000000a03100360000400000000001d000b000b0010002d0000000b0010002a00001ece0000c13d00001ec20000c13d000020690000013d0000205d0000c13d000020930000a13d000000050330006c00001ec70000613d00001e9e0000613d00001e8d0000c13d00001e910000613d00001ea40000613d000000020210002900001ebb0000613d00001e530000613d00001e420000c13d000000020900002900001e460000613d000000020570002900001e260000c13d00001e190000c13d00001e570000013d00001e2b0000c13d00001e1e0000613d0000232a0000013d0000000002520019000000000213004900001dce0000c13d000000002802043c000000000262034f00001dd20000613d000000000652034f0000000e05800029000000090820036000001d9c0000c13d00001da00000613d000000800c100039000000000982034f0000000e088000290000000a0820036000001d670000413d000000000b92034f00001d700000613d000000e007100039000000600a100039000000c007100039000000000872034f0000000e077000290000000e0540006a0000000b0620036000000040030000390000000d0120002900001e120000613d00001d170000613d00001d060000c13d0000000d0900002900001d0a0000613d0000000d0570002900001cea0000c13d00001cdd0000c13d00001cd00000c13d00001cc40000c13d00001cc90000613d00001c940000613d00001c830000c13d00001c870000613d000013d00200004100001c640000c13d00001c980000013d00001c6c0000c13d0000002403400039000000000131034f000000080210036000001c5c0000613d00001c1f0000c13d00001be90000013d00001be90000613d00001c050000c13d00001c090000613d000010340000013d0000232e0000613d00001bf00000c13d00001bd50000613d00001bc40000c13d00001bb80000c13d00001ce20000613d00001b9c0000613d00001b5b0000413d00000bc60000013d00001cd50000613d00001b140000613d00001ad30000413d000013bb011001c700001c170000613d00001a900000613d00001a5b0000c13d000017050000013d000014230000613d000012310000613d00001bbd0000613d00001a380000613d00001a270000c13d00001a2b0000613d00001cbc0000613d00001a020000613d000000640220037000000044032003700000000a0110002900001bb10000613d000019a80000613d000019970000c13d0000199b0000613d000013bb012001c7000019770000c13d000013bc0200004100001a600000813d000000090030006c000013bc030000410000197c0000813d0000195e0000c13d000019520000c13d00001a9b0000013d000013d40400004100000004011003600000191f0000613d000019150000613d0000000a0020006b0007000c002000730008000a00200073000018fa0000413d000019010000a13d00000008080000290000000009830019000018df0000413d00000000008b0435000018e60000a13d000000000c820019000018c30000413d000000000e08043b000018cc0000a13d000000000e810019000013b4081001970000000401500360000400600010009200000000084f013f000000000ea60049000000050a700210000000090480002900000009033000290000000901200029000000090460006a0000182c0000413d000018330000a13d000018120000413d000000000c35034f000018190000a13d0000000809300029000000000cb20019000013b40b2001970000003f02200039000017f50000413d000000000e0b043b000000000b25034f000017fe0000a13d000000000e1b0019000013b40bb001970000003f0bd000390000000000b7004b00000000004e004b000000000f4e013f000013b304b00197000000000ba60049000000000b7a013f000000000885034f000000000e0ac0190000000000a3004b000013b30e0040410000000000ef004b000000000bef013f000013b30f300197000013b30ea00197000000080a60006a0008000500900218000000000935034f000000000a79013f000013b309300197000000000385034f0000002008300039000000000908c01900000000009a004b000000000b9a013f000013b30a200197000000000c08043b00000000044600490000002003400039000000000402a0190000000c020040290000000c0030006b000019700000613d0000174b0000613d0000173a0000c13d00000006090000290000173e0000613d0000000605700029000013bd020000410000196b0000813d0000000a0050006c000013bd03000041000019630000813d0000006406500370000000000305a01900000000040520190000000e0060006b00001be70000013d00001bdb0000c13d00001bec0000a13d0000000a0330006c00001a540000613d000016e50000613d000016d40000c13d000016d80000613d000016eb0000613d000016ae0000c13d000016a10000c13d000016950000c13d00001fbc0000013d00001fbc0000613d00001fb00000c13d0003000900100073000016750000413d0000167c0000a13d00000003087000290000165a0000413d000016610000a13d0000163e0000413d000016470000a13d000000030e60006a00030005008002180000000408500360000400200080003d00000005080000290000000503500360000500200030003d00000007025003600000004402500370000000000603c019000000000203601900000000020600190000137302200198000019570000613d000015910000613d000015800000c13d000015840000613d00001edf0000013d00001edf0000613d00001ed30000c13d0004000900100073000015500000413d000015570000a13d0000000408700029000015350000413d0000153c0000a13d000015190000413d000015220000a13d0000000a04500360000000040e60006a00040005008002180000000a048000290000000508500360000500200080003d000000070800002900000007035003600000000a022000290000000802500360000800200030003d0000000e0040006c0000000e0030006c0000194b0000613d0000146d0000613d0000145c0000c13d000014600000613d000017140000c13d000013b0012001c70000001e04000039000013be04000041000017020000c13d00001a3c0000013d00001a100000c13d0000000a021000290000169a0000613d000013f50000613d000013e40000c13d000013e80000613d000019ac0000013d000019800000c13d0000168e0000613d000013a30000613d000013920000c13d000013960000613d000013750000c13d00001bd60000013d00000060014002100000136c0000613d0000135b0000c13d0000134f0000c13d000013430000c13d000013370000c13d0000132b0000c13d0000174f0000013d000017230000c13d00000008021000290000136e0000613d000012fb0000613d000012ea0000c13d0000000809000029000012ee0000613d0000000805700029000016b30000c13d000013540000613d000012b50000613d000012a40000c13d000012a80000613d000014300000c13d000013480000613d000012690000613d000012580000c13d0000125c0000613d000013c2012001c70000002504000039000013c104000041000013c00400004100000064031000390000141e0000c13d0000133c0000613d0000121e0000613d0000120d0000c13d000012110000613d000015950000013d000015690000c13d000013300000613d000011cd0000613d000011bc0000c13d000011c00000613d000014710000013d000014450000c13d000013240000613d0000117b0000613d0000116a0000c13d0000116e0000613d0000114d0000c13d000011400000c13d000012b90000013d0000128d0000c13d000011380000613d000011110000c13d000011010000c13d000010f50000c13d000010e90000c13d0000126d0000013d000012410000c13d000010fa0000613d000010b90000613d000010a80000c13d000010ac0000613d000012220000013d000011f60000c13d000010ee0000613d000010670000613d000010560000c13d0000105a0000613d000013ca011001c7000010e20000613d0000101f0000613d0000100e0000c13d000010120000613d00001d1b0000013d00001cef0000c13d00001c690000c13d0000004402200370000000640320037000000fa70000413d0000000000a90435000000000a76034f00000fae0000a13d00000f8c0000413d000000000c36034f00000f930000a13d000000000cc20019000013b40c20019700000f700000413d000000000e0e043b000000000e26034f00000f790000a13d000000000ee10019000013b40e10019700000008016003600008006000100092000000000f1e013f000000000416034f0000000907600360000900200070003d0000000007b50049000000000907043b000000000736034f0000000a03600360000a00200030003d000000000703c0190000000003d50049000000000326034f000000000743013f00000000013500490000000b01600360000b00240010003d0000000403100039000010bd0000013d000010900000c13d000020570000013d000020080000c13d000d00010010007400000e830000413d0000000b0040006c0000000c04100360000000000020007c00000104051003700000000002130019000000050120036000000001013000f9000113cc003000d500000e570000413d000000000035001a0000000e05500029000000020320036000020020002000920000000501100360000500200060003d000000080000006b000600000004001d000000e4041003700000000b0050006b000b00000074001d0000002407400039000000000761034f000000c40410037000000e130000413d00000e1a0000613d000e00000008001d0000000008680436000000a40410037000000ddf0000413d00000de60000613d000000840410037000000daa0000413d000013730080009c00000db30000613d000d00000009001d000000640410037000000d770000413d00000d7e0000613d000000000883001900000d460000413d000000000731034f00000d4d0000613d000000000221034f000013b30020009c00000d130000413d000000000064043500000d1c0000613d000013d30200004100000d100000a13d0000000204500367000b00000008001d000016a60000613d00000cd00000613d0000000d0110002900000c8d0000413d000000000451034f00000c960000a13d00000d0d0000c13d0000000e0010006b000000200120008a00000009025000290009000500600218000700000008001d000011d10000013d000011a40000c13d0000002402000039000000a4020000390000000b01100360000000c4031003700000000002230436000000000806001900000000070500194dbc24e10000040f000000140440008a001300000000003d001400000001001d000013cf011001c700000ee20000813d000000a4026003700000106b0000013d0000103e0000c13d0000001a0440008a001900000000003d001a00000003001d00000bae0000013d000000160440008a001500200000003d001600000001001d000013dd01000041000013dc0100004100000ea90000813d4dbc25400000040f4dbc48760000040f000000180440008a001700000000003d001800000005001d0000117f0000013d000011520000c13d0000000a01100360000a00040020003d00000c3d0000c13d000010230000013d00000ff80000c13d000913730020019b000000c40110037000000d040000a13d000001240050008c000000100440008a000f00000000003d00001b2b0000a13d000009900000413d000000120440008a001100000000003d001200000005001d0000138a0020009c00000ba40000613d000013890020009c00000d020000013d000008e30000413d000000000521034f000008ec0000613d000013a20020009c00000b970000613d000013a10020009c00000000011200190000000501300210000d0000000a001d000e00000009001d00000000040a0019000013cc0020009c00000000025100d9000013cc015000d10000088e0000413d0000000101100039000000000056001a000000000663001900000005061002100000000032030434000000000a06001900000000090500190000138f0020009c00000b6a0000613d0000138e0020009c00001aa30000813d000008600000413d000013a70020009c00000b610000613d000013a60020009c0000111b0000013d000011160000c13d000011220000613d000013810020009c00000a450000613d000013800020009c00001c290000013d00001c240000c13d0000000e0000006b00001c300000613d000008760000413d0000000b01100029000007240000413d000000080010006b00000000033200190000000c03100360000c00040020003d000013990020009c00000a3b0000613d000013980020009c0000000003080019000013cc0040009c00000000046300d9000013cc036000d1000006810000413d0000000103300039000000000067001a00000000077400190000000507300210000c00000023001d0000000503800210000006530000413d000000000721034f0000065a0000613d000000000434043600000000044700190000003f04600039000006200000413d000006270000613d00000000003604350000003f06400039000005eb0000413d000005f40000613d0000000007040019000013840020009c000009d90000613d000013830020009c000012ff0000013d000012d20000c13d000900040020003d0000000e0350006a0000139c0020009c000009bd0000613d0000139b0020009c000013cc010000410000138c0020009c00000b120000613d0000138b0020009c000008fa0000213d000013880020009c000013f90000013d000013cc0000c13d000011450000613d000005260000613d000001440110037000000124021003700000000c030060290000010401100370000000e402100370000001640050008c000013a40020009c00000afd0000613d000013a30020009c000008bf0000213d000013a00020009c000013a70000013d0000137a0000c13d0000000a0010006b000011090000613d000004740000613d000001240110037000000104021003700000000d030060290000000b0000006b000000e401100370000001440050008c000013860020009c000009a80000613d000013850020009c000005c90000213d000013820020009c000013d60200004100001ffb0000813d000020010000613d0000000d0210006b000000000503043b000000000604043b00000064043003700000000902300360000000000102043b0000000e02300360000003c00000413d000003c70000a13d0000000a08700029000003a50000413d000003ac0000a13d000003890000413d000003920000a13d000000090150036000090060001000920000000a0e60006a000a000500800218000002f50000413d000002fc0000a13d000b00040060003d0000000b08700029000002d80000413d000002df0000a13d000002bc0000413d000002c50000a13d0000006001e0008a000000000a1f013f000b000500800218000000000415034f0000000007e5034f000000200e700039000000000948013f000000000375034f0000000007d60049000000000c07043b000013b3072001970000000e0160006a000000000135034f000e00040010003d000000a4025003700000000d0250006a0000139e0020009c000009180000613d0000139d0020009c0000055f0000213d0000139a0020009c00001377020000414dbc47450000040f0000004401100370000000640050008c000013910020009c00000af20000613d000013900020009c000008790000213d0000138d0020009c000005520000213d000013870020009c00000ce50000c13d000013a90020009c00000ac50000613d000013a80020009c000007e40000213d000013a50020009c000004a00000213d0000139f0020009c0000dead010000390000137f0020009c00000ac10000613d0000137e0020009c00000bcf0000613d0000137d0020009c000007620000a13d0000137c0020009c000003e20000a13d0000137b0020009c000001df0000a13d0000137a0020009c000001f50000c13d0000137401000041000001200010044300000002010000390000010000100443000001a000200443000001800010044300000160001004430000014000000443000000a00020043f000000e00200043d000000c00100043d000000400050008c00000000013101cf000000000131022f00000000043401cf00000000040204330000018b0000613d0000017a0000c13d000000c0060000390000017e0000613d000000c00240003900001372045001980000001f0350018f000000c00220003900001371022001970000001f0250003900001df50000013d00001df00000c13d00001dfc0000613d0000002401000039000000e90000413d0000000000850435000000000861034f000000f00000a13d00000000076a00190000000007730019000013b407300197000000cf0000413d0000000000b90435000000000b31034f0000000009020019000000d60000a13d00000000073b00190000000100c00190000000010c004039000000000c000039000013b4077001970000003f07b00039000000b30000413d0000000000c7004b0000137300d0009c000000000d71034f000000bd0000a13d00000000007c004b000000000c7d00190000008000c0043f0000008002200039000013cb0020009c000013b4022001970000003f02d000390000000902100360000900600020009200000000002e004b000000000f2e013f000013b30e600197000013b30240019700000020062000390000000d02600029000000000402c019000013b3020080410000000a06100360000a00200060003d000000000806c0190000000006b50049000000000906043b000000000609c019000000000846013f000b00200030003d000000000938013f000013b3036001970000000006d50049000000000c06043b000000000608c019000000000746013f000013b3042001970000001f0240008a0000000c02100360000c00240020003d0000000d0450006a000d00040020003d000013970020009c00000aa70000613d000013960020009c00000bb50000613d000013950020009c000006ad0000a13d000013940020009c000001fd0000a13d000013930020009c000001ca0000a13d000013920020009c000001b70000213d000013790020009c000000e0022002700000019f0000413d0000016d0000c13d000013700030019d000200000001035500030000005103550000137005300197001a00000000000204f210c0001a002710bf10be10bd10bc000410bb03180134031710ba005910b910b810b710b610b510b410b310b210b110b010af10ae10ad10ac000b070e003d00cb0016006f000303e4011a00030316003d070d006102180109000310ab10aa10a910a8027910a710a6070c10a5019500ae01700278006c04f104f010a40024000b070b070a10a300f40003019410a2070910a1019310a0027700be027601c800ae031500f307080026000b00a4109f03e30061070c109e019500ae0170027800ff031401c7109d0024000b070b070a109c00ad00030217109b00710707070607050216006c00b803e200ae03150133109a0076000b03e11099109800f2070704ef001e006800ca031300fe1097009910960036000b1095070403e000a3000304ee07031094109310921091109000fe04ed0195006804ec01920702001d000b0087108f108e027500980003108d108c108b0015108a00b710891088070100031087108602151085070010840003006e04eb01501083108200141081108003df0312107f107e016f0015107d0045031101c6107c0132000303de107b107a1079031002141078007103dd107703dc10760075107503de02130212016f001502110045031101c510740132000301c810730274107200a20191107100f10210107004ea00f001c400fd00a1007c00080067000300df03db00a1007c0008014f0067000300de001c000f00010002000e00dd00dc000a0004003b000806ff01900016006b0119006a001c0066004600c9014e000f00010002000e00650064000a0004003b0059106f007c03da06fe011803d900fc0274030f04e904e8030e04e7008600fd03d8000f00010002000e00650064000a0004003b000806fd006d01c300ac001a0118020f06fc03d7020e0097001c01c200a0014f0046000f00010002000e00850084000a0004003b0008000c00db001403d604e6003f000f006d0044106e030d00070006001000010002000e001306fb106d00da006d106c00d9001d000b106b106a106900b710681067106610651064002002730272031310630026106206fa020d10611060020c0008020b105f105e06f9003f105d003d105c00670003105b00740003030c105a1059105800c9105710561055105410531052014d0070000b006a001c0066004600c9014e000f00010002000e00650064000a0004003b000800a00117006b10510053014d1050104f104e104d104c104b104a1049104810471046000b0108000c000b1045030c04e5014d10441043104210411040103f103e000b0108000c000b014c04e40024103d003a0039016e003800370009103c103b103a1039103810371036000b1035003d00d9001d000b00cb027500fb00161034020a030b103303d500121032000d00010002004300da000910311030102f102e102d000b030a003d00d9001d000b00cb001600ab006f000306f803d4000304e3003d00fb001600aa006f0003102c03d4000304e3003d0309000801160067000300de001c000f00010002000e00dd00dc000a0004003b0008018f102b0016006b01190069102a04e2102900590271102804e106f7102706f601c1008c00fa006b00ff031401c706f500b6000b06f406f3102600f4000301941025006e0193030804e004df006c00b80209008c06f2009902700076000b07091024006102081023001e006c00b800ea007f010700f301310076000b06f1026f030700ad0003021703060071016d030503040303007f03020301006c018e01920300016c000b102210210042019304ef001e006800ca0106005304de009904dd0036000b06f0102003e000a30003101f06ef06ee06ed02ff101e06ec005303d301c1006804ec009904dc000c000b101d06eb016b0098000303d206ea001206e902fe03d103d001c0001503cf004501bf02070206020500030105101c020403ce03cd0203000301be0202006e0201101b026e03cc001403cb0105020001ff00f4001501fe004501fd01c6026d0104000300f9101a01fc03ca026c01bd03c9007101fb1019013001bc01fa007501f900f901bb01ba00ad001501b90045018d01c51018016a0003018c101700f81016018b026b012f00f1026a015001f8101500f001c4004a03c8018f04db0016027106ef04da02fd03c701b800f8006c00b80096007f010700f3013101b70076000b04d906e806e700f40003019404d8002a06e6030806e503c6005303d303c5006c018e009906e4000c000b01b606e30061020801b800f8006c00b800bd007f010700f301310076000b04d7026f030700ad0003021703060071016d030503040303007f03020301006c018e01920300016c000b02fc06e200a2016d03c402fb008c00fa001e0068018a013302fa00b6000b04d602f903c300a300031014101302f803c202ff04d503c1006800ca03c0026903bf009903be0036000b10121011016b0098000303d206ea001206e902fe03d103d001c0001503cf004501bf020702060205000301051010020403ce03cd0203000301be0202006e0201100f026e03cc001403cb0105020001ff00f4001501fe004501fd01c6026d0104000300f9100e01fc03ca026c01bd03c9007101fb100d00e901bc01fa007501f900f901bb01ba00ad001501b90045018d01c5100c016a000300f8100b018b026b012f00f1026a015001f8100a00f001c404d41009011510080067000310070016007400031006100506e1100400c804d3030f01f7014f1003100210010012100001690fff0ffe0ffd0ffc0ffb000b0ffa003d00d9001d000b00cb001600ab0074000300fb001600aa03bd001600f70074000303bc0016026806e002790026003e009f01f60278000b0ff90008016806df0003006a001c006600460086000f00010002000e00650064000a0004003b000800fd006a001c0066004600c9014e000f00010002000e00650064000a0004003b020a012e005503bb00ac06de04d2014f0046000f00010002000e00850084000a06dd0ff80ff70004003b0008000c00db01f506dc06db009e0ff600160ff5000806da00c706d9000d06d800d8000d06d70087000d04d1001904d000a006d6003f04cf0114026706d50113000d000f006d00440ff400b500070006001000010002000e001306d4006d0023001a002700b4001700040ff3008b00350015008b002500de001c000f00010002000e00dd00dc000a0004003b00080ff20119012e005501c300ac01f400d700b304ce0167000504cd00c8000502f7014b003f01b501b701f30ff1007e00180033001f0ff00fef0fee0fed0fec0feb000b0fea003d00d9001d000b00cb001600ab0074000300fb001600aa007400030189001600f703bc001601f20074000306e0001601130fe902790026003e009f01b40278000b0fe8000800fd06df0003006a001c006600460086000f00010002000e00650064000a0004003b00080188005500c800ac06de04d2014f0046000f00010002000e00850084000a06dd04cc0fe70004003b0008000c00db01f506dc06db009e0fe600160fe5000806da00c706d9000d06d800df000d06d700d8000d04d1001904d000a006d6003f04cf011406d306d501f7000d000f006d00440fe4008700070006001000010002000e001306d4006d0023001a002700b4001700040fe3009d00350015009d002500de001c000f00010002000e00dd00dc000a0004003b000804cb011901c2005500c800ac01f400d700b304ce00fc000504cd00a400050266014b003f01b5011601f30fe2007e00180033001f0fe10fe00fdf0fde0fdd0fdc000b0108000c000b0fdb030c04e5014d0fda0fd90fd8000b04ca003d00d9001d000b00cb0016006f000303e4011a00030316003d06d20061021800bc00030fd7011a00030316003d06d1006101660109000303ba06d0001600f70074000300550fd606cf000801150067000300de001c000f00010002000e00dd00dc000a0004003b000804c901900016006b0119006a001c006600460086000f00010002000e00650064000a0004003b00080265007300e900ac01f400d700b302f60190001603b90047011700950165004703b8014b003f01b5014f01f30fd5007e00180033001f0fd40fd30fd20fd1000b030a003d00cb0016006f0003014a00d602640fd001b301f1014900d5001504c804c703b704c60015014804c5014704c402f500d606ce000300360fcf070400a90098000300f104c3006e00c60fce00fb0016006f0003014a00d60068018a02f4002600ae017003b604c20024000b01b301f1006100bc001502630fcd03b704c106cd06cc021004c004bf00e8001504be00450148014706cb0fcc06ca0187000300260fcb014606c900f2007103b5006e00960fca01890016006f0003014a00d60068018a02f4002600ae017003b604c20024000b01b301f1006100bc001504bd0fc906c804c10fc804bc014504c004bf00d5001504be00450148013401860fc704bb0112000300260fc600c80fc50042007103b4006e06c70fc402f30016006f0003014a00d600ae03b302f40026008c00fa03b604ba00b6000b01b301f10061026200bc000301480fc30fc206c6000306c5006101f60109000300c803b2007000be06c400be00ae0fc10fc006c30fbf014406cd0fbe00d60fbd002400be06c40fbc0fbb0fba04b904b804b703b104b60fb901b406c2016804cc011100b204b5007c016b0098000304ea005500c800f003e101b200c9001400ab026100a102f20fb80fb70fb6000b070e003d00cb001600ab00fb0016006f0003014a00d602640fb50fb40061016600bc000303c8004a03b001b401f20fb300d6000301890016011300740003026004b4000800fd00de001c000f00010002000e00dd00dc000a0004003b00080fb2011902f1025f00b202fc00fd007c0008011600670003006a001c0066004600c9014e000f00010002000e00650064000a0004003b000800a004b304b2006a001c006600460086000f00010002000e00650064000a0004003b00080188008b00ef04b1007506c10103003e008a00350015000400450025007b00f602f002ef0003009e016404d302ee00d401100003006e010200c502ed0fb100d901c204b00143025e0185000c0111010f0fb0001106c00faf01180011010e0097001c00b20046000f00010002000e00850084000a0004003b0008000c00db001403d603d8003f000f007300440fae01b100070006001000010002000e00130fad0fac00da00730fab0faa0fa90fa8000b030a003d00cb001600ab0074000303bd001600aa0074000303bc001600f700fb001602680189001601f204b40008016800de001c000f00010002000e00dd00dc000a0004003b000804b30119006a001c0066004600c9014e000f00010002000e00650064000a0004003b005906fe006900f700e904af02ec030f04e904e8030e04e7008601430268000f00010002000e00650064000a0004003b0008005500a400ac001a0117006903af0163020e0097001c00b200a0010e0046000f00010002000e00850084000a0004003b0008000c00db001403d600f7003f000f005500440fa7007300070006001000010002000e001304cc0fa600da00550fa50fa40fa30fa2000b04ae003d00d9001d000b00fb001600aa00cb001600ab01890016006f0003014a00d6026403ba03e3006101b000bc0003014800a404ad011301b402f500d6000302f3001601f70074000303bb03090008014f00de001c000f00010002000e00dd00dc000a0004003b000802eb011903ae0111008704d9007c0008014f00670003006a001c0066004600c9014e000f00010002000e00650064000a0004003b000800a002eb04b2006a001c006600460086000f00010002000e00650064000a0004003b00080265009d00ef06bf007506be0103003e008a0035001500040045002500b200f603ad02ef0003009e016403ac02ee00d401100003006e010200c502ed0fa1012d005504b0010e025e03ab000c0111010f03aa001106bd0fa0001204ac01690f9f0f9e0f9d000b0108000c000b014c04e4011601f20f9c0f9b06bc01b40f9a001d005306bb005300bb0f990f9801af0f97014406ba0f9600540f950070005306bb0f940f930f9204b904ab04aa014206b90f9106b80f900f8f06b700c800550026011100fd0f8e0f8d04b5007c016b0098000300b200b500e900f002ec01b200c9001400ab0261012e02f20f8c0f8b0f8a000b04ae003d00d9001d000b01890016006f0003014a00d6026401b301f1014900d5001504c804c703b704c60015014804c5014704c402f500d6000300360f8903180f8800d40110000300c50081006e00c60f8702f304a90110000300cb06b600fb0016030903da025d06b506b40f860f850f840f83000b0108000c000b014c06b306b20f820f81010e00aa01b002f7025c025b01840f80018302ea02e903a90069004a00a4016303a803d504ae003d00d9001d000b00fb001600aa00cb001600ab01890016006f0003014a00d6026403ba03e3006101b000bc0003014800a404ad011301b402f500d6000302f3001601f70074000303bb03090008014f00de001c000f00010002000e00dd00dc000a0004003b000802eb011903ae0111008704d9007c0008014f00670003006a001c0066004600c9014e000f00010002000e00650064000a0004003b000800a002eb04b2006a001c006600460086000f00010002000e00650064000a0004003b00080265009d00ef06bf007506be0103003e008a0035001500040045002500b200f603ad02ef0003009e016403ac02ee00d401100003006e010200c502ed0f7f012d005503a703a6025e00ab000c025f0069001106bd0f7e001204a801690108000c000b014c06b1030e04a70f7d010e00aa025c025b01840f7c018302ea02e9005500c804b003a50f7b003d00d9001d000b00cb0016006f0003014a00d6026401b301f1014900d5001504c804c703b704c60f7a003a0039009c00380037000906b0003d00d9001d000b00cb001600ab0074000300fb001600aa007400030f79000801160067000300de001c000f00010002000e00dd00dc000a0004003b0059009e06af0061027801190189027902f3027503bd04a904b803da0069004a030f04e904e8030e04e7008601430268000f00010002000e00650064000a0004003b00730f780008005500c800ac001a01b0011700690163020e007b011700a404d3020e04a60014003f00ab00e700d8000d000f00a4016406ae0f77007e00180033001f0f76014c04e400240f75003a0039010d00380037000906b0003d00d9001d000b00cb0016006f000303e4011a00030316003d06d2006102180109000306d1006101660109000306af0149003603a406ad01ae00a8000b0f740f73000801430067000300de001c000f00010002000e00dd00dc000a0004003b000804c901900016006b0119006a001c006600460086000f00010002000e00650064000a0004003b0008018800b5014600ac01f400d700b302f60190001603b90047011700950165004704a5014b003f01b500fd01f30f72007e00180033001f0f710108000c000b014c06b306b20f700f6f010e00aa01b002f7025c025b01840f6e018302ea02e903a90069004a00a401630f6d03d5014c0f6c06c203a5030a003d00d9001d000b00cb001600ab0074000303bd001600aa0074000303bc001600f700fb001601f201890016026804b40008016800de001c000f00010002000e00dd00dc000a0004003b000804b30f6b0f6a030c0f6900090108000c000b00660f680f67025c025b01840f660f650108000c000b014c06b1030e0f640f63010e00aa025c025b01840f62018302ea02e9005500c803a703a504ca003d00d9001d000b00cb001600ab0074000300fb001600aa0074000304b8000801160067000300de001c000f00010002000e00dd00dc000a0004003b000804c901900016006b0119006a001c006600460086000f00010002000e00650064000a0004003b0008005500c800ac01f400d700b302f60190001603b90047011700950165004702f7014b003f01b5011501f30f61007e00180033001f0f600108000c000b014c06ac025a04ab01b203d5030a003d00d9001d000b00cb001600ab006f000306f803d4000304e3003d00fb001600aa007400030309000801160067000300de001c000f00010002000e00dd00dc000a0004003b000806ab0f5f0016006b0f5e001203a301690108000c000b014c06ac01c40014003f0007000602e80f5d014d0108000c000b00660f5c0f5b025c025b01840f5a018302ea02e900a0030c04e5014d0108000c000b014c0f590f580f5704ab06ce06b806b7012c007502180f5606aa005502590001000200290007000600100013014d04ca003d00d9001d000b00cb0016006f000303e4011a00030316003d06c500610218010900030f550149003603a406ad03a200a8000b03ba0f540008011600670003006a001c0066004600c9014e000f00010002000e00650064000a0004003b0008011500de001c000f00010002000e00dd00dc000a0004003b00080f5301900016006b0119006a001c006600460086000f00010002000e00650064000a0004003b00080188007300e900ac01f400d700b30f520190001603b90047011700950165004704a5014b003f01b500fd01f30f51007e00180033001f0f5001f600f701b70f4f03b804a402e70f4e0f4d0f4c007c0008010e0067000303ab03a1006a001c0066004600c9014e000f00010002000e00650064000a0004003b000800a00f4b0f4a012d007c016b0098000300f0007b0073013001c401b7012d007c000800670003004a03db009d0035001500a100ef04b1007506c10103003e008a00350015000400450025009d00f606a902ef06a8000301120f49009e01640f4800a900980003006e012b019102e60f47007b00df03b104a302f004a201b70011000c0111010f0f46001101160097001c00690046000f00010002000e00850084000a0004003b0008000c00db00140258003f01f200e70073000d000f005500440f4500b500070006001000010002000e0013009b00550023001a002700b4001700040f44008b00350015008b0025007b0011000c01110257007b04a1018201c202e5001400ab00c90261007b02f202e70f4304a003a2049f0f4200a90098000300f001c403a00069007c000800670003011303db039f0069008706a7001a00a1004a03b101f003e104a203a5014804c5014704c402f500d60f410053000900120f40016900360f3f031806c900f2049e000300c50f3e006e00c60f3d00fb027900bc000306a602e40068018a049d001d00ae01700f3c04c20024000b06a50f3b027500d5001506a406a306a2001403df031206a106a0016f0015069f0045049c0311012b049b0112000300360f3a02e30f39004200c5049a007103e20f38070d014900d50003069e00d600ae03b302f40026008c00fa03b604ba00b6000b016501f1049900e8001501ad069d069c00750f3702770213021200a300150211004502e201ac03b502e10132000300240f36018b039e00a200f1039d00c501450f350f3400a900d50003039c0112008c025602550024006c00b801ef02700076000b039b01ab00f200e8001501ad04980497039a04960f3304950213021200a300150211004502e201ac069b069a02e10132000300240f32018c039e00a20f31000300f1039d00c501450f300f2f00a900d50003039c0112008c025602550024006c00b801ef02700076000b039b01ab00f200e8001501ad04980497039a0496069904950213021200a300150211004502e201ac0494069a02e10132000300240f2e0698039e00a200f1039d00c501450f2d0f2c00a900d50003039c0112008c025602550024006c00b801ef02700076000b039b01ab00f200e8001501ad04980497039a0496039904950213021200a300150211004502e201ac06970f2b0f2a02e10132000300240f2902ec039e00a200f1039d00c501450f280f2700a900d50003039c0112008c025602550024006c00b801ef02700076000b039b0f2600420696016f00030f2503d7018304a006950f240f2300030f2200a90f21009800030f20025f0f1f0f1e016b0098000304ea00f001c400b50f1d02540f1c03a6069406fd0067000300a10011000c06930692006800be06910f1b00b10f1a01440690039802e00f190026069306920f180f17068f04b90f16000800670003016203db011800ef04b100750f1500c6010c012a009e0f14068e006f00150141004500b700df004700b50f13000301640f1200a900980003006e012b049300c501ae0f110f100129049203b104a304a2010e01810161007b0087016700f003ad01b200690011000c0111010f03aa00110f0f01440f0e001201b70f0d006a001c0066004600c9014e000f00010002000e00650064000a0004003b000800fd006a001c006600460086000f00010002000e00650064000a0004003b0008005500fc00ac01f400d700b3011700950165004704cd0130000501ae014b003f01b5014301f30f0c007e00180033001f0f0b00690f0a0f090f080059049102180f0704e106f704900f0600bd00be0276006b006c04f104f0068d0026000b06f40f05048f00f4000301940f04006e048e03c701b800f8008c00fa00c600be048d00f30f0300b6000b01300f020f010061048e06f601c1008c00fa00ea00ff031401c706f500b6000b06f10f000eff00ad000302170efe00710193070607050216006c00b803dd008c06f2013302700076000b068c0efd0efc0042019304ef001e006800ca0106005304de009904dd0036000b06f00efb03e000a3000304ee070306ee06ed068b0efa02fe005303d301c1006804ec019204dc000c000b00a10ef90ef8016b0098000303d20ef700120ef602fe03d103d001c0001503cf004501bf020702060701000301050ef502040ef40ef30203000301be0202006e02010ef2026e0ef100140ef00105020001ff00f4001501fe004501fd01c6026d0058000300f90eef01fc0eee048c01bd048b007101fb0eed03dc01fa007501f900f901bb01ba00ad001501b90045018d01c5048a00ee000300f000f80eec01400eeb026c02140eea015001f80ee901c40254068a014f0694006700030ee804990ee70275004a01aa0274030f03d902eb0ee6012e007c0008026500670003006a001c006600460086000f00010002000e00650064000a0004003b000801b100c800ac0265012e007c00080067000301b101aa01800117007b017f0689020e04a6007500f600b201140166039700f7000d000f01b100440ee5007e00180033001f0ee40146007d009a00c400010002000e0094009b0023001a0027003200180033001f005a008004890ee3005f04880041005100580ee200240ee1005e0050004f005d005c0042004e004d005b004c003c0060001700040ee00052017e06880054003e008a003500150004004500250018003d0055004902df0047002a00e9000500b5000d0001000200430edf014d008b000100e6017d0010007d009a01ee0013008300870023001a0027003200180033001f005a008006870ede005f04870041005100580edd00240edc005e0050004f005d005c0042004e004d005b004c003c0060001700040edb005200ba0686006b013f013e0113006f0015013d004500a100250018003d008b0011000c003e009f0054000b01ed00d801a9014300e70073000d000f008700440eda00b000e5001f0ed900b2000100e6017d0010007d009a01ee0013008300b50023001a0027003200180033001f005a008006850ed8005f04860041005100580ed700240ed6005e0050004f005d005c0042004e004d005b004c003c0060001700040ed5005200ba0684006b013f013e0185006f0015013d0045011800250018003d00b20011000c003e009f0054000b01ed006d01a9011600e7020f000d000f00b500440ed400b000e5001f0ed3003100300014002e00790020002800220021001e0ed2007a003100300014002e00790020002800220021001e0ed1007a003100300014002e00790020002800220021001e0ed0007a0012068301690032003100300014002e00790020002800220021001e0ecf007a0396017c00e9039500bb00230017001a002700b400040ece00b20035001500a4003406820087000d068100f6039700d8000d000f005500440ecd01ec01a8004802530ecc0032003100300014002e00790020002800220021001e0ecb007a0032003100300014002e00790020002800220021001e0eca007a00a1000100e6017d0010007d009a01ee0013008300df0023001a0027003200180033001f005a008003940ec9005f00e40041005100580ec800240ec7005e0050004f005d005c0042004e004d005b004c003c0060001700040ec6005200ba0680006b013f013e0185006f0015013d0045011800250018003d00a10011000c003e009f0054000b01ed006d01a9016800e7020f000d000f00df00440ec500b000e5001f0ec400a1000100e6017d0010007d009a01ee0013008300df0023001a0027003200180033001f005a008003940ec3005f00e40041005100580ec200240ec1005e0050004f005d005c0042004e004d005b004c003c0060001700040ec0005200ba0680006b013f013e0185006f0015013d0045011800250018003d00a10011000c003e009f0054000b01ed006d01a9016800e7020f000d000f00df00440ebf00b000e5001f0ebe00d800070006001000010002000e0013009b00870023001a0027003200b000e5001f005a01a703940ebd005f00e40041005100580ebc00240ebb005e0050004f005d005c0042004e004d005b004c003c0060001700040eba005201a6067f00350015002500b0003d000100e6017d00100186067e0eb90eb80eb7002d067d0eb6002d04e20eb5002d067c0019067b004800190eb40009006d00070006001000010002000e0013009b00b50023001a0027003200b000e5001f005a01a703930eb3005f03920041005100580eb200240eb1005e0050004f005d005c0042004e004d005b004c003c0060001700040eb0005201a6039100350015002500b0003d00df067a01f606790eaf0082016000050057015f0005006301280005004b000d00720048000500010002004300a70009007300070006001000010002000e0013012700550023001a0027039001a800480253038f038e06850eae005f04860041005100580ead00240eac005e0050004f005d005c0042004e004d005b004c003c038d001700040eab013c00ba068400ab006f0015005500b701a8003d00730049001d01a5067802e4000b001d0eaa003a00390485003800370009012e000100e6017d0010007d009a01ee00130083006d0023001a0027003200180033001f005a00800ea90ea8005f0ea70041005100580ea600240ea5005e0050004f005d005c0042004e004d005b004c003c0060001700040ea4005200ba0ea3006b013f013e03d9006f0015013d004501c200250018003d012e0011000c003e009f0054000b01ed017b01a900fd00e7020f000d000f006d00440ea200b000e5001f0ea1003100300014002e00790020002800220021001e0ea0007a003100300014002e00790020002800220021001e0e9f007a003100300014002e00790020002800220021001e0e9e007a003100300014002e00790020002800220021001e0e9d007a038c038b0014038a0389002000280022002102770e9c00700e9b00c300d3048400d200d1000800d000cf00ce00cd00f60e9a0e99003100300014002e00790020002800220021001e0e98007a008b000100e6017d0010007d009a01ee00130083004a0023001a0027003200180033001f005a008006870e97005f04870041005100580e9600240e95005e0050004f005d005c0042004e004d005b004c003c0060001700040e94005200ba0686006b013f013e0268006f0015013d0045009d00250018003d008b0011000c003e009f0054000b01ed008701a9014300e7020f000d000f004a00440e9300b000e5001f0e92009d000100e6017d0010007d009a01ee0013008300730023001a0027003200180033001f005a008004830e91005f03880041005100580e9000240e8f005e0050004f005d005c0042004e004d005b004c003c0060001700040e8e005200ba0e8d006b013f013e0113006f0015013d004500a100250018003d009d0011000c003e009f0054000b01ed00d801a9011500e700b5000d000f007300440e8c00b000e5001f0e8b0186015e038700260e8a067d0e89002d04e20e88002d067c0019067b004800190e87000900fc0387038602520e860057015d00050063015c0005004b000d00720048000500010002004300830009006d00070006001000010002000e0013009b00df0023001a0027003200b000e5001f005a01a703930e85005f03920041005100580e8400240e83005e0050004f005d005c0042004e004d005b004c003c0060001700040e82005201a6039100350015002500b0003d01300e810385013000550251001d0384006d00490167048401630e800677048201f60676018f04810016048003130383067500160674038200e90e7f0e7e001602710673067202fd0490067103dd00be0276009600ff031401c706700026000b0e7d066f048f00f400030194066e006e0208030804e004df006c00b800c600be048d0099066d0076000b00fc066c0e7c0061020801b800f8006c00b800bd007f010700f301310076000b066b026f030700ad0003021703060071016d030503040303007f03020301006c018e01920300016c000b0e7b0e7a0e7900a2016d03c402fb008c00fa001e0068018a013302fa00b6000b0e7802f903c300a300030e770e7602f803c202ff04d503c1006800ca03c0026903bf009903be0036000b0e7500a900980003066a0669066801c0001501bf020702060205000301050e74020403ce03cd0203000301be0202006e02010e73026e03cc001403cb0105020001ff00f4001501fe004501fd01c6026d0104000300f90e7201fc03ca026c01bd03c9007101fb0e7102de01bc01fa007501f900f901bb01ba00ad001501b90045018d01c50e70016a000300f80e6f018b026b012f00f1026a015001f80e6e00f0018c01b20e6d014403ae0e6c04cb0e6b009d007c000800670003004a02de01800e6a006d00070006001000010002000e0013009b00df0023001a0027003200b000e5001f005a01a703930e69005f03920041005100580e6800240e67005e0050004f005d005c0042004e004d005b004c003c0060001700040e66005201a6039100350015002500b0003d0087009501f702dd038500a4008702510e65038401aa0484016700a602dd0e640e6300f70e62018f0e6100160480031303830481001602dd03820130066c0e60001602710673067202fd0490067103dd00be0276009600ff031401c706700026000b0667066f048f00f400030194066e006e0208030804e004df006c00b800c600be048d0099066d0076000b01aa0e5f0e5e0061020801b800f8006c00b800bd007f010700f301310076000b04d7026f030700ad0003021703060071016d030503040303007f03020301006c018e01920300016c000b0e5d0e5c0e5b00a2016d03c402fb008c00fa001e0068018a013302fa00b6000b04d602f903c300a300030e5a0e5902f803c202ff04d503c1006800ca03c0026903bf009903be0036000b066600a900980003066a0669066801c0001501bf020702060205000301050e58020403ce03cd0203000301be0202006e02010e57026e03cc001403cb0105020001ff00f4001501fe004501fd01c6026d0104000300f90e5601fc03ca026c01bd03c9007101fb0e55025001bc01fa007501f900f901bb01ba00ad001501b90045018d01c50e54016a000300f80e53018b026b012f00f1026a015001f80e5200f006cb01b20e51014402f10e5004cb0e4f008b007c0008006700030055025001800e4e003100300014002e00790020002800220021001e0e4d007a003100300014002e00790020002800220021001e0e4c007a0032003100300014002e00790020002800220021001e0e4b007a06650664024f0663047f0102002c038103170e4a006900010002004300070006002b001b009b00d80023001a0027039001a800480253038f038e04890e49005f04880041005100580e4800240e47005e0050004f005d005c0042004e004d005b004c003c038d001700040e46013c00ba03aa0035001500250018003d0055004900ab06620e450e4403800015002a00b702dc000f004a00440e4300e30e42016703b2013000a6018c0e4103860e400e3f018f0e3e00f203e20e3d0e3c001906610009006d047e007300490660025202db065f01b0065e065d0e3b0e3a0e390169017b00070006001000010002000e0013009b006d0023001a0027003200b000e5001f005a01a70e380e37005f0e360041005100580e3500240e34005e0050004f005d005c0042004e004d005b004c003c0060001700040e33005201a6065c00350015002500b0003d00e90e32038500e901640e31001d0384017b004900fc065b065a06c6015e048201b00e30018f048100160266037f03830675001602dd038201630e2f04db001602710e2e04da02fd03c701b800f8006c00b80096007f010700f301310076000b066706590e2d00f40003019404d8006e015b0e2c0e2b0e2a00ff024e03c5006c018e01a40e290126000b0e280e2700610e260e2502da00ff024e00bd0101024d009902d90126000b04d70e24012f00ad00030e230e2200710e210e200e1f0e1e02690e1d0e1c007f02d801a40e1b0658000b01eb0e1a00a2016d0e1902fb008c00fa001e0068018a01a402fa00b6000b04d602f903c300a3000304ee0e1802f80e17068b0e160e15006800ca0e1401010657019206560036000b066600a9009800030e130e120e1101c0001501bf020702060205000301050e1002040e0f0e0e0203000301be0202006e02010e0d00df0e0c0e0b00140e0a0105020001ff00f4001501fe004501fd01c60e090104000300f90e0801fc0e07048c01bd048b007101fb0e0603dc01fa007501f900f901bb01ba00ad001501b90045018d01c5048a016a000300f80e05018b026b012f00f1026a015001f80e0400f0018c01b2005503c8018f04db001602710e0304da02fd03c701b800f8006c00b80096007f010700f30131010e0076000b0e0206e806e700f40003019404d8002a06e6030806e503c6005303d303c5006c018e009906e4000c000b01b606e30061020801b800f8006c00b800bd007f010700f301310076000b0e01026f030700ad0003021703060071016d030503040303007f03020301006c018e01920300016c000b02fc06e200a2016d03c402fb008c00fa001e0068018a013302fa00b6000b0e0002f900420696016f0003024c0dff0dfe02f803c202ff0dfd03c1006800ca03c0026903bf01c703be0036000b0dfc0dfb016b0098000303d20dfa00120df902fe03d103d001c0001503cf004501bf020702060205000301050df8020406590df70203000301be0202006e02010df6026e065500140df50105020001ff00f4001501fe004501fd01c6026d0104000300f90df401fc026f00a201bd0df3007101fb0df203dc069c00750df100f901bb01ba00ad001501b90045018d0df001c5048a016a000300f80def018b026b012f00f1026a015001f80dee00f0018c01b2018800550ded0144017b0dec014400550deb0dea008b007c00080067000300df037e017b02dd0de900a1007c000800670003006d037e009e06d00016007400030de8020a01090003012d00ac03a00012010e013003ac0654005502590001000200290007000600100013002c00070006002b0013004a0653002f024b024a0de70023000400db0012002a01aa0de6003100300014002e00790020002800220021001e0de5007a003100300014002e00790020002800220021001e0de4007a065200d401870de30de200190661000900a40de10de00ddf0169003100300014002e00790020002800220021001e0dde007a0651017a0ddd014d008700070006001000010002000e0013009b004a0023001a0027003200b000e5001f005a01a704830ddc005f03880041005100580ddb00240dda005e0050004f005d005c0042004e004d005b004c003c0060001700040dd9005201a60dd800350015002500b0003d017b067a01660679038501c303870386025203840087047e00b500490660025202db065f01f6065e02540dd7006106d3010b03830dd60016067403820069007300e901800097001c007b0046000f00010002000e00850084000a0004003b0008000c00db00140258003f00ab00e700b5000d000f004a00440dd5005500070006001000010002000e0013009b004a0023001a002700b4001700040dd40069003500150069002500b200b502e50012002a013000050087047d00d800070006001000010002000e0013009b00730023001a0027003200b000e5001f005a01a703940dd3005f00e40041005100580dd200240dd1005e0050004f005d005c0042004e004d005b004c003c0060001700040dd0005201a6067f00350015002500b0003d000100e6017d00100186067e0dcf0186015e038700260dce016703b200e90dcd038c038b0014038a0389002000280022002102770dcc047c0069004a00fc01800097001c008b0046000f00010002000e00850084000a0004003b0008000c00db00140258003f00ab00e70073000d000f00b500440dcb005500070006001000010002000e0013009b00b50023001a002700b4001700040dca00690035001500690025007b007302e50012002a00a4000500df000d0001000200430dc9014d008b002a009e0650006101660109000300a4037d047b006e047a020a01090003012d004a00ac001a00690011000c025f012901a30117007b020e0014064f005403a4064e00350015064d0045002500b2003f064c064b00030479009e02e30381025a064a00d40110000300c5008106490191037c0dc80069047800690011000c0111010f03aa001101b70097001c01180046000f00010002000e00850084000a0004003b0008000c00db00140258003f00f700e7004a000d000f006d00440dc7007300070006001000010002000e0013009b006d0023001a002700b4001700040dc600b20035001500b2002500690011000c01110257006904a10182012e02e5001400aa00c90261006906aa004a0dc5008b002a009e0650006101660109000300a4037d047b006e047a020a01090003012d004a00ac001a01290011000c025f006901a30117007b020e0014064f005403a4064e00350015064d0045002500b2003f064c064b00030479009e02e30381025a064a00d40110000300c5008106490191037c0dc40129047801290011000c0111010f06480011010e0097001c01180046000f00010002000e00850084000a0004003b0008000c00db00140258003f00aa00e70055000d000f006d00440dc3004a00070006001000010002000e0013009b006d0023001a002700b4001700040dc2007b00350015007b002501290011000c01110257012904a10182012e02e5001400ab00c90261012902f2003100300014002e00790020002800220021001e0dc1007a003100300014002e00790020002800220021001e0dc000700dbf00c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b000900010002000e002f017c018600bb0023001700e100e001ea00360dbe001200040dbd0089014600050dbc064702d701bc064600750645010b015a017901a2001501780045024906440643064202d601250dbb02d50273027201e90dba00360db901a10248012401e801e7006101e602470246012300190db80032003100300014002e00790020002800220021001e0db7007a0396017c0146049300bb00230017001a002700b400040db6012d00350015012d0025009e0db500160074000300c8037d047b00fc00710db4020a0109000301c200ac00b50049001d025f006d004900d70db30047047700b3064104ce003f000f007300440db2007e00180033001f0db10032003100300014002e00790020002800220021001e0db0007a00120daf0169005500070006001000010002000e0013012700730023001a0027003200180033001f005a008004890dae005f04880041005100580dad00240dac005e0050004f005d005c0042004e004d005b004c003c0060001700040dab0052017e06880054003e008a003500150004004500250018003d00690011000c003e009f0054000b000c0640039f009d004a06a703a0008b01670478001400ab00c90261008b02f20032003100300014002e00790020002800220021001e0daa007a003100300014002e00790020002800220021001e0da9007a0032003100300014002e00790020002800220021001e0da8007a0032003100300014002e00790020002800220021001e0da7007a004a00070006001000010002000e0013009b01b10023001a0027003200180033001f005a00800da60da5005f0da40041005100580da300240da2005e0050004f005d005c0042004e004d005b004c003c0060001700040da10052017e0da00054003e008a003500150004004500250018003d004a004900aa002a0d9f000501b1000d0254068a01490098000302df002d0d9e02450d9d037b02d40193037a0379016a006c00b80132007f010700f301310076000b0d9c0d9b00a200a30003037802d3037702da007f02d802d20376037501a0008c00fa02d1037400b6000b0d9a0d990373063f03720d9800760d97007f0d9603100371000303700214036f02160d950d9400a2015b019f010400ff024e00ee0101024d009902d90126000b0d930d92012f00ad000301eb036e036d036c024402d0036b036a03690368010102cf013303670243000b03660d910365036403630362016c0d90063e0041036101a00d8f01260d8e00a2015b019f010400ae017000ee00bb03600099035f0024000b0d8d0d8c035e00a30003063d063c063b019500ff035d01e5063a035c02ce006800ca01a4035b0036000b035a01e400780359063900700d8b0d8a063803580d89013b01c80d8800360d870d860007000601e3000100020043001b002c00070006002b001b002f024b024a063701f00023000400db0012008900c80005002a01c30d850396017c017f035700bb00230017001a002700b400040d8401770035001506360034068201b1000d068100f603970162000d000f006d00440d8301ec01a8004802530d82003100300014002e00790020002800220021001e0d81007a0032003100300014002e00790020002800220021001e0d80007a030d00070006001000010002000e00130127006d0023001a0027039001a800480253038f038e0d7f0d7e005f0d7d0041005100580d7c00240d7b005e0050004f005d005c0042004e004d005b004c003c038d001700040d7a013c00ba0d790185006f0015006d00b701a8003d030d0049001d01a5067802e4000b001d064000550653066502f002cd063504760102002c047503170d78011800010002004300070006002b001b009b01620023001a0027039001a800480253038f038e03930d77005f03920041005100580d7600240d75005e0050004f005d005c0042004e004d005b004c003c038d001700040d74013c00ba03910035001500250018003d006d0049018506620d730d7203800015002a00b702dc000f005500440d7100e30d70038c038b0014038a0389002000280022002102770d6f047c038c038b0014038a0389002000280022002102770d6e047c009d007c000800670003005502de06340d6d01440d6c0d6b0069004a01300180009d007c00590074000301c2014600ac06330014047400e5002d003f009e0d6a0149009800030473002d0d6902450d68037b02d40193037a0379016a006c00b80132007f010700f301310076000b0d67047200a200a30003037802d3037702da007f02d802d20376037501a0008c00fa02d1037400b6000b0471047006320372046f00760d66007f046e03100371000303700214036f02160d650d6400a2015b019f010400ff024e00ee0101024d009902d90126000b0d63046d012f00ad000301eb036e036d036c024402d0036b036a03690368010102cf013303670243000b0366046c0365036403630362016c0d62046b0041036101a00d610126063100a2015b019f010400ae017000ee00bb03600099035f0024000b0d60046a035e00a3000301910630062f015900ff035d01e5062e035c02ce006800ca01a4035b0036000b035a046900780359062d00240d5f062c046803580467013b01320d5e007b035600360466062b0001000200290007000600100013002c00070006002b001b002f024b024a062a0023000400db0012002a013000050162047d008b007c0008006700030087025006340d5d01440d5c0d5b0097001c012e0046000f00010002000e00850084000a0004003b0008000c00db0014025801a9016800aa00e70073000d000f00df00440d5a004a00070006001000010002000e0013009b00df0023001a002700b4001700040d59007b00350015007b00250380001500a10025007b02dc000f005500440d5800e303550d570069007c000800670003037e00870d560d550d5400120d530169012e06290144017704b5007c0008011600670003006a001c006600460086000f00010002000e00650064000a0004003b00080073025000ac03a000f7018100c801800097001c00b20046000f00010002000e00850084000a0004003b0008000c00db00140d5200aa003f000f007300440d51004a00070006001000010002000e001300da00730023001a002700b4001700040d50007b00350015007b002500c9004a00aa003f006e0d4f00010002000e002f017c039500bb0023001700e100e001ea00360628064702d701bc064600750645010b015a017901a2001501780045024906440643064202d601250d4e02d50273027201e90d4d0036062801a10248012401e801e7006101e602470246012300190004062700a1007c005900740003018101c300ac0014047400e5002d003f009e0d4c0149009800030473002d0d4b02450d4a037b02d40193037a0379016a006c00b80132007f010700f301310076000b0d49047200a200a30003037802d3037702da007f02d802d20376037501a0008c00fa02d1037400b6000b047104700373063f0372046f00760d48007f046e03100371000303700214036f02160d470d4600a2015b019f010400ff024e00ee0101024d009902d90126000b0d45046d012f00ad000301eb036e036d036c024402d0036b036a03690368010102cf013303670243000b0366046c0365036403630362016c0d44046b0041036101a00d4301260d4200a2015b019f010400ae017000ee00bb03600099035f0024000b0d41046a035e00a30003063d063c063b019500ff035d01e5063a035c02ce006800ca01a4035b0036000b035a046900780359063900700d4000c3063803580467013b01c80d3f003604660d3e0001000200290007000600100013002c00070006002b001b002f024b024a063704650023000400db0012008901aa0005002a017f000500df06260032003100300014002e00790020002800220021001e0d3d007a00010002000e03ae0d3c00550d3b00a1007c000800670003037e009e0d3a001600aa0074000306cf0008011500670003006a001c006600460086000f00010002000e00650064000a0004003b0008004a00e900ac01b70069007c000800670003004a01aa018000a1007c000800670003004a00fc018004a6007500f600b2011401b4039700f7000d000f004a00440d39007e00180033001f0d3801220032003100300014002e00790020002800220021001e0d37007a002f017c00a4039500bb0023001700e100e00354000c0625062406230622062100d706200159015a017901a20015017800450249061f0353035202d601250d3602d50273027201e90d350036062501a10248012401e801e7006101e6024702460123001900040627008b007c00590074000301c200e900ac06330014047400e5002d003f009e03e30149009800030473002d0d3402450d33037b02d40193037a0379016a006c00b80132007f010700f301310076000b0d32047200a200a30003037802d3037702da007f02d802d20376037501a0008c00fa02d1037400b6000b0471047006320372046f00760d31007f046e03100371000303700214036f02160d30063100a2015b019f010400ff024e00ee0101024d009902d90126000b0d2f046d012f00ad000301eb036e036d036c024402d0036b036a03690368010102cf013303670243000b0366046c0365036403630362016c0d2e046b0041036101a00d2d01260d2c00a2015b019f010400ae017000ee00bb03600099035f0024000b0d2b046a035e00a3000301910630062f015900ff035d01e5062e035c02ce006800ca01a4035b0036000b035a046900780359062d00240d2a062c046803580467013b01320d290069035600360466062b0001000200290007000600100013002c00070006002b001b002f024b024a062a0023000400db0012002a00a4000501e2047d008700070006001000010002000e0013009b004a0023001a0027003200180033001f005a008004830d28005f03880041005100580d2700240d26005e0050004f005d005c0042004e004d005b004c003c0060001700040d25005200ba0d2402e0013f013e014200d50015013d004500b70018003d009d001101150d230168004a01460163065400d802590001000200290007000600100013002c00070006002b0013002f024b024a0d2201f00023000400db0012008900e90005002a00fc0005006d06260012008204640005005704630005006304620d21003100300014002e00790020002800220021001e0d20007a0d1f0d1e0d1d0d1c0d1b00d7061e019504c004bf00e80d1a04be0d19014700b30d1800c6061d006b0d1704d404a30d1600f2049e061d0191003c02fc00540d15030b006200530009003a0039009c003800370009017601210d140d130d120d110016006f0121014a00ea0d1001b3061c006104610d0f0263061b061a039a0d0e0d0d015a017901a202cc01780460014802490d0c06ca02e0012100260d0b06b90d0a00d40110012100710242006e00960d090d08027900bc012106a6006b0068018a0d07049d0d0602e400fe04ed01ef0702001d045f06a50d05027500d502cc06a406a306a2001403df0312045e045d016f02cc045c0460049c0311012b049b01e9012100360d0402e30d03004200c5049a007103e20d020d01014900d50121069e00ea00ae03b302f40d0000d600be027604f007080026045f0165061c049900e802cc01ad069d0cff00750cfe061901bb01ba061802cc01b9046002e2045b03b502e10106012100240cfd018b0cfc026c00f10cfb00c501450cfa0cf900a90cf802d4016f01210cf701e9007f010702550cf6011200bb045a01a40cf50070045f0cf40cf3068e00e801210cf201ad0617010601210cf10cf0061601210cef0cee0ced006200530009003a0039009c003800370009001a065b0cec00360ceb00fe007103b20cea035100960ce900620241061501580ce80ce7018f06140059006f01580ce6013a0ce500e706eb020a04610ce404bd0ce30ce200120ce1010606a106a0016f02cb069f045901480311001904bb0195015800260ce0001a06f3004206160158007103b4006e06c70cdf0613061200e801580cde0096008c02560cdd049d0cdc00c600fe04ed01c70cdb001d061106350cda06b6016f02cb06100cd90cd800140cd70cd6045e045d00ad02cb045c0459060f018d060e060d001e015800b60cd5060c0cd4012f01500cd300f104580cd20cd100f200e801580cd001c1006c04f102d20ccf03de00be027600f3068d002606110cce01a1060b016f02cb06100ccd01fa007501f900f9045e045d00ad02cb045c0459060f018d03b4060d001e015800b60ccc03860ccb004200c5049a00f104580cca0cc900a900980158065200d401100158006200530009003a0039009c003800370009017602ca0cc80cc706ab0cc600160cc5060b0cc4006100bc02ca0cc302e00cc20cc10cc000a900d502ca049c06910cbf045702ca0cbe04b7011002ca0cbd03da06b4006200530009001a011a03500cbc0cbb0cba0cb904b701a203500cb800080cb700c60cb606630cb506120cb40cb301ad0cb2065500140cb102c90213021200a30cb002110caf0cae01ac02c8061703de035000240cad034f0cac00f2049e0350007103b50191037c0cab006200530009003a0039009c0038003700090241061502c70caa0ca9018f0614000806130016006f02c7014a00bd0ca801b301a1006100bc02c7014804bd04bb019502c70ca700a9009802c70ca600d40062005300090176060a0ca50ca404d40ca3016b0098060a0ca200080ca1001606e1006100620053000901e102780ca003b0060902fc0062003a0039016e0038003700090c9f060800260c9e00fe0c9d0c9c01af003c006e00c60c9b0c9a01e00c990c9806090062060706060c9701570c960c95000c026001f704560c940c930c92045504cf0c9102440c9000aa01940c8f034e0c8e060500a00c8d00f6000f00440c8c0c8b0c8a007e0c890c880c87010a024000cc02c600c400010002000e0094009b000a001a002700b40032001700040c8602c5023f02c40c850c8404540c830c820c810c800604060303130c7f0c7e0c7d06fa0c7c047e01e801e7000801e60c7b0c7a0c79003f013c0c7802c30054003e008a003501df000404530025011a01de02c20c7702c1006f01de0c760c750c7403d401de0c73060201dd01df0c7200b70c71007401de0c7000b10c6f01de01020c6e00b10070015a0c6d02e606010c6c06000c6b00b101a201de05ff0c6a010b00ae03b305fe048e0c69037c00bb045a01c70c68007006010c6700e801df01ad0c660c6501f50c6400ee0213021200a301df0211045301ac003c0c630c6201de02ed0c6102db00710c6003b402ed0c5f0c5e0c5d004905fd00fc0c5c05fc001d006d0c5b02c002bf01dc02c002bf045202c002bf0075023e01df034e011405fb001101150c5a0011016801b60116002501f6023d0097001c045101db000f00010002000e00850084000a000405fa0008000c02c502c405f901570c590c58000d0c5700d8000d05f80087000d023c004a000d0c5601da01d90117000d008b001105f7003f0c55000c04500c5400be023b046800b10081007100ea0c5305f601e0012002be004405f5023a01390c52000100020029010a00cc02c600c4009400c100c0019e00940240002302c4023f02c5001a002700b4001700040c510c5002c002bf01dc02c002bf034e011405fb001101160097001c045101db000f00010002000e00850084000a000405fa0008000c02c502c405f9015705f80073000d023c004a000d0c4f01da01d901e2000d000f02be004405f5010a00cc02c600c400010002000e009400830240002302c4023f02c5001a002700b4001700040c4e05f401df034d0c4d05fc0c4c004a0c4b023c0215000d0c4a01da044f011401d9000d05f30c49000505f700260c48006802f0024c02bd05f20c4705f1039800a80c460c4502f0024c0c440c4300780c420c4100260c400068015005f005f1039800a80c3f0c3e0c3d00f605ef060800260c3c00fe046500f10c3b0c3a035100c60c390c38046501b5044e00440c37007e00180033001f0c360c35000100020029010a0c3402bc0c3306f9007d009a0c32009402400023023f001a0027003200180033001f005a008001750c31005f01740041005100580c3000240c2f005e0050004f005d005c0042004e004d005b004c003c0060001700040c2e0052017e02c30054003e008a003501df0004045300250018060202bb006200530009003a0039009c003800370009003a0039016e003800370009003a00390c2d0038003700090122003100300014002e034c0020002800220021001e0c2c044d0032003100300014002e034c0020002800220021001e0c2b044d0032003100300014002e034c0020002800220021001e0c2a00700c2900c300d300e200d200d1000800d000cf00ce00cd00c700c200070006001000130009003100300014002e034c0020002800220021001e0c28044d05ee0c270c2606fc0c25000c05ed006c00be02d303df06c30c240c230c220c2105ec0c20002605ed0c1f0c1e068f0c1d003a0039010d00380037000900fe044c0c1c01570c1b01da0c1a01d9034b000f00ed03990c190c180c1703d80c16007e00180033001f0c15010a00e6034a001000010002000e0013009b00ec044b000a011f001a0027003200180033001f005a008001750c14005f01740041005100580c1300240c12005e0050004f005d005c0042004e004d005b004c003c00600017000400e40138013701560c11005200ba0c1006ec003e008a0c0f011e00040239044a02c20c0e0c0d0c0c0c0b002c00ed0c0a044b05eb03490c09004300070006002b001b00da00ec05ea000a0449001a0027003200180033001f005a008005e90c08005f05e80041005100580c0700240c06005e0050004f005d005c0042004e004d005b004c003c00600017000400e40138011f013701560c05005200ba0c0401c0011e01bf001801d805e70c03010c012a0c02003e0c010c000bff020f0bfe044b0bfd0bfc0bfb0bfa04eb0bf904eb002c00ed0bf8044803490bf7004300070006002b001b012700ec0bf6000a0bf5001a0027003200180033001f005a008005e60bf4005f05e50041005100580bf300240bf2005e0050004f005d005c0042004e004d005b004c003c00600017000400e40138011f013701560bf1005200ba0bf00035011e0025001801d805e40bef0bee002a0447012b04460bed0238017a0237044501dd011e05e3044a0077011e02360134003305e201e40235008101a3000f00ed02340bec0beb0bea0be900070006001000c100c00233023200010002000e001b00ec002305e1001700e100e002310be8045600e40138011f01370156023405e0013c05df00ef05de01f505dd013a010c012a0035011e014102390025023005dc05db022f02650be701250be601d705da01d6013b01060be500260be4022e020d0124022d022c00a9020b020c022b0123001901550be30be200260be104e60097001c022a000f00010002000e00850084000a000405d90008000c017705d801e1002600e40138011f0137015602340be0011a05d7001801d8012d0011000c003e009f00540444000c05d60bdf03480bde0bdd034b0bdc034b000f00ed0bdb007e00180033001f0bda05eb00e60bd9001000010002000e0013012700ec0bd8000a0bd7001a0027003200180033001f005a008005e90bd6005f05e80041005100580bd500240bd4005e0050004f005d005c0042004e004d005b004c003c00600017000400e40138011f0137015602340bd30052017e0bd20054003e008a0035011e000402390025001801d80237044305e7001d0bd1002a044202c80bd0044100810238017a01dd011e05e3044a0077011e02360134003305e201e40235008101a3000f00ed0bcf0bce0bcd05ea00070006001000c100c00233023200010002000e001b00ec002305e1001700e100e002310bcc05d500e40138011f0137015602340449013c05df00ef05de01f505dd013a010c012a0035011e014102390025023005dc05db0bcb022f0bca01250bc901d70bc801d6013b01060bc700260bc6022e020d0124022d022c00a9020b020c022b01230019015506fb0bc500260bc403d80bc30097001c022a000f00010002000e00850084000a000405d90008000c012d05d801e1002600e40138011f013701560bc20bc1011a05d7001801d8034e000c003e009f00540444000c05d60bc00bbf0bbe0bbd0bbc0bbb034b0bba05d4000f00ed0bb9007e00180033001f0bb8044800e60bb7001000010002000e0013008300ec0bb600230bb5001a0027003200180033001f005a008005e60bb4005f05e50041005100580bb300240bb2005e0050004f005d005c0042004e004d005b004c003c00600017000400e40138011f01370bb1005200ba0bb00baf003e008a05d3011e000402390bae001801d805e4001d010c0bad009604440bac0318012b0bab0baa01e202290ba9012b05d20ba800810ba700700ba600ae05d10ba50ba405d005cf01120ba30ba20ba1060005f2044000700ba000ae02bd0b9f05d005cf01120b9e0b9d0b9c024f043f05f00b9b00700b9a006801500b990b98039801870b97012000ed0b960b950001000200290b9400e60b930010001300c100c005ce001300ec0b9200230b91001a0027003200180033001f005a00800b900b8f005f0b8e0041005100580b8d00240b8c005e0050004f005d005c0042004e004d005b004c003c006000170004011f0b8b005200ba0b8a006b013f013e006f011e013d023900b7001801d80b8905cd0b88043e006205cc0b8700e40138011f01370156023405e0015500360b8605cb00260b85012d000100020b840b8305cc0b8200e40138011f013701560449015500360b8105cb00260b8000d70266004b00b30165012c0047014b043d008702590001000200070006002900100013000900530009003a0039009c0038003700090b7f003f0007000602e800da0009003100300014002e043c0020002800220021001e0b7e05ca003100300014002e043c0020002800220021001e0b7d05ca003100300014002e043b0020002800220021001e0b7c05c9003100300014002e043c0020002800220021001e0b7b00700b7a00c300d300e200d200d1000800d000cf00ce00cd00c700c20007000600100013000900120082043a0005005704390005006304380005004b000d007200480b79003100300014002e043b0020002800220021001e0b7805c9004b000d0072004800050437024f043600b300820435000500010002004300a7000901220012005704340005006304330005004b000d00720048000500010002004300830009003100300014002e043b0020002800220021001e0b7700700b7600c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b000904480b750b74007d009a00c2001300090b7304560b720b71003c0095000d02540b7000d40b6f0b6e0b6d0432008104910b6c0b6b0b6a0b6900f20b68015b0b6705c8010102cf045805c70b6602d10b650243011d049b0b640b6300f401730b620b610b600b5f0101065702550b5e0b5d0b5c00ae017001920b5b0024011d0b5a0b5903180b58048b0b570b560b5502690b540b530b5201730b5101be0b500b4f0b4e02bd0b4d048c0b4c0b4b0b4a05c70b490b480b470b4601330b4505c6011d0b440b43070005d3017305d10b420b410b4000ae03150b3f0b3e0b3d0b3c008c00fa0b3b04ba00b6011d05c50b3a04c30b390b380b3706580b360b350b340b330b320b3105c60b3005c405c30b2f0b2e0b2d006800ca0216008c025601ef0b2c0036011d0b2b0b2a006100bc017301eb0b290b28001e00ae031501e50b270b2601c1006800ca009905c20036011d05c50b2504c30b240b230b2201260b21063e0b200b1f06190b1e00b60b1d0431017a0b1c0008006701730b1b05c10b1a0b1905c0043004e10b1805bf0b170145006800ca03c6007f010701ef0b160036011d0b1505be043000ad017302bd0b140b1302ce00ae031501e50b120b110b10006800ca0b0f05c20036011d0b0e0b0d0b0c0b0b0b0a01260b09010105be0b080b0701730b0602bd0b0505c80b0401eb05c0043005bf0b030145006800ca03c60101024d009906560036011d0b020b0105c30618017302140b000aff0228024402d001e50afe0afd0afc006800ca01330afb0036011d0afa0af90af80af70af60af502430af40af30af20af102050af0016c0aef05c403e00aee0aed0145006800ca05ec005304de00f304dd0036011d0aec0aeb00080035017300c50aea0ae90187006c018e05fe0ae80ae7005800bb045a00990ae60070011d0ae50ae402420ae30ae20ae100b60ae00adf0ade05bd04570add00260062005300090adc05bc00260adb00750ada0ad90ad80ad70ad600340ad505bd024505bb042f05ba05b9010b0ad405b805b705d40ad301d50ad205b6003f0348015701da04d00114023c000d01d90185000d000f00ed0ad10ad0007e00180033001f0acf00530062010a00e6034a001000010002000e0013012700ec05b5000a05b4001a0027003200180033001f005a008001750ace005f01740041005100580acd00240acc005e0050004f005d005c0042004e004d005b004c003c00600017000401d40acb0052017e02c30054003e008a00350088000401d3002502c20aca02c10ac90ac8002a0447012b044600f000810238017a0237044501dd008805b3045b00770088023601340033042e01e40235008101a3000f00ed0ac700e30ac605b200070006001000c100c00233023200010002000e001b00ec00230154001700e100e002310ac501d40347013c013900ef05b102ba05b0013a010c012a00350088014101d3002505af0454022f05ae01250ac401d705ad01d6013b01060ac300260ac2022e020d0124022d022c00a9020b020c022b012300190346001d05ac00260ac105ab02400097001c022a000f00010002000e00850084000a000402b90008000c019d05aa01e1002601d4023f0ac0011a0227001802b802bb000c003e009f0054042d000c05a90157034801da023c006d000d01d9000d000f00ed0abf007e00180033001f0abe010a00e6034a001000010002000e0013012700ec05b5000a05b4001a0027003200180033001f005a008001750abd005f01740041005100580abc00240abb005e0050004f005d005c0042004e004d005b004c003c00600017000401d40aba0052017e02c30054003e008a00350088000401d30025001802b80237044302c1001d0ab9002a044202c804aa003c044100810238017a01dd008805b3045b00770088023601340033042e01e40235008101a3000f00ed0ab800e30ab705b200070006001000c100c00233023200010002000e001b00ec00230154001700e100e002310ab601d40347013c013900ef05b102ba05b0013a010c012a00350088014101d3002505af0454022f05ae01250ab501d705ad01d6013b01060ab400260ab3022e020d0124022d022c00a9020b020c022b012300190346001d05ac00260ab205ab02400097001c022a000f00010002000e00850084000a000402b90008000c019d05aa01e10026023f0ab1011a0227001802b802bb000c003e009f0054042d000c05a9006a001c006600460086000f00010002000e00650064000a000402b9000801880226001102b70ab00035008805a805a705a600d7042c05a500bd010c012a00bc0088014101d300340aaf042b0aae05a4001d0aad0aac05a3039f05a205a10440037f0aab000c042a0011000c0429019d0345000d02260011000c04280aaa0aa9017b0aa800bb025701d20aa704270153042601030153042501430aa60344042402630aa5045200a001060423049f03b805bc0241030b05a0000c0422011302e7059f0012002a000501c104bc01ae015e059e00bf00a5007800b9001900af00880056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401360059001200930092002d00910090002d00560047008904210005002a008f0005008e001900770088008d003400070006001000110001000200290013002c00070006002b001b002f0040000a00040136005902b602b50420000f009500440aa4007e00f50152001f0aa30aa2022500cc02b400c400010002000e009400da0aa1000a0aa0001a0027003200f50152001f034302b30a9f002002b20022002100ee0a9e02b10a9d01ab02b0004f02af02ae00f202ad02ac02ab004c003c0060001700040a9c04750052034202aa0054003e008a00350088000401d3002500f502b803410340022700b1041f0227033f00a6007d022704930a9b025a041e041d02a9004903950096059d015301d500490096015300c60153008700490095016700a601720096059c033e015e02a80026059b049f03e10a9a00b10a99033d02a702420096033c01e300a500b3019c000d00af008802a600b7007d009a02a500110001000200290013002c00070006002b001b002f0040000a000401360059001200930092002d00910090002d00560047008904210005002a008f0005008e001900770088008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004005501360008016100b200c8059a03a802a90049059d00c6015303d70a98003f02260011000c02740a970a9602a90049001d042803b00a950049001d0a9402b7042905b700110356044f00110599010b042304b60598000c042205970012002a012b010b0596059500bf00a5007800b9001900af00880056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401360059001200930092002d00910090002d00560047008904210005002a008f0005008e001900770088008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004013602a90049001d04290008041c01550014041b007800a0041a00f60419033b001903c80357002d04180005041700880416003401550120034500440a9300e30355000c0a920a91000100020043007d009a00bf017100c100c0019e009400230154001700e100e00354000c0594059302d701bc02d700d7042c059200bd010c012a00bc0088014101d3003402500a900353035204760a8f01250a8e01d70a8d01d6013b01060a8c0036059401a10248012401e801e7006101e60247024601230019001d059101810011000c0a8b01760227041502b801770011000c003e009f0054042d000c0591006a001c006600460086000f00010002000e00650064000a000402b901d50049001d042800080a8a005302a401030a89006b015302a30209015302240a8800a6017202a20a8700a6019b00a80423026202a10076042200a8014002a00a8601af021001530a8500b100a8029f029e0a84029d0596029c013a035706cc0a83029b006b0153010f0a8200120049022900bd059c0a81059001420251001d059b033a002a010200bd029a00bf00a5007800b9001900af00880056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401360059001200930092002d00910090002d00560047008901670005002a008f0005008e001900770088008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004013600080161069b048603a202990012002a0005029800a5007800b9001900af00880056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401360059001200930092002d00910090002d00560047008901670005002a008f0005008e001900770088008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004013600080075023e0088011401b60143002501b4023d0097001c00f701db000f00010002000e00850084000a000402b90008000c0136019a01d10215000d0414004a000d01d002be000d0297019901cf0345000d009d00110296003f0295000c0a800a7f00be023b029400b10081007100ea0a7e033901e00120007300440a7d023a01390293000100020029019800cc029200c4009400c100c0019e01710a7c00230a7b001a002700b4001700040a7a00e80088014702260182001d00690a79003a0039010d003800370009042a001106290a78042a043100110062058f037301d403470346001d0a770a76058f037301d403470346001d0a750a7400260a7300d705a5004b00b30165012c0047014b043d02a902590001000200070006002900100013000900530009003a0039009c003800370009003a0039016e00380037000900120082016000050057015f0005006301280005004b000d00720048000500010002004300a7000900120057015d00050063015c0005004b000d007200480005000100020043008300090122003100300014002e03380020002800220021001e0a7204130032003100300014002e03380020002800220021001e0a7100700a7000c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b0009001200820337000500570336000500630335058e0012005703340a6f001204ac000d00010002004300da000900120082043a000500570439000500630438058e003100300014002e03380020002800220021001e0a6e0413004b000d0072004800050437024f043600b3008204350a6d010a0a6c0a6b007d009a00c2001300090012005704340005006304330a6a003100300014002e03380020002800220021001e0a69041304f201570a6806050479019b0a6700780a660078012005b800ed0a6504120a64007e00180033001f0a6305b6010a0349058d004300c100c005ce001b012700ec058c000a0411001a0027003200180033001f005a008001750a62005f01740041005100580a6100240a60005e0050004f005d005c0042004e004d005b004c003c00600017000401ce0a5f049200520a5e0a5d013a010c012a0035019701410333002502c20a5c0a5b037f0a5a002a0447012b044600f000810238017a0237044501dd0197058b034d00770197023601340033058a01e40235008101a3000f00ed02230a5900e30a58058c00070006001000c100c00233023200010002000e001b00ec00230154001700e100e002310a5701ce02230411013c033200ef0332058905880587010c012a0035019701410333002505860585022f058401250a5601d7058301d6013b01060a5500260a54022e020d0124022d022c00a9020b020c022b012300190331001d058200260a530a5205810097001c022a000f00010002000e00850084000a000405800008000c0177057f01e1002601ce0223057e0a51011a057d00180410057c000c003e009f0054057b000c057a0157034801da023c01e2000d01d9000d000f00ed0a50007e00180033001f0a4f010a00e6034a001000010002000e0013012700ec0579000a040f001a0027003200180033001f005a008001750a4e005f01740041005100580a4d00240a4c005e0050004f005d005c0042004e004d005b004c003c00600017000401ce02230a4b0052017e02c30054003e008a00350197000403330025001804100237044302c1001d0a4a002a044202c804aa003c044100810238017a01dd0197058b034d00770197023601340033058a01e40235008101a3000f00ed0a4900e30a48057900070006001000c100c00233023200010002000e001b00ec00230154001700e100e002310a4701ce0223040f013c033200ef0332058905880587010c012a0035019701410333002505860585022f058401250a4601d7058301d6013b01060a4500260a44022e020d0124022d022c00a9020b020c022b012300190331001d058200260a430a420a410097001c022a000f00010002000e00850084000a000405800008000c0181057f01e100260a400a3f011a057d00180410057c000c003e009f0054057b000c057a00620578057701ce022304110331001d0a3e0a3d0578057701ce040f0331001d0a3c043e00260a3b00d70576004b00b30165012c0047014b043d0162025900010002000700060029001000130009003a0039009c0038003700090053000900120082043a0005005704390005006304380005004b000d007200480a3a003100300014002e05750020002800220021001e0a390a38004b000d0072004800050437024f043600b300820435000500010002004300a700090222040e0a37007d009a00c20013000901220012005704340005006304330005004b000d00720048000500010002004300830009003100300014002e05750020002800220021001e0a3600700a3500c300d300e200d200d1000800d000cf00ce00cd00c700c200070006001000130009001a00d70a34000d0a330477000d014b0a32010202f600b30a310a300a2f00b70a2e002c06ae0a2d00e301ec00360a2c0052013900ef040d0012029100ea015a017900bc0a2b01780a2a00340290028f005a028e028d0a29028c01400041005102280a2800240a27028b0050028a0289004d00d4004e02880287028600810a2600010002004300c100c00a250a2400070006002b0013016400230154001700e100e001ea00360a230285025d001d05740011000c0a2201760a21040c0a2001dc000c003e009f00540a1f000c05740062003a0039009c0038003700090012008205730005005705720005006305710005004b000d00720048000500010002004300a7000900530009024101f504d100190a1e0a1d001900950a1c004702f6024f0a1b0a1a0a1900b70a18002c02840a1700e301ec00360a160052013900ef040d0012029100ea015a017900bc0a1501780a1400340290028f005a028e028d0a13028c01400041005102280a1200240a11028b0050028a0289004d00d4004e02880287028600810a10000100020043007d009a00bf017100070006002b0013014200230154001700e100e001ea00360a0f0285025d001d05700011000c0a0e01760a0d040c0a0c01dc000c003e009f00540a0b000c05700062003a0039009c0038003700090012008205730005005705720005006305710005004b000d00720048000500010002004300a700090053000903a9019a01d1017a0a0a0a0900f60a08033b001900950a07004706ff02cd0a060a050a0400b705ef002c03170a0300e301ec00360a020052013900ef040d0012029100ea015a017900bc0a0101780a0000340290028f005a028e028d09ff028c014000410051022809fe002409fd028b0050028a0289004d00d4004e028802870286008109fc000100020043007d009a00bf017100070006002b0013023000230154001700e100e001ea003609fb0285025d001d056f0011000c09fa017609f9040c09f801dc000c003e009f005409f7000c056f0062003a0039009c0038003700090012008203370005005703360005006303350005004b000d00720048000500010002004300a7000900530009034f0241001209f609f5002a00b702dc000f028409f400e30355000c09f309f200010002000e002609f1002f017c00bb09f001420023001700e100e00354000c056e062406230622062100d706200159015a017901a209ef017809ee0249061f0353035202d6012509ed02d50273027201e909ec0036056e01a10248012401e801e7006101e60247024601230019000409eb0062003a0039009c0038003700090012008204640005005704630005006304620005004b000d00720048000500010002004300a7000905ee044c047603b803af01850115006a001c006600460086000f00010002000e00650064000a000409ea005902ba09e909e8033009e7028309e6009d042409e509e4000f0095004403d909e3007e00180033001f09e2056d056c022200cc040b00c400010002000e009401270581000a057e001a0027003200180033001f005a0080040a09e1005f040900410051005809e0002409df005e0050004f005d005c0042004e004d005b004c003c00600017000409de0330056b043f005200ba09dd05cd003e008a05f402820004056a034d02c209dc09db00740281001d09da043e09d909d802c809d705690568060e002c0689028409d6056d056c010a0349058d004300070006002b001b0127017b09d5002309d4001a0027003200180033001f005a0080017509d3005f017400410051005809d2002409d1005e0050004f005d005c0042004e004d005b004c003c00600017000409d0005200ba0330056b043f09cf0035028200250018056702c10074028101c809ce008702db02a8025209cd01c809cc026000bf002a000509cb00a5007800b9001900af02820056003400070006001000110001000200290013002c00070006002b001b002f0040000a000405660059001200930092002d00910090002d00560047008901c30005002a008f0005008e001900770282008d003400070006001000110001000200290013002c00070006002b001b002f0040000a000405660059015702b509ca000f0095004409c9007e00f50152001f09c803a1010a00cc02c600c400010002000e009400da09c7000a09c6001a0027003200f50152001f005a01a7017509c5005f017400410051005809c4002409c3005e0050004f005d005c0042004e004d005b004c003c00600017000409c206a8005201a60565006b013f013e006f0282013d056a00b700f5056702bb09c1028109c009bf028109be00a6007d0281033009bd0252001a09bc04dc09bb09ba09b90564000c05630026056309b809b7010b056209b609b5056109b409b3018709b20070056409b109b00457056209af09ae056109ad056009ac09ab03d709aa0142006200a100df006209a900a109a809a709a600530009003a0039009c00380037000901220082016000050057015f0005006301280005004b000d00720048000500010002004300a700090057015d00050063015c0005004b000d00720048000500010002004300830009055f055e00190408055d00190407012809a5003a0039010d0038003700090408028000190407027f0019032f003f00e7004800190007000602e800830009055f055c00190408055b0019040700b90019032f003f00e7004800190007000602e800a70009003100300014002e09a40020002800220021001e09a3007009a200c300d300e200d200d1000800d000cf00ce00cd00c700c200070006001000130009003100300014002e055a0020002800220021001e09a109a0003a00390485003800370009099f003f0007000602e800da0009003100300014002e055a0020002800220021001e099e0070099d00c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b0009099c099b03a10432099a04e6099900de001c000f00010002000e00dd00dc000a0004032e000809980997006a001c006600460086000f00010002000e00650064000a0004032e00080188019d025e045102b70996032d099505a805a705a600d7042c099400bd010c012a00bc00eb0141040600340993042b099205a4001d0991099005a3039f05a205a10440037f098f000c02260011000c0405098e0404000d019d0011000c0403017b098d00bb025701d2098c0427015104260103015104250115098b034404240263098a045200a001060402027e069504a70241030b05a0000c040101f70480059f0012002a000501c104a002f7015e059e00bf00a5007800b9001900af00eb0056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401350059001200930092002d00910090002d00560047008901460005002a008f0005008e0019007700eb008d003400070006001000110001000200290013002c00070006002b001b002f0040000a00040135005902b602b50420000f009500440989007e00f50152001f09880987022500cc02b400c400010002000e009400da0986000a0985001a0027003200f50152001f034302b30984002002b20022002100ee098302b1098201ab02b0004f02af02ae00f202ad02ac02ab004c003c006000170004098109800052034202aa0054003e008a003500eb00040406002500f5055903410340032c00b1041f032c033f00a6007d032c0163097f025a041e041d01d5004901860096032b0151041c00490096015100c6015100d80049009500fc00a6017200960558097e015e02a800260557027e0698097d00b10267033d02a702420096033c01e300a500b3019c000d00af00eb02a600b7007d009a02a500110001000200290013002c00070006002b001b002f0040000a000401350059001200930092002d00910090002d00560047008901460005002a008f0005008e0019007700eb008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004004a013500080161008b00a4059a03a801d50049032b00c601510357097c003f019d0011000c0274097b097a01d50049001d040303b0097900490978097702b70405032a00110356019d043100110599010b040204b60598000c040105970012002a012b010b042f059500bf00a5007800b9001900af00eb0056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401350059001200930092002d00910090002d00560047008901460005002a008f0005008e0019007700eb008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004013501d50049001d04050008034501550014041b007800a0041a00f60419033b00190976019b0556007804180005041700eb041600340155012004040044097500e301ec0036032909740052055500ef05540012029100ea01a5022100bc00eb0220040600340290028f005a028e028d0973028c0140004100510228097200240971028b0050028a0289004d00d4004e02880287028600810970000100020043007d009a00bf017100c100c0019e009400230154001700e100e001ea00360329096f0285025d001d05530011000c096e0176032c0415055901dc000c003e009f0054096d000c0553006a001c006600460086000f00010002000e00650064000a0004032e041c0049001d04030008096c005302a40103096b006b015102a3020901510224096a00a6017202a2096900a6019b00a80402026202a10076040100a8014002a0096801af02100151096700b100a8029f029e0641029d042f029c013a055204bc0966029b006b0151010f096500120049022900bd05580964096301420251001d0557033a002a010200bd029a00bf00a5007800b9001900af00eb0056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401350059001200930092002d00910090002d00560047008900fc0005002a008f0005008e0019007700eb008d003400070006001000110001000200290013002c00070006002b001b002f0040000a00040135000801610962048701ae02990012002a0005029800a5007800b9001900af00eb0056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401350059001200930092002d00910090002d00560047008900fc0005002a008f0005008e0019007700eb008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004013500080075023e00eb011401b60115002503af023d0097001c01f201db000f00010002000e00850084000a0004032e0008000c0135019a01d10215000d00b200a00328003f01d00055000d0297019901cf0404000d00a100110296003f0295000c068c096100be023b029400b10081007100ea0960033901e0012000b50044095f023a01390293000100020029019800cc029200c4009400c100c0019e0171095e0023095d001a002700b400170004095c00e800eb0147019d0182001d007b095b003a0039010d0038003700090226006200530009003a0039009c003800370009003a0039016e00380037000900120082016000050057015f0005006301280005004b000d00720048000500010002004300a7000900120057015d00050063015c0005004b000d007200480005000100020043008300090122003100300014002e05510020002800220021001e095a09590032003100300014002e05510020002800220021001e09580070095700c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b00090012008203370005005703360005006303350956001203a309550012005703340954001204ac000d00010002004300da00090400055003ff03a6006a001c006600460086000f00010002000e00650064000a0004054f01e2095303bb001d095202de0951000803fe005302a401030950006b032702a302090327022403fd00a6017202a203fc00a6019b00a8054e026202a10076054d00a8014002a006a901af02100327094f00b100a8029f029e01ae029d027e029c013a05c10326094e029b006b0327010f065c0011016100bd054e0699030b094d000c054d094c094b0012002a010200bd029a00bf00a5007800b9001900af027d0056003400070006001000110001000200290013002c00070006002b001b002f0040000a0004027c0059001200930092002d00910090002d005600470089017f0005002a008f0005008e00190077027d008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004027c0008016106970388026602990012002a0005029800a5007800b90019094a09490056003400070006001000110001000200290013002c00070006002b001b002f0040000a0004027c0059001200930092002d00910090002d005600470089017f0005002a008f0005008e00190077027d008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004027c00080075023e027d011401b600fd00250260023d0097001c011301db000f00010002000e00850084000a0004054f0008000c027c019a01d10215000d009d00a00328003f01d00073000d0297019901cf004a000d011800110296003f0295000c024c094800be023b029400b10081007100ea094705f601e0012000d800440946023a01390293000100020029019800cc029200c4009400c100c0019e0094033e0023018c001a002700b400170004094500e8027d014701810182001d008b0944003a0039010d0038003700090062003a0039009c00380037000900530009003a0039016e00380037000900120082016000050057015f0005006301280005004b000d00720048000500010002004300a7000900120057015d00050063015c0005004b000d0072004800050001000200430083000901220032003100300014002e09430020002800220021001e09420070094100c300d300e200d200d1000800d000cf00ce00cd00c700c20007000600100013000904000326054c065d03a201b00113011500de001c000f00010002000e00dd00dc000a000403250008054b0940006a001c006600460086000f00010002000e00650064000a00040325054a00080143007b032d0450093f007b010f0549093e0075093d00a801a5022100d5011c022003fb01340186002d0548031201cd01c8093c009e0164054702ee00d4011001cd006e010200c50145093b008b0087093a03a700a403fa025e03ff000c0324018100110560093902f10324009e093804a9011001cd004a05fd03240937047a0059007401cd001201d20546034f093600260545093502a7002d01d2093401e300a500b3019c000d00af011c02a600b7007d009a02a500110001000200290013002c00070006002b001b002f00400544000a000401cc0059001200930092002d00910090002d0056004700b5009502df0047002a008f0005008e00190077011c008d003400070006001000110001000200290013002c00070006002b001b002f0040000a038105430542000401cc030d0049001d0324000801e201550014041b007800a0041a00f60419033b001900fc019b05560078041800050417011c041600340155002c0317093300e301ec0036032909320052055500ef05540012029100ea01a5022100bc011c022003fb00340290028f005a028e028d0931028c014000410051022809300024092f028b0050028a0289004d00d4004e0288028702860081092e000100020043007d009a00bf017100070006002b001302300023054305420154001700e100e001ea00360329092d0285025d001d05410011000c092c017601cd0415092b01dc000c003e009f0054092a000c05410014092903ab0054003e008a0035011c000403fb0025012900c806510188092801cd09270926009e016209250061010901cd006e000501bd09240923006a001c006600460086000f00010002000e00650064000a0004032501620049001d0922000803fe005302a401030921006b032302a302090323022403fd00a6017202a203fc00a6019b00a80920026202a10076091f00a8014002a0054001af02100323053f00b100a8029f029e01ae029d027e029c013a053e0326091e029b006b0323010f053d00120049022900bd0546039903f901420251001d0545033a002a010200bd029a00bf00a5007800b9001900af011c0056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401cc0059001200930092002d00910090002d005600470089017f0005002a008f0005008e00190077011c008d003400070006001000110001000200290013002c00070006002b001b002f0040000a000401cc00080161049400e4026602990012002a0005029800a5007800b9001900af011c0056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401cc0059001200930092002d00910090002d005600470089017f0005002a008f0005008e00190077011c008d003400070006001000110001000200290013002c00070006002b001b002f0040000a000401cc00080075023e011c011401b600fd00250260023d0097001c011301db000f00010002000e00850084000a000403250008000c01cc019a01d10215000d009d00a00328003f01d00073000d0297019901cf004a000d011800110296003f0295000c024c091d00be023b029400b10081007100ea091c033901e0012000d80044091b023a01390293000100020029019800cc029200c4009400c100c0019e0171033e0023018c001a002700b400170004091a00e8011c014701290182001d008b0919003a0039010d0038003700090177006200530009003a0039009c003800370009003a0039016e003800370009012200120082016000050057015f0005006301280005004b000d00720048000500010002004300a7000900120057015d00050063015c0005004b000d007200480005000100020043008300090032003100300014002e09180020002800220021001e09170070091600c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b00090012008203370005005703360005006303350915001203a30914001204a8000d00010002004300da0009040002670432016600f7016800de001c000f00010002000e00dd00dc000a0004021f0008054b00b2091302f10322007c0008014309120911006a001c0066004600c9014e000f00010002000e00650064000a0004021f000800a00910090f006a001c006600460086000f00010002000e00650064000a0004021f054a00080115007b032d0450090e007b010f0549090d0075090c00a801a5022100d501000220032101340186002d05480312021e01c8090b009e0164054702ee00d40110021e006e010200c50145090a009d00d806bc03a703fa025e03ff000c03220181018201080185006b09090097001c008b0046000f00010002000e00850084000a0004021f0008000c01f00196019a03d60908000f01630284090709060198090500e60904001000010002000e001301aa002609030396017c00bb090200da014200230017001a002700b4000401f003ad05da090100e8010001470254090000080067021e00c8037d08ff08fe08fd00160074021e005408fc034f08fb002608fa00bf053c005408f9002908f8003f08f7019908f6010008f5002503f803f703f608f40007000601e3001b002c00070006002b001b002f0040000a000401960059001200930092002d00910090002d005600470087009502df0047002a008f0005008e001900770100008d003400070006001000110001000200290013002c00070006002b001b002f0040000a02ec01f000040196030d0049001d0322000801e20049015708f300470477056900a00568003f000f00b5004408f2007e00180033001f08f1010a00cc02c600c400010002000e0094012708f0002308ef001a0027003200180033001f005a0080017508ee005f017400410051005808ed002408ec005e0050004f005d005c0042004e004d005b004c003c00600017000408eb01f002ec005200ba0565006b013f013e03ab006f0100013d032101290025001808ea02bb000c003e009f005408e9000c08e8012e064808e7003e008a00350100000403210025007b02de042b018802ef021e011208e6009e016208e500610109021e006e0005019102e608e4006a001c006600460086000f00010002000e00650064000a0004021f01620049001d08e3000803fe005302a4010308e2006b032002a302090320022403fd00a6017202a203fc00a6019b00a808e1026202a1007608e000a8014002a0054001af02100320053f00b100a8029f029e01ae029d027e029c013a053e032608df029b006b0320010f053d00120049022900bd08de039903f901420251001d08dd033a002a010200bd029a00bf00a5007800b9001900af01000056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401960059001200930092002d00910090002d005600470089017f0005002a008f0005008e001900770100008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004019600080161049400e4026602990012002a0005029800a5007800b9001900af01000056003400070006001000110001000200290013002c00070006002b001b002f0040000a000401960059001200930092002d00910090002d005600470089017f0005002a008f0005008e001900770100008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004019600080075023e0100011401b600fd00250260023d0097001c011301db000f00010002000e00850084000a0004021f0008000c0196019a01d10215000d009d00a00328003f01d00073000d0297019901cf004a000d011800110296003f0295000c024c08dc00be023b029400b10081007100ea08db033901e0012000d8004408da023a01390293000100020029019800cc029200c4009400c100c0019e0171033e0023018c001a002700b40017000408d900e80100014701290182001d008b08d8003a0039010d00380037000901770011000c03220181001100d908d708d600120380010006b5002a00b702dc000f028408d500e30355000c08d408d300010002000e002f017c00bb0023001700e100e00354000c053b059302d701bc08d2007508d100a801a5022100d5010002200321013408d00353035202d6012508cf02d50273027201e908ce0036053b01a10248012401e801e7006101e60247024601230019000408cd0177006200530009003a0039009c003800370009003a0039016e003800370009012200120082016000050057015f0005006301280005004b000d00720048000500010002004300a7000900120057015d00050063015c0005004b000d007200480005000100020043008300090032003100300014002e053a0020002800220021001e08cc007008cb00c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b0009001203a30539001206830539001204a8000d00010002004300da000901d108ca000d041408c9000d01d008c8000d032f019901cf012c000d01980538053700a70009041408c7000d01d008c6000d032f019901cf012c000d01980538053700830009003a003904850038003700090032003100300014002e08c50020002800220021001e08c4007008c300c300d300e200d200d1000800d000cf00ce00cd00c700c200070006001000130009003100300014002e053a0020002800220021001e08c208c100120082046400050057046300050063046208c008bf04c1022908be018708bd018b08bc08bb08ba0536018708b908b808b7012b00bf08b6007800b9053c08b508b408b3003400070006001008b20001000200290013002c00070006002b001b002f0040000a000405350059001200930092002d00910090002d005600470492009502df0047002a008f0005008e0019007708b1008d003400070006001000110001000200290013002c00070006002b001b002f0040000a00040535000800a00062003a0039009c0038003700090053000908b0016000050534015f0005053301280005004b027b05320048000503f803f703f600a700090534015d00050533015c0005004b027b05320048000503f803f703f600830009000c08af001d05310026053108ae08ad010b08ac08ab00ea08aa08a9006200120082055e00050057055d00050063012808a800120082055c00050057055b0005006300b90005004b000d00720048000500010002004300a70009003a0039010d00380037000900120057028000050063027f0005004b000d0072004800050001000200430083000908a708a602ba08a5000c08a40024053000260530052f021d0455027b0120044e004408a3052e021c003302bc08a205360550044c022200cc040b00c400c100c0052d0094009b052c000a052b001a0027052a021c003302bc005a0080040a08a1005f040900410051005808a00024089f005e0050004f005d005c0042004e004d005b004c003c052900170004089e089d0636044f05280527052602c9003e008a00a3089c0004089b01ac021c089a05d2027a0899018408980183027a008c00fe0897089608950894018703f5089302e003f4018405250183001d089201840525018308910890010b03f5052401d203f4088f088e088d088c027a03f5088b02e603f4088a08890888088708860062008c00fe052401d208850523028000050522027f0005004b0521052000480005051f051e051d00830009003a0039010d003800370009004b021d012c027b031f0884000d031e0883000d028308820881004b021d012c027b031f03f3000d031e03f2000d0283019c000d0222040e051c00a70009003a0039009c00380037000900530009003a003903f1003800370009051b051a0014002e08800020002800220021001e087f0070087e00c300d300e200d200d1000800d000cf00ce00cd00c705190007000600100013000904f2060c02ba087d000c087c00b6051800260518052f021d045502cd0120044e0044087b052e021c003302bc087a087903fa0412022200cc040b00c400c100c0052d0094009b052c000a052b001a0027052a021c003302bc005a0080040a0878005f0409004100510058087700240876005e0050004f005d005c0042004e004d005b004c003c052900170004087502500177087405280527052602c9003e008a00a308730004087201ac021c08710870086f006b03f0086e020903ef086d0036086c05170516027a03f0031d0159086b086a00fe031d015903ef086908680867086605150865086400ea08630862011203f00861015903ef00b605150860085f085e0062003a0039010d0038003700090523028000050522027f0005004b0521052000480005051f051e051d00830009003a003903f1003800370009004b021d012c02cd031f0514000d031e0513000d02830512085d004b021d012c02cd031f03f3000d031e03f2000d0283019c000d0222040e051c00a70009003a0039009c00380037000900530009051b051a0014002e085c0020002800220021001e085b0070085a00c300d300e200d200d1000800d000cf00ce00cd00c7051900070006001000130009060703a601660859041202b70858032d08570224085606c801f505ff0855018701a5022100d5021b02200511013408540853010e08520026085106640690024505bb05ba05b9010b0850000c032a0011000c084f0069000d007b0011000c084e0162084d00bb025701d2084c0427021a04260103021a042500fd084b0344051000120263084a050f009502c9050e026705d504a702e30142050d001d050c04a4050b050a002a0005001e03f904a5015e050900bf00a5007800b9001900af021b0056003400070006001000110001000200290013002c00070006002b001b002f0040000a0004031c0059001200930092002d00910090002d00560047008900a40005002a008f0005008e00190077021b008d003400070006001000110001000200290013002c00070006002b001b002f0040000a0004031c005902b602b50420000f009500440849007e00f50152001f08480606022500cc02b400c400010002000e009400da0508000a0507001a0027003200f50152001f034302b30847002002b20022002100ee084602b1084501ab02b0004f02af02ae00f202ad02ac02ab004c003c006000170004084408430052034202aa0054003e008a0035021b00040511002500f508420341034003ee00b1041f03ee033f00a6007d03ee03ac0841025a041e041d02be004901630096032b021a004a00490096021a00c6021a006d0049009501c300a601720096050e02e7015e02a80026050c02670506084000b10544033d02a702420096033c01e300a500b3019c000d00af021b02a600b7007d009a02a500110001000200290013002c00070006002b001b002f0040000a0004031c0059001200930092002d00910090002d00560047008900a40005002a008f0005008e00190077021b008d003400070006001000110001000200290013002c00070006002b001b002f0040000a000400b5031c0008016100a100e9047503a802be0049032b00c6021a0552083f003f007b0011000c0274083e003a0039010d003800370009032a006200530009003a0039016e003800370009003a0039009c0038003700090082016000050057015f0005006301280005004b000d00720048000500010002004300a700090057015d00050063015c0005004b000d00720048000500010002004300830009003100300014002e083d0020002800220021001e083c0070083b00c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b0009001200570334083a083903af0838059208370836046108350263061b061a019a06ba02e702e6015a017901a201cb017803ed0249065a08340833083200360831050608300491082f060406030195082e002600e900a60026050504ad066b004700d80049001d0505082d082c082b082a0829050400a100110503021901030219032a0828082703440510001208260825050f009502c9050203a1021808240230050d001d050104a4050b0576050a002a000500ee026702db050900bf00a5007800b9001900af01cb0056003400070006001000110001000200290013002c00070006002b001b002f00400590000a0004031b0059001200930092002d00910090002d00560047008900a40005002a008f0005008e0019007701cb008d003400070006001000110001000200290013002c00070006002b001b002f0040000a047f0004031b005902b602b50823000f009500440822007e00f50152001f0821054c022500cc02b400c400010002000e009400da0508000a0507001a0027003200f50152001f034302b30820002002b20022002100ee081f02b1081e01ab02b0004f02af02ae00f202ad02ac02ab004c003c006000170004081d047f081c0052034202aa0054003e008a003501cb000403ed002500f505000341034003ec01af081b03ec033f00a6007d03ec081a067704820166067600d8004908190146021900c60219006d0049009501c300a6017200960502015e02a800260501033d02a702420096033c01e300a500b3019c000d00af01cb02a600b7007d009a02a500110001000200290013002c00070006002b001b002f00400818000a0004031b0059001200930092002d00910090002d00560047008900a40005002a008f0005008e0019007701cb008d003400070006001000110001000200290013002c00070006002b001b002f0040000a04af0004031b016b009d001106c0021901b1081702b608160815007608140070007304ff02f104ff08130812042e0019000f00440811007e00180033001f0810080f022500cc02b400c400010002000e0094009b080e000a080d001a0027003200180033001f080c02b3080b002002b20022002100ee080a02b1080901ab02b0004f02af02ae00f202ad02ac02ab004c003c006000170004080804af08070052017e02aa0054003e008a003501cb000403ed0025001805000806080503c5080403eb080302e403ea05f30036080205170516027a03eb031d01590801080000fe031d015903ea07ff07fe07fd050404fe07fc07fb07fa07f907f8011203eb07f7015903ea002604fe009d00110503021907f607f507f40351000d07f307f207f1009d006200530009003a0039009c003800370009003a0039016e003800370009003a0039010d0038003700090057028000050063027f07f00082016000050057015f0005006301280005004b000d00720048000500010002004300a700090057015d00050063015c0005004b000d00720048000500010002004300830009003a003903f1003800370009004b04fd012c000d04fc0514000d04fb0513000d04fa051207ef004b04fd012c000d04fc03f3000d04fb03f2000d04fa019c000d022507ee07ed00a70009003100300014002e04f90020002800220021001e07ec07eb003100300014002e04f90020002800220021001e07ea007007e900c300d300e200d200d1000800d000cf00ce00cd00c700c2000700060010001b000900120057033407e8012203a904d207e707e607e500fe07e4061e07e307e207e10351010307e0007d009a00c2002c00070006002b001b07df0230000a000407de00080062012207dd00e3006200fe006207dc00e3006200fe006207db014d0009000000000000000004f800000000000007da00000000000007d9000004f8011b011b07d8000007d7000007d607d507d407d3031a000004f7000007d20000000000000000000003e9000000000000000007d100000000000007d000000000000007cf00000000000007ce00000000000007cd00000000000007cc00000000000007cb00000000000007ca00000000000007c900000000000007c800000000000007c700000000000007c600000000000007c500000000000007c400000000000007c300000000000007c200000000000007c100000000000007c000000000000007bf00000000000007be00000000000007bd00000000000007bc00000000000007bb00000000000007ba00000000000007b900000000000007b800000000000007b700000000000007b600000000000007b500000000000007b400000000000007b300000000000007b200000000000007b100000000000007b000000000000007af00000000000007ae00000000000007ad00000000000007ac00000000000007ab00000000000007aa00000000000007a900000000000007a800000000000007a700000000000007a600000000000007a500000000000007a400000000000007a300000000000007a200000000000007a10000000007a00000000000000000011b04f6011b011b011b079f079e079d079c031a000003e90000079b00000000000000000000079a000007990000000000000000000004f50000079800000000000004f6011b011b03e80797079607950794031a000004f500000793000000000000000000000000079204f400000000000007910790078f078e00000000078d0000078c000000000000078b00000000000001ca01c9078a07890788000000000000078700000000000001ca01c9078607850000000007840000078300000000000004f4000003e9000007820000000000000000000004f7000007810000000000000780077f077e000003e703e604f3077d00000000077c0000000000000000077b000000000000077a0779000000000000000000000778000000000000077700000776000000000000077507740773077207710000000000000770000000000000076f076e076d076c076b000000000000076a0000000000000769000000000000076807670766076507640000000000000763000000000000076200000000000007610000000000000000000007600000011b011b011b03e800000000075f0000075e000000000000075d000000000000075c000000000000075b000000000000075a000000000000075900000000000007580000000000000757000000000000000000000000075603e507550754075303e5075207510750074f074e074d0000074c074b0000000003e5074a0749074807470000000000000746000000000000074507440743074200000741000000000000000000000740000000000000073f073e073d073c073b073a0739073807370736073507340733000000000000073207310000000000000730072f072e000003e703e6072d072c072b00000000000000000000072a011b01ca01c9072907280000000000000727072607250000000003e703e604f30724000000000000072300000000000003e8072200000000000007210000000000000720071f071e0000071d00000000000001ca01c90319071c071b00000000000001ca01c90319071a0719000000000000071807170000000001ca01c903190716071507140000000001ca01c903190713031a000000000000071207110710070f0000000000000000000000000000", + "logIndex": 2, + "blockHash": "0xbf1e0d7d8cebd4102eec3b884b219f5703179e4b4daa3de25847a91e3ead9ed5" + }, + { + "transactionIndex": 0, + "blockNumber": 3908529, + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x0100141159e31f4ebc3a6451663e13976564c96f78f859fb58cb15a60c017bb0", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0xbf1e0d7d8cebd4102eec3b884b219f5703179e4b4daa3de25847a91e3ead9ed5" + }, + { + "transactionIndex": 0, + "blockNumber": 3908529, + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0100141159e31f4ebc3a6451663e13976564c96f78f859fb58cb15a60c017bb0", + "0x000000000000000000000000a314ca85f158776847ad0a9dbb6c41fd3da5f953" + ], + "data": "0x", + "logIndex": 4, + "blockHash": "0xbf1e0d7d8cebd4102eec3b884b219f5703179e4b4daa3de25847a91e3ead9ed5" + }, + { + "transactionIndex": 0, + "blockNumber": 3908529, + "transactionHash": "0xcafdf01a9401948f6f0b8368a50053933461cdcd96467545549bada365d403d1", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x000000000000000000000000000000000000000000000000000ee1992111a6c0", + "logIndex": 5, + "blockHash": "0xbf1e0d7d8cebd4102eec3b884b219f5703179e4b4daa3de25847a91e3ead9ed5" + } + ], + "blockNumber": 3908529, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [ + "0x8CC9c8f3890B16264A70Cd7b35FA52fe6E11984A", + "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1" + ], + "numDeployments": 1, + "solcInputHash": "181d48130aaa3abca6e09907dd1b3e94", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "MagicSwapV2InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountADeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountBDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmountDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "MagicSwapV2WrongAmounts", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExcessiveInputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientAAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientBAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInsufficientOutputAmount", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterInvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedNft", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vault", + "type": "tuple" + } + ], + "name": "NFTLiquidityRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "vaultB", + "type": "tuple" + } + ], + "name": "NFTNFTLiquidityRemoved", + "type": "event" + }, + { + "inputs": [], + "name": "BURN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ONE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountADesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountTokenDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "addLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "addLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "depositVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountMinted", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountIn", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveOut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "name": "getAmountOut", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + } + ], + "name": "getAmountsOut", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reserveB", + "type": "uint256" + } + ], + "name": "quote", + "outputs": [ + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityETHWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vault", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountTokenMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountETHMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_swapLeftover", + "type": "bool" + } + ], + "name": "removeLiquidityNFTETH", + "outputs": [ + { + "internalType": "uint256", + "name": "amountToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountETH", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultA", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract INftVault", + "name": "token", + "type": "address" + }, + { + "internalType": "address[]", + "name": "collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amount", + "type": "uint256[]" + } + ], + "internalType": "struct IMagicSwapV2Router.NftVaultLiquidityData", + "name": "_vaultB", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_lpAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "removeLiquidityNFTNFT", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approveMax", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "removeLiquidityWithPermit", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapETHForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapETHForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactETHForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collectionIn", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountIn", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_collectionOut", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenIdOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amountOut", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapNftForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + } + ], + "name": "swapTokensForNft", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_collection", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tokenId", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_amount", + "type": "uint256[]" + }, + { + "internalType": "contract INftVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "withdrawVault", + "outputs": [ + { + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "errors": { + "MagicSwapV2WrongAmounts()": [ + { + "details": "Amounts does not match" + } + ], + "UnsupportedNft()": [ + { + "details": "Trying to interact with token that does not support ERC721 nor ERC1155" + } + ] + }, + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vault": "vault data of deposited NFTs" + } + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vault": "vault data of withdrawn NFTs" + } + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are deposited", + "to": "address that receives LP tokens", + "vaultA": "vault data of deposited NFTs for first side", + "vaultB": "vault data of deposited NFTs for second side" + } + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "params": { + "pair": "address of pair where NFTs are withdrawn", + "to": "address that receives withdrawn assets", + "vaultA": "vault data of withdrawn NFTs for first side", + "vaultB": "vault data of withdrawn NFTs for second side" + } + } + }, + "kind": "dev", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountBDesired": "desired amount of token B to be added as liquidity", + "_amountBMin": "minimum amount of token B to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "details": "All NFTs and ERC20 token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "desired amount of ETH to be added as liquidity", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to deposit as liquidity" + }, + "returns": { + "amountETH": "amount of ETH added as liquidity", + "amountToken": "amount of vault token added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "details": "All NFTs must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be deposited", + "_amountBMin": "minimum amount of token B to be deposited", + "_deadline": "transaction deadline", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to deposit as liquidity for first side", + "_vaultB": "vault data for NFTs to deposit as liquidity for second side" + }, + "returns": { + "amountA": "amount of token A added as liquidity", + "amountB": "amount of token B added as liquidity", + "lpAmount": "amount of LP token minted and sent to `_to`" + } + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to deposit. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to deposit", + "_to": "address that gets ERC20 for deposited NFTs", + "_tokenId": "list of token IDs to deposit", + "_vault": "address of the vault where NFTs are deposited" + }, + "returns": { + "amountMinted": "amount of ERC20 minted for deposited NFTs" + } + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to Token B", + "_to": "address that gets LP tokens", + "_tokenB": "address of token B", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "details": "Lp token must be approved for transfer. `_vault.collection`, `_vault.tokenId` and `_vault.amount` must be of the same length.", + "params": { + "_amountETHMin": "minimum amount of ETH to be redeemed", + "_amountTokenMin": "minimum amount of vault token to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_swapLeftover": "if true, fraction of vault token will be swaped to ETH", + "_to": "address that gets LP tokens", + "_vault": "vault data for NFTs to withdraw from liquidity" + }, + "returns": { + "amountETH": "amount of ETH redeemed", + "amountToken": "amount of vault token redeemed" + } + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "details": "Lp token must be approved for transfer. `_vaultA.collection`, `_vaultA.tokenId` and `_vaultA.amount` must be of the same length. `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.", + "params": { + "_amountAMin": "minimum amount of token A to be redeemed", + "_amountBMin": "minimum amount of token B to be redeemed", + "_deadline": "transaction deadline", + "_lpAmount": "amount of LP token to redeem", + "_to": "address that gets LP tokens", + "_vaultA": "vault data for NFTs to withdraw from liquidity for first side", + "_vaultB": "vault data for NFTs to withdraw from liquidity for second side" + }, + "returns": { + "amountA": "amount of token A redeemed", + "amountB": "amount of token B redeemed" + } + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "details": "Does not require any approvals. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for ETH. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to receive for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for ETH. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of ETH expected after swap", + "_collection": "list of NFT addresses to swap for ETH", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets ETH", + "_tokenId": "list of token IDs to swap for ETH" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "details": "All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn` as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.", + "params": { + "_amountIn": "list of input token amounts. For ERC721 amount is always 1.", + "_amountOut": "list of output token amounts. For ERC721 amount is always 1.", + "_collectionIn": "list of input NFT addresses", + "_collectionOut": "list of output NFT addresses", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenIdIn": "list of input token IDs", + "_tokenIdOut": "list of output token IDs" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "All NFTs must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to swap for token. For ERC721 amount is always 1.", + "_amountOutMin": "minimum amount of output token expected after swap", + "_collection": "list of NFT addresses to swap for token", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets output token", + "_tokenId": "list of token IDs to swap for token" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "details": "ERC20 must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to receive for tokens. For ERC721 amount is always 1.", + "_amountInMax": "maximum acceptable amount of token to swap for NFTs", + "_collection": "list of NFT addresses to receive for tokens", + "_deadline": "transaction deadline", + "_path": "list of token addresses to swap over", + "_to": "address that gets NFTs", + "_tokenId": "list of token IDs to receive for tokens" + }, + "returns": { + "amounts": "input and output amounts of swaps" + } + }, + "withdrawVault(address[],uint256[],uint256[],address,address)": { + "details": "Withdraw NFTs from vaultVault token must be approved for transfer. `_collection`, `_tokenId` and `_amount` must be of the same length.", + "params": { + "_amount": "list of token amounts to withdraw. For ERC721 amount is always 1.", + "_collection": "list of NFT addresses to withdraw", + "_to": "address that gets withdrawn NFTs", + "_tokenId": "list of token IDs to withdraw", + "_vault": "address of the vault to withdraw NFTs from" + }, + "returns": { + "amountBurned": "amount of ERC20 redeemed for NFTs" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "NFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is added" + }, + "NFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-ERC20 liquidity is removed" + }, + "NFTNFTLiquidityAdded(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is added" + }, + "NFTNFTLiquidityRemoved(address,address,(address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]))": { + "notice": "Emitted when NFT-NFT liquidity is removed" + } + }, + "kind": "user", + "methods": { + "addLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and second ERC20 token" + }, + "addLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using NFTs and ETH" + }, + "addLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,address,uint256)": { + "notice": "Add liquidity to UniV2 pool using two NFT vaults" + }, + "depositVault(address[],uint256[],uint256[],address,address)": { + "notice": "Deposit NFTs to vault" + }, + "removeLiquidityNFT((address,address[],uint256[],uint256[]),address,uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ERC20 token" + }, + "removeLiquidityNFTETH((address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256,bool)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs and ETH" + }, + "removeLiquidityNFTNFT((address,address[],uint256[],uint256[]),(address,address[],uint256[],uint256[]),uint256,uint256,uint256,address,uint256)": { + "notice": "Remove liquidity from UniV2 pool and get NFTs" + }, + "swapETHForNft(address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap ETH for NFTs" + }, + "swapNftForETH(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ETH" + }, + "swapNftForNft(address[],uint256[],uint256[],address[],uint256[],uint256[],address[],address,uint256)": { + "notice": "Swap NFTs for NFTs" + }, + "swapNftForTokens(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap NFTs for ERC20" + }, + "swapTokensForNft(address[],uint256[],uint256[],uint256,address[],address,uint256)": { + "notice": "Swap ERC20 for NFTs" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Router/MagicSwapV2Router.sol": "MagicSwapV2Router" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Router/IMagicSwapV2Router.sol": { + "keccak256": "0xdb888ba1f12b7183d1ecdb0bd339dc5d925b5162cb92824d5d68e1f38b247783", + "license": "MIT", + "urls": [ + "bzz-raw://0ceb09f733371968efa18dc2541e54f181922ef8172a48b350db765dc2fd2495", + "dweb:/ipfs/QmWaiHJ1dcjH2fwXyrTFNS3BJ4gU23mBxdLykCUEsyPMbz" + ] + }, + "contracts/Router/MagicSwapV2Router.sol": { + "keccak256": "0xaae4f0fb40a1f8a82fdde45247d241b8a0a9834420da05c1eed3f84cb595cd5e", + "license": "MIT", + "urls": [ + "bzz-raw://de2ce14bf9f2dd56c92dd98cf0107eb7893916030956caa88bab8b2e884ae21a", + "dweb:/ipfs/Qmaaon5zGU4hBqKJe14UxZru2FGydvavEDWuhBQiqUDZWv" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "keccak256": "0xd8d0de3bc69be9bb5106a5d83f2d6ce2fb523d763b03f2986fce0d355fce6d2a", + "license": "MIT", + "urls": [ + "bzz-raw://bd591385f6f6f94f62c2b519663fa00933d8f2f7d462cea3145e896986e53564", + "dweb:/ipfs/QmRK4x93DxKuyDdgE5PAPWrJzVrQcnBGPiTdBhwKcXanZn" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "keccak256": "0x581635a3e35ab2ae2ce040810296921859b606e19a83f5277396f8b51cb548a1", + "license": "MIT", + "urls": [ + "bzz-raw://61e91d41aa083b0d41f1c30780efbc0259c0c717c122fc11b69ee249362b2330", + "dweb:/ipfs/QmdHsKrcno9mmXAj3zotSLQqX4K6BYFxxJuzxUBGAwVKzi" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "keccak256": "0xb96650151113d4a4224a66aba18c59560b6558375b7eda755abb73f5095c233f", + "license": "MIT", + "urls": [ + "bzz-raw://254aba5995bf05b6d8a1268a9bdbe7d02a86ff4f1cd32a4104977be7384d6c20", + "dweb:/ipfs/QmRNZX4Z8m7QkBvEEbAQhs85cM3wxQ6tNDpCjuoYipZ3zE" + ] + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "keccak256": "0xc8075f02390b9bc257755e15590b56a51e2db779350bfbb5f50ab5b6ebf2e9cc", + "license": "MIT", + "urls": [ + "bzz-raw://34ea022d70255fce6141d5eca24f81096ca371dc4a3297ebe13dd89dc6d119c5", + "dweb:/ipfs/QmXWJuuwv3S8ePZdJUbifD33VqjGng1kkbXk2bzmFcPjez" + ] + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "keccak256": "0xde862b35bbd7c6ac8dd071dc0cd38873bcdb2308a379d55644a38b7c15da4c2f", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://9ac966d3b2824a5edb1cd8dceb840d5c2ec7b4852abcc46d473717bc4454e4b9", + "dweb:/ipfs/QmchxPi4nwYPzKtzKrSCaDmVuXgBefAcRtDue9bdRNDV8M" + ] + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "keccak256": "0x37dc5def704641a09087cc013c342d90b4ec19895f3a7db0b19e0b85fa835b1f", + "license": "MIT", + "urls": [ + "bzz-raw://94d8ad4085e5d0068859ff1ca0c7ccbac67366c87afa7e4ebee17a98d9b8d21a", + "dweb:/ipfs/QmTyzy2owzkRBPRcrPSPc4S35dq7U8KXQYoDWMGdS1Ysq8" + ] + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "keccak256": "0xa582e16b3ee477026948b6b3005dbf6cc3cd26b7f5bb6b30d26a30d95817ba79", + "license": "MIT", + "urls": [ + "bzz-raw://f73e7a540120fa614930131a589959d812bc9934c5e28badda026667ce5b69a6", + "dweb:/ipfs/QmdS18B1tw8Lx4dS7SjATik8EJNEr6zX2jD3ujRZqfJd52" + ] + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "keccak256": "0x4bbae1ece9f02b258df5f4e9ace2bca49d3a856d573af95fe18bb674489ba26f", + "license": "MIT", + "urls": [ + "bzz-raw://7849a819f44fb311a6f860a031082721ac1e18fffba4ef5ab24d67c646b6d580", + "dweb:/ipfs/QmRxeaBmcW49R7xnSTHTCtbWh76LEgRjkQMkRX4fWdBmBD" + ] + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "keccak256": "0x44adba74f336c548fa63c94f2f1c344c96320076668a7f71767ef9f66a0aa49c", + "license": "MIT", + "urls": [ + "bzz-raw://e2d46b52b4a233a2684994ac802510f4d57473394161398a4352e0bea5066d8f", + "dweb:/ipfs/QmPxZ6mgiQoFfXtGNvkYEWMyeVBAaUbKLcbMJ73gqEZQXE" + ] + }, + "contracts/Vault/INftVault.sol": { + "keccak256": "0x1b55813c809306ff889c9a07ea9aae68a4267568b5d09226096779b2bc8f552c", + "license": "MIT", + "urls": [ + "bzz-raw://a890283e8f67d5c2d8ff78486e4d2c214587aac76dd941f5d0a3a7a1b02b2280", + "dweb:/ipfs/QmUBhfyiit6VHerjJGmQL2q9C3P3XiX1gjv97jVx37qn6v" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "keccak256": "0x6392f2cfe3a5ee802227fe7a2dfd47096d881aec89bddd214b35c5b46d3cd941", + "license": "MIT", + "urls": [ + "bzz-raw://bd9c47a375639888e726a99da718890ba16d17d7ad9eacb0ccc892d46d1b3ee0", + "dweb:/ipfs/Qmb41W5RUjy2sWg49A2rMnxekSeEk6SvGyJL5tyCCSr7un" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "keccak256": "0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329", + "license": "MIT", + "urls": [ + "bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95", + "dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238", + "license": "MIT", + "urls": [ + "bzz-raw://f5a7b96e511be78d5cdf635c784e6ab8cdd38625bb8cafb8a80914a1c89cf0f6", + "dweb:/ipfs/QmVzTCwJxQAkjRQHboT5QrvsVJGWQHgfEjeTbvyxoKBrds" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68", + "license": "MIT", + "urls": [ + "bzz-raw://daae589a9d6fa7e55f99f86c0a16796ca490f243fb3693632c3711c0646c1d56", + "dweb:/ipfs/QmR3zpd7wNw3rcUdekwiv6FYHJqksuTCXLVioTxu6Fbxk3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1", + "license": "MIT", + "urls": [ + "bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269", + "dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "license": "MIT", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f0200000200000000000000000000000000000000000000000000000000000000d428b3d22b9d43b26182a61bca7ec11e0198c7cd6599abee921a4f1b32fb5aa2", + "deployedBytecode": "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f0200000200000000000000000000000000000000000000000000000000000000d428b3d22b9d43b26182a61bca7ec11e0198c7cd6599abee921a4f1b32fb5aa2", + "factoryDeps": [ + "0x0004000000000002001a00000000000200000000030100190000006003300270000013700530019700030000005103550002000000010355000013700030019d00000001002001900000016d0000c13d0000008004000039000000400040043f000000040050008c0000019f0000413d000000000201043b000000e002200270000013790020009c000001b70000213d000013920020009c000001ca0000a13d000013930020009c000001fd0000a13d000013940020009c000006ad0000a13d000013950020009c00000bb50000613d000013960020009c00000aa70000613d000013970020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000004403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000d00040020003d0000000d0450006a000c00240020003d0000000c02100360000000000302043b0000001f0240008a000013b304200197000013b306300197000000000746013f000000000046004b0000000006000019000013b306004041000000000023004b0000000008000019000013b308008041000013b30070009c000000000608c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000c06043b000013ab00c0009c00000d0b0000213d000000050dc002100000000006d500490000002007300039000013b303600197000013b308700197000000000938013f000000000038004b0000000003000019000013b303004041000000000067004b0000000006000019000013b306002041000013b30090009c000000000306c019000000000003004b00000d0b0000c13d0000000c03000029000b00200030003d0000000b03100360000000000303043b000013b306300197000000000846013f000000000046004b0000000006000019000013b306004041000000000023004b0000000009000019000013b309008041000013b30080009c000000000609c019000000000006004b00000d0b0000c13d0000000d03300029000000000631034f000000000906043b000013ab0090009c00000d0b0000213d000000050b9002100000000006b500490000002003300039000013b308600197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000063004b0000000006000019000013b306002041000013b300e0009c000000000806c019000000000008004b00000d0b0000c13d0000000b06000029000a00200060003d0000000a06100360000000000606043b000013b308600197000000000a48013f000000000048004b0000000004000019000013b304004041000000000026004b0000000002000019000013b302008041000013b300a0009c000000000402c019000000000004004b00000d0b0000c13d0000000d02600029000000000421034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002006200039000013b302400197000013b30e600197000000000f2e013f00000000002e004b0000000002000019000013b302004041000000000046004b0000000004000019000013b304002041000013b300f0009c000000000204c019000000000002004b00000d0b0000c13d0000000a0200002900090060002000920000000902100360000000000402043b000013730040009c00000d0b0000213d0000003f02d00039000013b402200197000013cb0020009c000009d30000213d0000008002200039000000400020043f0000008000c0043f000000000c7d001900000000005c004b00000d0b0000213d00000000007c004b000000bd0000a13d0000008002000039000000000d71034f000000000d0d043b0000137300d0009c00000d0b0000213d00000020022000390000000000d2043500000020077000390000000000c7004b000000b30000413d000000400200043d0000003f07b00039000013b4077001970000000007720019000000000027004b000000000c000039000000010c004039000013ab0070009c000009d30000213d0000000100c00190000009d30000c13d000000400070043f000000000092043500000000073b0019000000000057004b00000d0b0000213d000000000037004b000000d60000a13d0000000009020019000000000b31034f000000000b0b043b00000020099000390000000000b904350000002003300039000000000073004b000000cf0000413d0000003f03a00039000013b407300197000000400300043d0000000007730019000000000037004b00000000090000390000000109004039000013ab0070009c000009d30000213d0000000100900190000009d30000c13d000000400070043f000000000083043500000000076a0019000000000057004b00000d0b0000213d000000000067004b000000f00000a13d0000000005030019000000000861034f000000000808043b000000200550003900000000008504350000002006600039000000000076004b000000e90000413d000000800100003900000000050004104dbc25930000040f000800000001001d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc33a20000040f00000009010000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000064020000390000000202200367000000000202043b000000000012004b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000024010000390000000201100367000000000601043b00000000040004160000000701000029000600000002001d000000080300002900000000050300194dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000800000001001d000500000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000300000001001d000000070200002900000006030000294dbc46c30000040f000000000301001900000007010000290000000002000410000400000003001d00000008040000294dbc36eb0000040f000013b501000041000000000010044300000006010000290000137301100197000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000200000002001d000000000012043500000000010004140000000702000029000000040020008c00001dfc0000613d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000000050000006b00001df00000c13d00001378011001c7000000070200002900001df50000013d0000000002000416000000000002004b00000d0b0000c13d0000001f025000390000137102200197000000c002200039000000400020043f0000001f0350018f0000137204500198000000c0024000390000017e0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b0000017a0000c13d000000000003004b0000018b0000613d000000000141034f0000000303300210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000000400050008c00000d0b0000413d000000c00100043d000013730010009c00000d0b0000213d000000e00200043d000013730020009c00000d0b0000213d000000800010043f000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a000200443000001000010044300000002010000390000012000100443000013740100004100004dbd0001042e000000000005004b00000d0b0000c13d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000002000411000000000012004b000001f50000c13d000000000100001900004dbd0001042e0000137a0020009c000001df0000a13d0000137b0020009c000003e20000a13d0000137c0020009c000007620000a13d0000137d0020009c00000bcf0000613d0000137e0020009c00000ac10000613d0000137f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d0000dead01000039000000800010043f000013aa0100004100004dbd0001042e0000139f0020009c000004a00000213d000013a50020009c000007e40000213d000013a80020009c00000ac50000613d000013a90020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000000000006004b00000ce50000c13d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013870020009c000005520000213d0000138d0020009c000008790000213d000013900020009c00000af20000613d000013910020009c00000d0b0000c13d000000640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000402043b0000002402100370000000000202043b0000004401100370000000000301043b00000000010400194dbc47450000040f00000b9d0000013d000000400100043d00001377020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000139a0020009c0000055f0000213d0000139d0020009c000009180000613d0000139e0020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013ab0020009c00000d0b0000213d0000000d0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000205000367000000a402500370000000000202043b000000000012004b00000b940000413d0000000e01000029000e00040010003d0000002403100039000000000135034f000000000201043b00000000060000310000000e0160006a0000001f0110008a000013b304100197000013b307200197000000000847013f000000000047004b0000000007000019000013b307004041000000000012004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e02200029000000000725034f000000000c07043b000013ab00c0009c00000d0b0000213d000000050dc002100000000007d600490000002002200039000013b308700197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000072004b0000000007000019000013b307002041000013b300a0009c000000000807c019000000000008004b00000d0b0000c13d0000002007300039000000000375034f000000000303043b000013b308300197000000000948013f000000000048004b0000000008000019000013b308004041000000000013004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d000000200e7000390000000007e5034f000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000415034f000000000804043b000013ab0080009c00000d0b0000213d000b0005008002180000000b0460006a0000002007100039000013b301400197000013b30f700197000000000a1f013f00000000001f004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300a0009c000000000104c019000000000001004b00000d0b0000c13d0000006001e0008a000000000115034f000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000002c50000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000002bc0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000002df0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000002d80000413d0000000b030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000b08700029000000000068004b00000d0b0000213d0000000d06000029000b00040060003d000000000078004b000002fc0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000002f50000413d00000000050004104dbc25930000040f0000000d0200002900000024032000390000000205000367000000000235034f000000000202043b00000000060000310000000b0460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000d00000001001d000000000008004b00000d0b0000c13d0000000b01200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000a0005008002180000000a0e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d00090060001000920000000901500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40a100197000000400100043d000000000ea1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000003920000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000003890000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000003ac0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000003a50000413d0000000a030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000a08700029000000000068004b00000d0b0000213d000000000078004b000003c70000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000003c00000413d00000000050004104dbc25930000040f00000002030003670000000e02300360000a00000001001d000000000102043b000013730010009c00000d0b0000213d0000000902300360000000000202043b000013730020009c00000d0b0000213d0000006404300370000000000604043b0000004403300370000000000503043b0000000d030000290000000a040000294dbc37d60000040f000800000002001d000700000001001d0000000d0210006b000020010000613d00001ffb0000813d000000400100043d000013d602000041000001f70000013d000013820020009c000005c90000213d000013850020009c000009a80000613d000013860020009c00000d0b0000c13d000001440050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d0000008402100370000000000202043b000c00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000a00000002001d000000c402100370000000000302043b000000000003004b0000000002000039000000010200c039000b00000003001d000000000023004b00000d0b0000c13d000000e401100370000000000101043b000900000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000301043b00000008010000290000000e02000029000600000003001d4dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000b0000006b0000000d030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000010402100370000000000202043b0000012401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000902000029000000000021043500000064015000390000000a02000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000b00000005001d0000000401500039000900000002001d000000000021043500000000010004140000000702000029000000040020008c000004740000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011090000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000a0010006b00000b940000413d00000008010000290000000e0200002900000006030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000903000029000000000032043500000044024000390000000d030000290000000000320435000b00000004001d000000240240003900000000001204350000000003000414000d00000001001d000000040010008c0000137a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013a70000013d000013a00020009c000008bf0000213d000013a30020009c00000afd0000613d000013a40020009c00000d0b0000c13d000001640050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d000013730020009c00000d0b0000213d000000c402100370000000000202043b000900000002001d000000e402100370000000000302043b000000000003004b0000000002000039000000010200c039000a00000003001d000000000023004b00000d0b0000c13d0000010401100370000000000101043b000800000001001d000000ff0010008c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000e020000290000000d030000294dbc46c30000040f000013b5020000410000000000200443000700000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010300008a0000000a0000006b0000000c030060290000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400500043d000013cd01000041000000000015043500000002010003670000012402100370000000000202043b0000014401100370000000000101043b000000c4045000390000000000140435000000a401500039000000000021043500000084015000390000000802000029000000000021043500000064015000390000000902000029000000000021043500000044015000390000000000310435000000000100041000001373011001970000002402500039000000000012043500000000010004110000137302100197000a00000005001d0000000401500039000800000002001d000000000021043500000000010004140000000702000029000000040020008c000005260000613d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013ce011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000011450000613d0000000a01000029000013ab0010009c000009d30000213d0000000a01000029000000400010043f000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000090010006b00000b940000413d00000006010000290000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000004024000390000000803000029000000000032043500000044024000390000000c030000290000000000320435000a00000004001d000000240240003900000000001204350000000003000414000c00000001001d000000040010008c000013cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013f90000013d000013880020009c000008fa0000213d0000138b0020009c00000b120000613d0000138c0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d000013cc01000041000000800010043f000013aa0100004100004dbd0001042e0000139b0020009c000009bd0000613d0000139c0020009c00000d0b0000c13d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013ab0030009c00000d0b0000213d0000000e0350006a000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000b00040020003d0000000b02100360000000000202043b000c00000002001d000013730020009c00000d0b0000213d0000000e02000029000900040020003d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000800000004001d000000240240003900000000001204350000000003000414000700000001001d000000040010008c000012d20000c13d0000000103000031000000200030008c00000020040000390000000004034019000012ff0000013d000013830020009c000009d90000613d000013840020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d00000000070400190000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b000000000607001900000d0b0000213d000000000004004b000005f40000613d000000000421034f000000000404043b000013730040009c00000d0b0000213d000000200660003900000000004604350000002002200039000000000032004b000005eb0000413d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005043002100000003f06400039000013b406600197000000400700043d0000000006670019000e00000007001d000000000076004b00000000070000390000000107004039000013ab0060009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400060043f0000000e0600002900000000003604350000000004240019000000000054004b00000d0b0000213d000000000003004b000006270000613d0000000e03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000042004b000006200000413d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000004000019000013b304008041000013b303300197000000000003004b0000000006000019000013b306004041000013b30030009c000000000604c019000000000006004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b000013ab0030009c000009d30000213d00000005063002100000003f04600039000013b404400197000000400700043d0000000004470019000d00000007001d000000000074004b00000000070000390000000107004039000013ab0040009c000009d30000213d0000000100700190000009d30000c13d0000002402200039000000400040043f0000000d0400002900000000043404360000000006260019000000000056004b00000d0b0000213d000000000003004b0000065a0000613d0000000d03000029000000000721034f000000000707043b000000200330003900000000007304350000002002200039000000000062004b000006530000413d0000006402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403200039000000000331034f000000000303043b0000000008030019000013ab0030009c00000d0b0000213d00000024022000390000000503800210000c00000023001d0000000c0050006b00000d0b0000213d0000008403100370000000000303043b000b00000003001d000013730030009c00000d0b0000213d0000000d030000290000000005030433000000000005004b0000000003000019000006910000613d00000000030000190000000006000019000000050730021000000000077400190000000007070433000000000067001a00000a3f0000413d00000000066700190000000103300039000000000053004b000006810000413d000000000006004b0000000003000019000006910000613d000013cc036000d100000000046300d9000013cc0040009c00000a3f0000c13d000000a401100370000000000501043b000000000400041000000000010300190000000003080019000a00000003001d4dbc42e80000040f000900000001001d0000000a0000006b00000a3f0000613d0000000c01000029000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d00000080010000390000000e020000290000000d0300002900000000050004100000000b060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000090100002900000bc40000013d000013980020009c00000a3b0000613d000013990020009c00000d0b0000c13d000000840050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000c00040020003d0000000c03100360000000000303043b000d00000003001d000013ab0030009c00000d0b0000213d00000024032000390000000d020000290000000502200210000a00000003001d000b00000002001d0000000003320019000000000053004b00000d0b0000213d0000004402100370000000000202043b000900000002001d000013730020009c00000d0b0000213d000700000003001d0000006401100370000000000101043b000800000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000080010006b00000b940000413d0000000d0000006b000001d90000613d0000000c010000290000002001100039000800000001001d0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000c0010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000d0100002900000000001304350000000706000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000a04000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000007240000413d000000000200041600000006010000294dbc49590000040f000b00000001001d0000000021010434000700000002001d000000000001004b00000a3f0000613d00000005011002100000000b0110002900000000010104330000000e0010006c000008760000413d00000007010000290000000001010433000e00000001001d000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000500000002001d000000000012043500000000010004140000000c02000029000000040020008c00001c300000613d0000000502000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000e0000006b00001c240000c13d00001378011001c70000000c0200002900001c290000013d000013800020009c00000a450000613d000013810020009c00000d0b0000c13d000000c40050008c00000d0b0000413d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000a00000002001d0000004402100370000000000202043b000b00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000b940000413d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b00000000040004160000000e01000029000c00000002001d0000000a030000290000000b0500002900000009060000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000c030000294dbc46c30000040f000000000301001900000000020004110000000e01000029000900000003001d0000000b040000294dbc36eb0000040f000013b50100004100000000001004430000000c010000290000137301100197000e00000001001d00000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013c301000041000c00000002001d000000000012043500000000010004140000000e02000029000000040020008c000011220000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000a0000006b000011160000c13d00001378011001c70000000e020000290000111b0000013d000013a60020009c00000b610000613d000013a70020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000008600000413d00000005010000290000000e020000294dbc49590000040f000e00000001001d0000000021010434000400000002001d000000000001004b00000a3f0000613d00000005011002100000000e0110002900000000010104330000000d0010006c00001aa30000813d000000400100043d000013db02000041000001f70000013d0000138e0020009c00000b6a0000613d0000138f0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc236d0000040f000c00000001001d000b00000002001d0000000009050019000000000a060019000900000007001d000a00000003001d0000000032030434000000000002004b00000000010000190000089e0000613d00000000010000190000000005000019000000050610021000000000066300190000000006060433000000000056001a00000a3f0000413d00000000055600190000000101100039000000000021004b0000088e0000413d000000000005004b00000000010000190000089e0000613d000013cc015000d100000000025100d9000013cc0020009c00000a3f0000c13d000000000500041100000000060004100000000002040019000000000309001900000000040a00190000000007080019000e00000009001d000d0000000a001d4dbc3fe50000040f0000000d030000290000000e02000029000000000003004b00000a3f0000613d000800000001001d00000005013002100000000001120019000000200110008a0000000201100367000000000401043b000013730040009c00000d0b0000213d0000000c010000290000000b020000290000000a03000029000000000500041000000009060000294dbc27dd0000040f0000002001000039000000400200043d000e00000002001d0000000002120436000000080100002900000bc40000013d000013a10020009c00000b970000613d000013a20020009c00000d0b0000c13d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c000009d30000213d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d0b0000213d000000000004004b000008ec0000613d0000008004000039000000000521034f000000000505043b000013730050009c00000d0b0000213d000000200440003900000000005404350000002002200039000000000032004b000008e30000413d0000006402100370000000000502043b000013730050009c00000d0b0000213d0000000402100370000000000702043b0000002402100370000000000202043b0000008401100370000000000601043b00000080030000390000000004000411000000000107001900000d020000013d000013890020009c00000ba40000613d0000138a0020009c00000d0b0000c13d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001200000005001d001100000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000120440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc47890000040f00000b9d0000013d000000a40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000002402100370000000000202043b000d00000002001d0000000402100370000000000202043b000e00000002001d0000004402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d000b00040020003d0000000b03100360000000000303043b000c00000003001d000013ab0030009c00000d0b0000213d00000024022000390000000c030000290000000503300210000900000002001d000a00000003001d0000000003230019000000000053004b00000d0b0000213d0000006402100370000000000202043b000800000002001d000013730020009c00000d0b0000213d000600000003001d0000008401100370000000000101043b000700000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000070010006b00000b940000413d0000000c0000006b00000a3f0000613d0000000a020000290000000b012000290000000201100367000000000101043b000700000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000137301100197000000070010006b000011060000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000500000001001d0000000a010000290000003f01100039000a13b40010019b000000400300043d0000000a01300029000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000c0100002900000000001304350000000606000029000000000060007c00000d0b0000213d000000020100036700000000020300190000000904000029000000000541034f000000000505043b000013730050009c00000d0b0000213d000000200220003900000000005204350000002004400039000000000064004b000009900000413d00000005010000290000000e020000294dbc4b210000040f000400000001001d0000000021010434000e00000002001d000000000001004b000001d90000613d0000000e0100002900000000010104330000000d0010006c00001b2b0000a13d000000400100043d000013d902000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001000000003001d000f00000000003d000e00000001001d000d00000002001d000080050100003900000044030000390000000004000415000000100440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc49590000040f00000bc00000013d000001240050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000002303200039000000000053004b00000d0b0000813d0000000403200039000000000331034f000000000403043b000013ab0040009c000009d30000213d00000005034002100000003f06300039000013b406600197000013cb0060009c00000d040000a13d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000c401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000201043b0000000201000367000000e403100370000000000303043b000000000023004b00000b940000413d0000004402100370000000000302043b0000006402100370000000000402043b0000008402100370000000000502043b000000a401100370000000000601043b0000000e010000290000000d020000294dbc37d60000040f00001375030000410000000000300443000000000300041200000004003004430000002400000443000b00000001001d000a00000002001d0000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d0000000c02000029000913730020019b000000000101043b0000000e020000290000000d030000294dbc46c30000040f0000000003010019000c00000003001d00000000020004110000000e010000290000000b040000294dbc36eb0000040f0000000d0100002900000000020004110000000c030000290000000a040000294dbc36eb0000040f000013c701000041000000400200043d0000000000120435000e00000002001d00000004012000390000000902000029000000000021043500000000010004140000000c030000290000000002030019000000040030008c00000ff80000c13d0000000103000031000000200030008c00000020040000390000000004034019000010230000013d00000000010500194dbc236d0000040f000000000006004b00000c3d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000001040050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000002403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000a403100370000000000303043b000d00000003001d000013730030009c00000d0b0000213d000000e403100370000000000403043b000000000004004b0000000003000039000000010300c039000c00000004001d000000000034004b00000d0b0000c13d000a00040020003d0000000a01100360000000000101043b000b00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000b020000290000000e030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011520000c13d0000000103000031000000200030008c000000200400003900000000040340190000117f0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25620000040f0000000005000412001800000005001d001700000000003d000e00000001001d000d00000002001d000c00000003001d000b00000004001d000080050100003900000044030000390000000004000415000000180440008a000000050440021000001375020000414dbc4d940000040f00000000050100190000000e010000290000000d020000290000000c030000290000000b040000294dbc48760000040f00000b9d0000013d00000000010500194dbc25400000040f4dbc42e80000040f00000bc00000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000008402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a402100370000000000202043b000c00000002001d0000002402100370000000000202043b000b00000002001d0000004402100370000000000202043b000a00000002001d0000006401100370000000000101043b000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0010006b00000ea90000813d000013dc01000041000000800010043f000013dd0100004100004dbe000104300000000001000416000000000001004b00000d0b0000c13d0000000001000412001600000001001d001500200000003d000080050100003900000044030000390000000004000415000000160440008a00000bae0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc25050000040f0000000003000412001a00000003001d001900000000003d000e00000001001d000d00000002001d0000800501000039000000440300003900000000040004150000001a0440008a000000050440021000001375020000414dbc4d940000040f0000000e020000290000000d030000294dbc4b210000040f00000bc00000013d000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013730020009c00000d0b0000213d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d000000a401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000c4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e020000290000000d030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000044020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000b00000004001d000000240240003900000000001204350000000003000414000a00000001001d000000040010008c0000103e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000106b0000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f000000000605001900000000050004114dbc27dd0000040f00000b9d0000013d000000c40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000e00000002001d000013ab0020009c00000d0b0000213d0000000e0250006a000013ac0020009c00000d0b0000213d000000840020008c00000d0b0000413d0000002402100370000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000008401100370000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000206000367000000a402600370000000000202043b000000000012004b00000ee20000813d000000400100043d000013dc02000041000001f70000013d0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc243b0000040f4dbc25930000040f000000400200043d0000000000120435000013700020009c00001370020080410000004001200210000013cf011001c700004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d0000000001000412001400000001001d001300000000003d000080050100003900000044030000390000000004000415000000140440008a000000050440021000001375020000414dbc4d940000040f0000137301100197000000800010043f000013aa0100004100004dbd0001042e0000000001000416000000000001004b00000d0b0000c13d00000000010500194dbc24e10000040f000000000705001900000000080600190000000005000411000000000607001900000000070800194dbc3fe50000040f0000002002000039000000400300043d000e00000003001d00000000022304364dbc242e0000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f00004dbd0001042e000000e40050008c00000d0b0000413d0000000002000416000000000002004b00000d0b0000c13d0000000402100370000000000202043b000013ab0020009c00000d0b0000213d0000000003250049000013ac0030009c00000d0b0000213d000000840030008c00000d0b0000413d0000008403100370000000000303043b000e00000003001d000013730030009c00000d0b0000213d000000c403100370000000000403043b000000000004004b0000000003000039000000010300c039000d00000004001d000000000034004b00000d0b0000c13d000b00040020003d0000000b01100360000000000101043b000c00000001001d000013730010009c00000d0b0000213d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000a4020000390000000202200367000000000202043b000000000012004b00000b940000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000600000001001d0000000c020000290000000a030000294dbc46c30000040f000013af02000041000000400400043d000000000024043500000024020000390000000202200367000000000202043b000000440340003900000000002304350000000002000411000013730220019700000004034000390000000000230435000900000004001d000000240240003900000000001204350000000003000414000800000001001d000000040010008c000011a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000011d10000013d000b00000003001d000c00000002001d000d00000001001d000700000008001d000800000004001d000600000007001d000a00000006001d00090005006002180000000902500029000000200120008a0000000201100367000000000101043b000e00000001001d000013730010009c00000d0b0000213d000400000002001d000500000005001d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00001373011001970000000e0010006b00000d0d0000c13d00000005010000290000000201100367000000000401043b000013730040009c00000d0b0000213d00000000050004100000000d010000290000000c020000290000000b030000294dbc25930000040f000d00000001001d00000005010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d020000294dbc33a20000040f0000000a01000029000013ab0010009c000009d30000213d00000009010000290000003f01100039000013b401100197000000400300043d0000000001130019000000000031004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f0000000a0100002900000000001304350000000406000029000000000060007c000000050500002900000d0b0000213d000000000056004b00000c960000a13d00000002010003670000000002030019000000000451034f000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000002005500039000000000065004b00000c8d0000413d0000000d0100002900000008020000290000000004000410000000000504001900000007060000294dbc3a170000040f000d00000001001d0000000001010433000000000001004b00000a3f0000613d00000005011002100000000d011000290000000001010433000c00000001001d000013b50100004100000000001004430000000e0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000b00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040020008c00000cd00000613d0000000b02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000e020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000016a60000613d0000000b01000029000013ab0010009c000009d30000213d0000000b01000029000000400010043f0000000d010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000d010000294dbc25740000040f000000000201043300000006010000294dbc37720000040f000000400200043d000e00000002001d000000200100003900000000021204360000000d0100002900000bc40000013d000a00000006001d000b00000008001d000c00000007001d000d00000004001d000e00000005001d0000000204500367000000000404043b000013730040009c00000d0b0000213d00000000050004104dbc25930000040f00000000020100190000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000900000002001d4dbc33a20000040f00000000030000310000000e010000290000000a020000294dbc23430000040f000000000301001900000009010000290000000d0200002900000000040004100000000c050000290000000b060000294dbc3a170000040f00000bc00000013d00000024022000390000008006600039000000400060043f000000800040043f0000000003230019000000000053004b00000d100000a13d000000000100001900004dbe00010430000000400100043d000013d302000041000001f70000013d000000000004004b00000d1c0000613d0000008004000039000000000621034f000000000606043b000013730060009c00000d0b0000213d000000200440003900000000006404350000002002200039000000000032004b00000d130000413d0000002402100370000000000302043b000013ab0030009c00000d0b0000213d0000002302300039000000000052004b0000000004000019000013b304008041000013b302200197000000000002004b0000000006000019000013b306004041000013b30020009c000000000604c019000000000006004b00000d0b0000c13d0000000402300039000000000221034f000000000402043b000013ab0040009c000009d30000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b00000000080000390000000108004039000013ab0070009c000009d30000213d0000000100800190000009d30000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000056004b00000d0b0000213d000000000004004b00000d4d0000613d0000000004020019000000000731034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b00000d460000413d0000004403100370000000000403043b000013ab0040009c00000d0b0000213d0000002303400039000000000053004b0000000006000019000013b306008041000013b303300197000000000003004b0000000007000019000013b307004041000013b30030009c000000000706c019000000000007004b00000d0b0000c13d0000000403400039000000000331034f000000000603043b000013ab0060009c000009d30000213d00000005076002100000003f03700039000013b408300197000000400300043d0000000008830019000000000038004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000000006304350000000007470019000000000057004b00000d0b0000213d000000000006004b00000d7e0000613d0000000006030019000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000d770000413d0000006404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000d00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000d0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000db30000613d0000000d06000029000000000841034f000000000808043b000013730080009c00000d0b0000213d000000200660003900000000008604350000002004400039000000000074004b00000daa0000413d0000008404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000a00000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f0000000a0800002900000000006804350000000007470019000000000057004b00000d0b0000213d000000000006004b00000de60000613d0000000a06000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000ddf0000413d000000a404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000661034f000000000606043b000013ab0060009c000009d30000213d00000005076002100000003f08700039000013b408800197000000400900043d0000000008890019000900000009001d000000000098004b00000000090000390000000109004039000013ab0080009c000009d30000213d0000000100900190000009d30000c13d0000002404400039000000400080043f00000009080000290000000008680436000e00000008001d0000000007470019000000000057004b00000d0b0000213d000000000006004b00000e1a0000613d0000000906000029000000000841034f000000000808043b000000200660003900000000008604350000002004400039000000000074004b00000e130000413d000000c404100370000000000404043b000013ab0040009c00000d0b0000213d0000002306400039000000000056004b0000000007000019000013b307008041000013b306600197000000000006004b0000000008000019000013b308004041000013b30060009c000000000807c019000000000008004b00000d0b0000c13d0000000406400039000000000761034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d000000240740003900000008040000290000000504400210000c00000007001d000700000004001d000b00000074001d0000000b0050006b00000d0b0000213d000000e404100370000000000404043b000600000004001d000013730040009c00000d0b0000213d000000080000006b000001d90000613d000500200060003d0000000501100360000000000401043b000013730040009c00000d0b0000213d000000800100003900000000050004104dbc25930000040f0000000b02000029000200200020009200000002020003670000000203200360000400000001001d000000000103043b000300000001001d000013730010009c00000d0b0000213d00000009010000290000000001010433000000000001004b000100000000001d00000e670000613d0000000004000019000000000300001900000005054002100000000e055000290000000005050433000000000035001a00000a3f0000413d00000000033500190000000104400039000000000014004b00000e570000413d000000000003004b000100000000001d00000e670000613d000113cc003000d500000001013000f9000013cc0010009c00000a3f0000c13d0000000501200360000000000101043b000013730010009c00000d0b0000213d00000004020000294dbc33a20000040f00000007010000290000003f01100039000013b401100197000000400300043d0000000002130019000000000032004b0000000004000039000000010400403900000002010003670000010405100370000000000605043b000013ab0020009c000009d30000213d0000000100400190000009d30000c13d000000400020043f000000080200002900000000002304350000000b02000029000000000020007c00000d0b0000213d00000000020300190000000c04100360000000000404043b000013730040009c00000d0b0000213d000000200220003900000000004204350000000c040000290000002004400039000c00000004001d0000000b0040006c00000e830000413d00000004010000290000000102000029000000000400041000000000050400194dbc3a170000040f000e00000001001d000000030100002900001373041001970000000d010000290000000a020000290000000903000029000000000500041000000006060000294dbc27dd0000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00010010007400000a3f0000413d000020080000c13d000000400100043d000d00000001001d000020570000013d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000800000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000e0200002900000008030000294dbc46c30000040f000013af02000041000000400400043d0000000000240435000000000200041100001373022001970000000403400039000000000023043500000044024000390000000b030000290000000000320435000c00000004001d000000240240003900000000001204350000000003000414000b00000001001d000000040010008c000010900000c13d0000000103000031000000200030008c00000020040000390000000004034019000010bd0000013d0000000e010000290000000403100039000b00240010003d0000000b01600360000000000201043b0000000005000031000e00000003001d00000000013500490000001f0110008a000013b304100197000013b303200197000000000743013f000000000043004b0000000003000019000013b303004041000000000012004b0000000008000019000013b308008041000013b30070009c000000000308c019000000000003004b00000d0b0000c13d0000000e02200029000000000326034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d500490000002002200039000013b307300197000013b308200197000000000978013f000000000078004b0000000007000019000013b307004041000000000032004b0000000003000019000013b303002041000013b30090009c000000000703c019000000000007004b00000d0b0000c13d0000000b03000029000a00200030003d0000000a03600360000000000303043b000013b307300197000000000847013f000000000047004b0000000007000019000013b307004041000000000013004b0000000009000019000013b309008041000013b30080009c000000000709c019000000000007004b00000d0b0000c13d0000000e03300029000000000736034f000000000907043b000013ab0090009c00000d0b0000213d000000050b9002100000000007b500490000002003300039000013b308700197000013b30a300197000000000e8a013f00000000008a004b0000000008000019000013b308004041000000000073004b0000000007000019000013b307002041000013b300e0009c000000000807c019000000000008004b00000d0b0000c13d0000000a07000029000900200070003d0000000907600360000000000707043b000013b308700197000000000a48013f000000000048004b0000000004000019000013b304004041000000000017004b0000000001000019000013b301008041000013b300a0009c000000000401c019000000000004004b00000d0b0000c13d0000000e01700029000000000416034f000000000804043b000013ab0080009c00000d0b0000213d000000050a8002100000000004a500490000002007100039000013b301400197000013b30e700197000000000f1e013f00000000001e004b0000000001000019000013b301004041000000000047004b0000000004000019000013b304002041000013b300f0009c000000000104c019000000000001004b00000d0b0000c13d000000090100002900080060001000920000000801600360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b40e100197000000400100043d000000000ee1001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000005c004b00000d0b0000213d00000000002c004b00000f790000a13d000000000d010019000000000e26034f000000000e0e043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b00000f700000413d0000003f02b00039000013b40c200197000000400200043d000000000cc2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000059004b00000d0b0000213d000000000039004b00000f930000a13d000000000b020019000000000c36034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b00000f8c0000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000058004b00000d0b0000213d0000000005000410000000000078004b00000fae0000a13d0000000009030019000000000a76034f000000000a0a043b00000020099000390000000000a904350000002007700039000000000087004b00000fa70000413d4dbc25930000040f00000002020003670000000803200360000700000001001d000000000103043b000013730010009c00000d0b0000213d0000006403200370000000000603043b0000004402200370000000000402043b0000000d02000029000000070300002900000000050300194dbc37d60000040f000600000002001d000000070010006b00001c690000c13d00000008010000290000000201100367000000000101043b000500000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b00000005020000290000000d030000294dbc46c30000040f000500000001001d00000008010000290000000201100367000000000101043b000013730010009c00000d0b0000213d000000050200002900000007030000294dbc36670000040f00000000020004110000000d01000029000000050300002900000006040000294dbc36eb0000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000d00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000502000029000000040020008c00001cef0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001d1b0000013d0000000e03000029000013700030009c00001370030080410000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e05700029000010120000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b0000100e0000c13d000000000006004b0000101f0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010e20000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e0200002900000000020204330000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b020000290000000000210435000013700010009c00001370010080410000004001100210000013ca011001c700004dbd0001042e0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000105a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000010560000c13d000000000006004b000010670000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010ee0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000b00000001001d00000004012000390000000c02000029000000000021043500000000010004140000000a02000029000000040020008c000011f60000c13d000000400030008c00000040040000390000000004034019000012220000013d0000000c01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000010ac0000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000010a80000c13d000000000006004b000010b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000010fa0000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d0000000c010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000c00000001001d00000004012000390000000002000410000000000021043500000000010004140000000b02000029000000040020008c000012410000c13d000000400030008c000000400400003900000000040340190000126d0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010e90000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010f50000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011010000c13d00001bc80000013d000000400100043d000013da02000041000001f70000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011110000c13d00001bc80000013d000013c4011001c700008009020000390000000a030000290000000e0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d0000000100200190000011380000613d0000000c01000029000013ab0010009c000009d30000213d0000000c03000029000000400030043f00000024013000390000000a020000290000000000210435000013c501000041000000000013043500000004013000390000000902000029000000000021043500000000010004140000000e02000029000000040020008c0000128d0000c13d0000000104000031000000200040008c00000020030000390000000003044019000012b90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011400000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000114d0000c13d00001bc80000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000009057000290000116e0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000116a0000c13d000000000006004b0000117b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013240000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000014450000c13d000000400030008c00000040040000390000000004034019000014710000013d0000000901000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000905700029000011c00000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b000011bc0000c13d000000000006004b000011cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013300000613d0000001f01400039000000600110018f0000000902100029000000000012004b00000000010000390000000101004039000700000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000701000029000000400010043f000000200030008c00000d0b0000413d00000009010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000007020000290000000001120436000900000001001d00000004012000390000000002000410000000000021043500000000010004140000000802000029000000040020008c000015690000c13d000000400030008c00000040040000390000000004034019000015950000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000a020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000905700029000012110000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b0000120d0000c13d000000000006004b0000121e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000133c0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b0000141e0000c13d0000006403100039000013c00400004100000000004304350000004403100039000013c1040000410000000000430435000000240310003900000025040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013c2012001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000007057000290000125c0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000012580000c13d000000000006004b000012690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013480000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000008020000290000137303200197000b00000003001d0000000e0030006b000014300000c13d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000e020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000c05700029000012a80000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000012a40000c13d000000000006004b000012b50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f00030000000103550000000100200190000013540000613d0000001f01300039000000600110018f0000000c02100029000e00000002001d000013ab0020009c000009d30000213d0000000e02000029000000400020043f000000200040008c00000d0b0000413d0000000c020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000016b30000c13d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe000104300000000801000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000012ee0000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b000012ea0000c13d000000000006004b000012fb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000136e0000613d0000001f01400039000000600110018f0000000802100029000000000012004b00000000010000390000000101004039000600000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000601000029000000400010043f000000200030008c00000d0b0000413d00000008010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000006020000290000000001120436000800000001001d00000004012000390000000002000410000000000021043500000000010004140000000702000029000000040020008c000017230000c13d000000400030008c000000400400003900000000040340190000174f0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000132b0000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013370000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013430000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d00001bc80000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000603043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000130435000000600140021000001bd60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013750000c13d00001bc80000013d0000000b01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000013960000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000013920000c13d000000000006004b000013a30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000168e0000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000a01000029000000400010043f000000200030008c00000d0b0000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b1010000410000000a020000290000000001120436000b00000001001d00000004012000390000000002000410000000000021043500000000010004140000000d02000029000000040020008c000019800000c13d000000400030008c00000040040000390000000004034019000019ac0000013d0000000a01000029000013700010009c000013700200004100000000020140190000004002200210000013700030009c0000137003008041000000c001300210000000000121019f000013b0011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013e80000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013e40000c13d000000000006004b000013f50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000169a0000613d0000001f01400039000000600110018f0000000a02100029000000000012004b00000000010000390000000101004039000900000002001d000013ab0020009c000009d30000213d0000000100100190000009d30000c13d0000000901000029000000400010043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000013b10100004100000009020000290000000001120436000a00000001001d00000004012000390000000b02000029000000000021043500000000010004140000000c02000029000000040020008c00001a100000c13d000000400030008c0000004004000039000000000403401900001a3c0000013d0000000d0400002900000000030400190000000e03004029000000000003004b000017020000c13d0000004403100039000013be04000041000000000043043500000024031000390000001e040000390000000000430435000013bf030000410000000000310435000000040110003900000020030000390000000000310435000013b0012001c700004dbe0001043000000008030000290000000e0300402900000000040300190000137300300198000017140000c13d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000014600000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b0000145c0000c13d000000000006004b0000146d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000194b0000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000b030000290000000e0030006c0000127a0000613d0000000b030000290000000e020000290000000002034019000000000002004b000014350000613d00000007020000290000000002020433000000090300002900000000060304330000000b040000290000000e0040006c00000000030600190000000003022019000b00000003001d000000000602a01900000002050003670000006402500370000000000202043b000900000006001d000000000026004b000017210000413d0000008402500370000000000202043b0000000b0020006b0000196e0000413d0000000a03000029000800200030003d0000000802500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000a02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000803000029000700200030003d0000000703500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000708000029000500200080003d0000000508500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000a04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0004000500800218000000040e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000a04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000015220000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000015190000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b0000153c0000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b000015350000413d00000004030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000408700029000000000068004b00000d0b0000213d000000000078004b000015570000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000015500000413d00000000050004100000000d060000294dbc27dd0000040f000400090010007300000a3f0000413d0000000c0000006b00001ed30000c13d000000090010006b00001edf0000613d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000004030000294dbc36670000040f00001edf0000013d0000000702000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000705700029000015840000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000015800000c13d000000000006004b000015910000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019570000613d0000001f01400039000000e00110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a020000290000137302200197000800000002001d0000000c0020006b0000127a0000613d0000000c030000290000000a0200002900000000020340190000137302200198000014350000613d00000007030000290000000006030433000000090300002900000000030304330000000c0020006b00000000020600190000000002036019000c00000002001d000000000603c01900000002050003670000004402500370000000000202043b000900000006001d000000000026004b000017210000413d0000006402500370000000000202043b0000000c0020006b0000196e0000413d0000000b03000029000700200030003d0000000702500360000000000202043b000000000600003100000000033600490000001f0430008a000013b307400197000013b303200197000000000873013f000000000073004b0000000003000019000013b303004041000000000042004b0000000009000019000013b309008041000013b30080009c000000000309c019000000000003004b00000d0b0000c13d0000000b02200029000000000325034f000000000c03043b000013ab00c0009c00000d0b0000213d000000050dc002100000000003d600490000002002200039000013b308300197000013b309200197000000000a89013f000000000089004b0000000008000019000013b308004041000000000032004b0000000003000019000013b303002041000013b300a0009c000000000803c019000000000008004b00000d0b0000c13d0000000703000029000500200030003d0000000503500360000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b03300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000000508000029000400200080003d0000000408500360000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d0003000500800218000000030e60006a0000002007400039000013b304e00197000013b30f700197000000000a4f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b300a0009c00000000040ec019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0ad00039000013b40aa00197000000000e1a0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000016470000a13d000000000d010019000000000a25034f000000000e0a043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b0000163e0000413d0000003f02b00039000013b40a200197000000400200043d000000000ca2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000016610000a13d000000000b020019000000000a35034f000000000a0a043b000000200bb000390000000000ab04350000002003300039000000000093004b0000165a0000413d00000003030000290000003f03300039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f00000000008304350000000308700029000000000068004b00000d0b0000213d000000000078004b0000167c0000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000016750000413d00000000050004100000000e060000294dbc27dd0000040f000300090010007300000a3f0000413d0000000d0000006b00001fb00000c13d000000090010006b00001fbc0000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000003030000294dbc36670000040f00001fbc0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016950000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016a10000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016ae0000c13d00001bc80000013d000013c7020000410000000e05000029000000000025043500000004025000390000000d05000029000000000052043500000000020004140000000905000029000000040050008c000016eb0000613d0000000e01000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000009020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f00000020073001900000000e05700029000016d80000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000016d40000c13d000000000006004b000016e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001a540000613d0000001f01300039000000600110018f0000000e01100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d0000000e020000290000000002020433000e00000002001d00000000030004160000000a0330006c00001bec0000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000d02000029000000040020008c00001bdb0000c13d000000010200003900001be70000013d000000090300002900000000050304330000000b0300002900000000030304330000000d060000290000000e0060006b00000000040300190000000004052019000000000305a01900000002050003670000006406500370000000000606043b000000000063004b000019630000813d000013bd03000041000000000031043500001378012001c700004dbe00010430000000070200002900000000050204330000000c0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000c00000003001d000000000502c019000800000005001d0000000a0050006c0000196b0000813d000013bd02000041000001f70000013d0000000602000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000006057000290000173e0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b0000173a0000c13d000000000006004b0000174b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000019700000613d0000001f01400039000000e00110018f0000000601100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d0000000a030000290000000c0030006b0000127a0000613d0000000a0300002900000000020300190000000c02004029000000000002004b000014350000613d00000006020000290000000002020433000000080300002900000000040304330000000a050000290000000c0050006b00000000030400190000000003022019000c00000003001d000000000402a01900000002050003670000006402500370000000000202043b000a00000004001d000000000024004b000017210000413d0000008402500370000000000202043b0000000c0020006b0000196e0000413d0000000b040000290000002003400039000000000235034f000000000202043b000000000600003100000000044600490000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b02200029000000000825034f000000000c08043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002200039000013b309800197000013b30a200197000000000b9a013f00000000009a004b0000000009000019000013b309004041000000000082004b0000000008000019000013b308002041000013b300b0009c000000000908c019000000000009004b00000d0b0000c13d0000002008300039000000000385034f000000000303043b000013b309300197000000000a79013f000000000079004b0000000009000019000013b309004041000000000043004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b03300029000000000935034f000000000909043b000013ab0090009c00000d0b0000213d0008000500900218000000080a60006a0000002003300039000013b30ea00197000013b30f300197000000000bef013f0000000000ef004b000000000e000019000013b30e0040410000000000a3004b000000000a000019000013b30a002041000013b300b0009c000000000e0ac01900000000000e004b00000d0b0000c13d0000002008800039000000000885034f000000000808043b000013b30a800197000000000b7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300b0009c000000000704c019000000000007004b00000d0b0000c13d0000000b04800029000000000745034f000000000807043b000013ab0080009c00000d0b0000213d000000050a800210000000000ba600490000002007400039000013b304b00197000013b30e700197000000000f4e013f00000000004e004b0000000004000019000013b3040040410000000000b7004b000000000b000019000013b30b002041000013b300f0009c00000000040bc019000000000004004b00000d0b0000c13d0000000b04500360000000000404043b000013730040009c00000d0b0000213d0000003f0bd00039000013b40bb00197000000000e1b0019000013ab00e0009c000009d30000213d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000017fe0000a13d000000000d010019000000000b25034f000000000e0b043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000017f50000413d00000008020000290000003f02200039000013b40b200197000000400200043d000000000cb2001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f00000000009204350000000809300029000000000069004b00000d0b0000213d000000000039004b000018190000a13d000000000b020019000000000c35034f000000000c0c043b000000200bb000390000000000cb04350000002003300039000000000093004b000018120000413d0000003f03a00039000013b409300197000000400300043d0000000009930019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000018330000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b0000182c0000413d00000000050004100000000d060000294dbc27dd0000040f0000000e0200002900000024032000390000000205000367000000000235034f000000000202043b0000000006000031000000090460006a0000001f0440008a000013b307400197000013b308200197000000000978013f000000000078004b0000000008000019000013b308004041000000000042004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000e00000001001d000000000008004b00000d0b0000c13d0000000901200029000000000215034f000000000c02043b000013ab00c0009c00000d0b0000213d000000050dc002100000000008d600490000002002100039000013b301800197000013b309200197000000000a19013f000000000019004b0000000001000019000013b301004041000000000082004b0000000008000019000013b308002041000013b300a0009c000000000108c019000000000001004b00000d0b0000c13d0000002001300039000000000315034f000000000303043b000013b308300197000000000978013f000000000078004b0000000008000019000013b308004041000000000043004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000903300029000000000835034f000000000908043b000013ab0090009c00000d0b0000213d000000050b9002100000000008b600490000002003300039000013b30a800197000013b30e300197000000000fae013f0000000000ae004b000000000a000019000013b30a004041000000000083004b0000000008000019000013b308002041000013b300f0009c000000000a08c01900000000000a004b00000d0b0000c13d0000002001100039000000000815034f000000000808043b000013b30a800197000000000e7a013f00000000007a004b0000000007000019000013b307004041000000000048004b0000000004000019000013b304008041000013b300e0009c000000000704c019000000000007004b00000d0b0000c13d0000000904800029000000000745034f000000000707043b000800000007001d000013ab0070009c00000d0b0000213d0000000807000029000000050a700210000000000ea600490000002007400039000013b304e00197000013b30f70019700000000084f013f00000000004f004b0000000004000019000013b3040040410000000000e7004b000000000e000019000013b30e002041000013b30080009c00000000040ec019000000000004004b00000d0b0000c13d00040060001000920000000401500360000000000401043b000013730040009c00000d0b0000213d0000003f01d00039000013b408100197000000400100043d000000000e81001900000000001e004b000000000f000039000000010f004039000013ab00e0009c000009d30000213d0000000100f00190000009d30000c13d0000004000e0043f0000000000c10435000000000c2d001900000000006c004b00000d0b0000213d00000000002c004b000018cc0000a13d000000000d010019000000000825034f000000000e08043b0000137300e0009c00000d0b0000213d000000200dd000390000000000ed043500000020022000390000000000c2004b000018c30000413d0000003f02b00039000013b408200197000000400200043d000000000c82001900000000002c004b000000000d000039000000010d004039000013ab00c0009c000009d30000213d0000000100d00190000009d30000c13d0000004000c0043f000000000092043500000000093b0019000000000069004b00000d0b0000213d000000000039004b000018e60000a13d000000000b020019000000000835034f000000000808043b000000200bb0003900000000008b04350000002003300039000000000093004b000018df0000413d0000003f03a00039000013b408300197000000400300043d0000000009830019000000000039004b000000000b000039000000010b004039000013ab0090009c000009d30000213d0000000100b00190000009d30000c13d000000400090043f0000000808000029000000000083043500000000087a0019000000000068004b00000d0b0000213d000000000078004b000019010000a13d0000000006030019000000000975034f000000000909043b000000200660003900000000009604350000002007700039000000000087004b000018fa0000413d00000000050004100000000d060000294dbc27dd0000040f000600000001001d0000000e020000290008000a0020007300000a3f0000413d00000006020000290007000c0020007300000a3f0000413d0000000e020000290000000a0020006b000019150000613d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000008020000294dbc35e30000040f00000006020000290000000c0020006b0000191f0000613d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d00000007020000294dbc35e30000040f00000002010003670000000b02100360000000000202043b000013730020009c00000d0b0000213d0000000401100360000000000301043b000013730030009c00000d0b0000213d00000005010000294dbc46c30000040f0000000002010019000000400100043d000e00000001001d0000000b0300002900000009040000294dbc2c110000040f0000000e020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f0000000d020000290000137305200197000013b9011001c70000800d020000390000000203000039000013d4040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000002002100039000000070300002900001a9b0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019520000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000195e0000c13d00001bc80000013d0000008405500370000000000505043b000000000054004b0000197c0000813d000013bc03000041000000000031043500001378012001c700004dbe000104300000000c03000029000000090030006c00001a600000813d000013bc02000041000001f70000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000019770000c13d00001bc80000013d00000000013104360000000000410435000013bb012001c700004dbd0001042e0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a057000290000199b0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000019970000c13d000000000006004b000019a80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bb10000613d0000001f01400039000000e00110018f0000000a01100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d00000006020000290000137303200197000d00000003001d0000000e0030006b0000127a0000613d00000006030000290000000e0300402900000000040300190000137300300198000014350000613d0000000a0200002900000000050204330000000b0200002900000000020204330000000e0340014f000013730030019800000000030500190000000003026019000b00000003001d000000000502c01900000002020003670000004403200370000000000303043b000a00000005001d000000000035004b000017210000413d0000006402200370000000000202043b0000000b0020006b0000196e0000413d0000000e010000290000000c020000290000000a030000294dbc36670000040f000013b50100004100000000001004430000000d0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000b02000029000000000021043500000000010004140000000d02000029000000040020008c00001a020000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cbc0000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000c010000290000000b020000294dbc37720000040f000000400100043d00000020021000390000000b0300002900000000003204350000000a0200002900001a9d0000013d0000000902000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000400030008c000000400400003900000000040340190000001f0640018f0000006007400190000000090570002900001a2b0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00001a270000c13d000000000006004b00001a380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001bbd0000613d0000001f01400039000000e00110018f0000000901100029000013ab0010009c000009d30000213d000000400010043f000000400030008c00000d0b0000413d000013700010009c0000137002000041000000000201401900000040022002100000000d040000290000000e0040006b000012310000613d0000000d0400002900000000030400190000000e03004029000000000003004b000014230000613d000000090300002900000000050304330000000a03000029000017050000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001a5b0000c13d0000135f0000013d0000000e010000290000000d0200002900000008030000294dbc36670000040f000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000e00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000b02000029000000040020008c00001a900000613d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000b020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001c170000613d0000000e01000029000013ab0010009c000009d30000213d0000000e01000029000000400010043f0000000d010000290000000c020000294dbc37720000040f000000400100043d00000020021000390000000c03000029000000000032043500000008020000290000000000210435000013700010009c00001370010080410000004001100210000013bb011001c700004dbd0001042e0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f00000000030100190000000e010000290000000001010433000000000001004b000001d90000613d0000000401000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001ad30000413d0000000e010000294dbc3e410000040f0000000e010000290000000001010433000000000001004b00000a3f0000613d00000005011002100000000e011000290000000001010433000d00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000c00000002001d00000004012000390000000d02000029000000000021043500000000010004140000000702000029000000040020008c00001b140000613d0000000c02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001cd50000613d0000000c01000029000013ab0010009c000009d30000213d0000000c01000029000000400010043f0000000e010000290000000001010433000000000001004b00000a3f0000613d000000010210008a0000000e010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000d00000002001d000000200100003900000000021204360000000e010000294dbc242e0000040f0000000d0200002900000bc60000013d0000000b0100002900000020021000390000000201000367000000000321034f000000000303043b000d00000003001d000013730030009c00000d0b0000213d0000000c03000029000000020030008c000001d90000413d0000002002200039000000000121034f000000000301043b000013730030009c00000d0b0000213d00000005010000290000000d020000294dbc46c30000040f000000000301001900000004010000290000000001010433000000000001004b000001d90000613d0000000e01000029000000000401043300000000020004110000000d010000294dbc36eb0000040f000000400200043d0000000a01200029000000000021004b00000000030000390000000103004039000013ab0010009c000009d30000213d0000000100300190000009d30000c13d000000400010043f0000000c0100002900000000001204350000000607000029000000000070007c00000d0b0000213d00000000030004100000000201000367000000000402001900000009050000290000000006050019000000000551034f000000000505043b000013730050009c00000d0b0000213d0000002004400039000000000054043500000000050600190000002005500039000000000075004b00001b5b0000413d00000004010000294dbc3e410000040f00000004010000290000000001010433000000000001004b00000a3f0000613d000000050110021000000004011000290000000001010433000e00000001001d000013b5010000410000000000100443000000070100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000000120435000d00000002001d00000004012000390000000e02000029000000000021043500000000010004140000000702000029000000040020008c00001b9c0000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000007020000294dbc4db20000040f00000000030100190000006003300270000113700030019d0003000000010355000000010020019000001ce20000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000004010000290000000001010433000000000001004b00000a3f0000613d000000010210008a00000004010000294dbc25740000040f000000000201043300000008010000294dbc37720000040f000000400200043d000e00000002001d00000020010000390000000002120436000000040100002900000bc40000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bb80000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001bc40000c13d000000000005004b00001bd50000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000d0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b00001bf00000c13d000000400100043d00000001002001900000232e0000613d00000040021000390000000e030000290000000000320435000010340000013d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f0000000001360019000000030500036700001c090000613d000000000705034f000000007807043c0000000006860436000000000016004b00001c050000c13d000000000004004b00001be90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500001be90000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c1f0000c13d00001bc80000013d000013c4011001c700008009020000390000000e030000290000000c0400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001c5c0000613d0000000501000029000013ab0010009c000009d30000213d0000000501000029000000400010043f00000002010003670000000802100360000000000202043b000013730020009c00000d0b0000213d0000000d03000029000000020030008c000001d90000413d00000008030000290000002003300039000000000131034f000000000301043b000013730030009c00000d0b0000213d00000006010000294dbc46c30000040f0000000b020000290000000002020433000000000002004b000001d90000613d00000007020000290000000002020433000000400400043d00000024034000390000000000230435000013c5020000410000000000240435000e00000004001d0000000402400039000000000012043500000000010004140000000c02000029000000040020008c00001c6c0000c13d0000000103000031000000200030008c0000002004000039000000000403401900001c980000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001c640000c13d00001bc80000013d000000400100043d000013d002000041000001f70000013d0000000e02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c70000000c020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900001c870000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00001c830000c13d000000000006004b00001c940000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001cc90000613d0000001f01400039000000600210018f0000000e01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000e010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000d0b0000c13d000000000001004b000012cc0000613d00000000030000310000000a010000290000000d020000294dbc23430000040f00000000020100190000000b0100002900000009030000294dbc3e410000040f000000400200043d000e00000002001d000000200100003900000000021204360000000b0100002900000bc40000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cc40000c13d00001bc80000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cd00000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cdd0000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001cea0000c13d00001bc80000013d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000005020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900001d0a0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00001d060000c13d000000000006004b00001d170000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000001e120000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000013ab0010009c000009d30000213d0000000100200190000009d30000c13d000000400010043f000000200030008c00000d0b0000413d0000000d020000290000000002020433000d00000002001d0000002002100039000000400300003900000000003204350000000502000029000000000021043500000002020003670000000803200360000000000403043b000013730040009c00000d0b0000213d000000400310003900000000004304350000000b0620036000000000040000310000000e0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000e07700029000000000872034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007100039000000600a100039000000800b0000390000000000ba04350000000000870435000000e007100039000000000008004b00001d700000613d000000000a000019000000000b92034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001d670000413d0000000a08200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000e08800029000000000982034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c1000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001da00000613d000000000882034f000000008a08043c000000000bab043600000000007b004b00001d9c0000c13d000000000009004b0000000908200360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000e05800029000000000652034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004100039000000000034043500000000038704360000001f0450018f000000000005004b00001dd20000613d000000000262034f00000000065300190000000007030019000000002802043c0000000007870436000000000067004b00001dce0000c13d000000000004004b00000000021300490000000002520019000013700020009c00001370020080410000006002200210000013700010009c00001370010080410000004001100210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d1040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000d030000290000000000320435000000200210003900000006030000290000232a0000013d000013c4011001c700008009020000390000000503000029000000070400002900000000050000194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d000000010020019000001e1e0000613d0000000201000029000013ab0010009c000009d30000213d0000000203000029000000400030043f000000240130003900000005020000290000000000210435000013c501000041000000000013043500000004013000390000000402000029000000000021043500000000010004140000000702000029000000040020008c00001e2b0000c13d0000000104000031000000200040008c0000002003000039000000000304401900001e570000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e190000c13d00001bc80000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e260000c13d00001bc80000013d0000000202000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c700000007020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000020570002900001e460000613d000000000801034f0000000209000029000000008a08043c0000000009a90436000000000059004b00001e420000c13d000000000006004b00001e530000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ebb0000613d0000001f01300039000000600110018f0000000202100029000700000002001d000013ab0020009c000009d30000213d0000000702000029000000400020043f000000200040008c00000d0b0000413d00000002020000290000000002020433000000000002004b0000000005000039000000010500c039000000000052004b00000d0b0000c13d000000000002004b000012cc0000613d0000000e020000290000137305200197000013c702000041000000070600002900000000002604350000000402600039000200000005001d000000000052043500000000020004140000000405000029000000040050008c00001ea40000613d0000000701000029000013700010009c00001370010080410000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013b2011001c700000004020000294dbc4db20000040f000000000301001900000060033002700000137004300197000000200040008c000000200300003900000000030440190000001f0630018f0000002007300190000000070570002900001e910000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00001e8d0000c13d000000000006004b00001e9e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000004001f0003000000010355000000010020019000001ec70000613d0000001f01300039000000600110018f0000000701100029000013ab0010009c000009d30000213d000000400010043f000000200030008c00000d0b0000413d00000007020000290000000002020433000700000002001d0000000003000416000000050330006c000020930000a13d000013b80010009c000009d30000213d0000002002100039000000400020043f000000000001043500000000010004140000000e02000029000000040020008c0000205d0000c13d0000000102000039000020690000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ec20000c13d0000135f0000013d0000001f0540018f0000137206400198000000400200043d00000000036200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001ece0000c13d0000135f0000013d0000000a010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000e0200002900000004030000294dbc2d660000040f0000000b0010002a00000a3f0000413d000b000b0010002d000400000000001d0000000e010000290000000d020000290000000b030000294dbc36670000040f0000000a010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000e030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000a03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000080610036000000000040000310000000a0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000a07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b00001f300000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b00001f270000413d0000000708100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000a08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b00001f600000613d000000000881034f000000008a08043c000000000bab043600000000007b004b00001f5c0000c13d000000000009004b0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000a05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b00001f920000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b00001f8e0000c13d0000000d010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000b030000290000000000320435000000040200002900001a9d0000013d0000000b010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000a0200002900000003030000294dbc2d660000040f0000000c0010002a00000a3f0000413d000c000c0010002d000300000000001d000013b5010000410000000000100443000000080100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013b7010000410000000001120436000900000001001d000d00000002001d00000004012000390000000c02000029000000000021043500000000010004140000000802000029000000040020008c00001fe90000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c700000008020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021620000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f000013b80010009c000009d30000213d0000000901000029000000400010043f0000000d01000029000000000001043500000000010004140000000e02000029000000040020008c0000216f0000c13d00000001020000390000000101000031000021d40000013d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f0000000a02000029000000080220006c0000217c0000613d000021760000813d000000400100043d000013d702000041000001f70000013d0000000801000029000000020010008c00000a3f0000413d0000000201000029000000200110008a0000000201100367000000000101043b000c00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000c0200002900000003030000294dbc46c30000040f0000000002010019000c00000002001d00000003010000290000000d030000294dbc36670000040f000013b50100004100000000001004430000000c0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b000000000001004b00000d0b0000613d000000400200043d000013d501000041000d00000002001d000000000012043500000000010004140000000c02000029000000040020008c000020520000613d0000000d02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f00001378011001c70000000c020000294dbc4db20000040f00000000030100190000006003300270000113700030019d00030000000103550000000100200190000021bd0000613d0000000d01000029000013ab0010009c000009d30000213d0000000d01000029000000400010043f00000020010000390000000d02000029000d00000002001d0000000000120435000000200220003900001b270000013d000013700010009c0000137001008041000000c001100210000013b9011001c700008009020000390000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000020910000613d0000001f03400039000013de033001970000003f03300039000013de05300197000000400300043d0000000005530019000000000035004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006430436000013de034001980000001f0440018f00000000013600190000000305000367000020840000613d000000000705034f000000007807043c0000000006860436000000000016004b000020800000c13d000000000004004b000020910000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d00000009010000290000000201100367000000000201043b000013730020009c00000d0b0000213d000000030100002900000006030000294dbc46c30000040f000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000903100360000000000403043b000013730040009c00000d0b0000213d000000400320003900000000004304350000000c0610036000000000040000310000000d0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000d07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a200039000000800b0000390000000000ba04350000000000870435000000e007200039000000000008004b000020e00000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000020d70000413d0000000b08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000d08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b000021100000613d000000000881034f000000008a08043c000000000bab043600000000007b004b0000210c0000c13d000000000009004b0000000a08100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000d05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200650003900000005058002100000000004540049000000000046004b0000000009000019000013b309002041000013b304400197000013b30a600197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0450018f000000000005004b000021420000613d000000000161034f00000000065300190000000007030019000000001801043c0000000007870436000000000067004b0000213e0000c13d000000000004004b00000000012300490000000001510019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013d10400004100000002050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d0000004002100039000000070300002900000000003204350000002002100039000000050300002900000000003204350000000802000029000010380000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000216a0000c13d00001bc80000013d000013700010009c0000137001008041000000c0011002100000000c0000006b000021ca0000c13d0000000e02000029000021cf0000013d00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d4dbc35e30000040f00000002010003670000000e02100360000000000202043b000d00000002001d000013730020009c00000d0b0000213d0000000901100360000000000101043b000a00000001001d000013730010009c00000d0b0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000021bc0000613d000000000101043b0000000d020000290000000a030000294dbc46c30000040f000d00000001001d0000000e010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000007030000294dbc36670000040f00000009010000290000000201100367000000000101043b000013730010009c00000d0b0000213d0000000d0200002900000008030000294dbc36670000040f000013c701000041000000400300043d00000000001304350000000c010000290000137302100197000a00000003001d0000000401300039000c00000002001d000000000021043500000000010004140000000d02000029000000040020008c000022cb0000c13d0000000103000031000000200030008c00000020040000390000000004034019000022f70000013d000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000021c50000c13d00001bc80000013d000013b9011001c700008009020000390000000c030000290000000e0400002900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000021fc0000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000009d30000213d0000000100600190000009d30000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000021ef0000613d000000000705034f000000007807043c0000000006860436000000000016004b000021eb0000c13d000000000004004b000021fc0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001002001900000232d0000613d0000000b010000290000000201100367000000000201043b000013730020009c00000d0b0000213d00000006010000290000000a030000294dbc46c30000040f000000800d000039000000400200043d000000200320003900000040040000390000000000430435000000000012043500000002010003670000000b03100360000000000403043b000013730040009c00000d0b0000213d00000040032000390000000000430435000000070610036000000000040000310000000b0540006a0000001f0550008a000000000706043b000013b308700197000013b306500197000000000968013f000000000068004b0000000008000019000013b308004041000000000057004b000000000a000019000013b30a008041000013b30090009c00000000080ac019000000000008004b00000d0b0000c13d0000000b07700029000000000871034f000000000808043b000013ab0080009c00000d0b0000213d000000200970003900000005078002100000000007740049000000000079004b000000000a000019000013b30a002041000013b307700197000013b30b900197000000000c7b013f00000000007b004b0000000007000019000013b307004041000013b300c0009c00000000070ac019000000000007004b00000d0b0000c13d000000c007200039000000600a2000390000000000da04350000000000870435000000e007200039000000000008004b0000224b0000613d000000000a000019000000000b91034f000000000b0b043b0000137300b0009c00000d0b0000213d0000000007b704360000002009900039000000010aa0003900000000008a004b000022420000413d0000000508100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000009000019000013b309004041000000000058004b000000000b000019000013b30b008041000013b300a0009c00000000090bc019000000000009004b00000d0b0000c13d0000000b08800029000000000981034f000000000909043b000013ab0090009c00000d0b0000213d0000002008800039000000050a900210000000000ba400490000000000b8004b000000000c000019000013b30c002041000013b30bb00197000013b30d800197000000000ebd013f0000000000bd004b000000000b000019000013b30b004041000013b300e0009c000000000b0cc01900000000000b004b00000d0b0000c13d000000000b370049000000800c2000390000000000bc0435000000000b9704360000001f09a0018f0000000007ab001900000000000a004b0000227b0000613d000000000881034f000000008a08043c000000000bab043600000000007b004b000022770000c13d000000000009004b0000000408100360000000000808043b000013b309800197000000000a69013f000000000069004b0000000006000019000013b306004041000000000058004b0000000005000019000013b305008041000013b300a0009c000000000605c019000000000006004b00000d0b0000c13d0000000b05800029000000000651034f000000000806043b000013ab0080009c00000d0b0000213d000000200550003900000005068002100000000004640049000000000045004b0000000009000019000013b309002041000013b304400197000013b30a500197000000000b4a013f00000000004a004b0000000004000019000013b304004041000013b300b0009c000000000409c019000000000004004b00000d0b0000c13d0000000003370049000000a004200039000000000034043500000000038704360000001f0460018f000000000006004b000022ad0000613d000000000151034f00000000056300190000000007030019000000001801043c0000000007870436000000000057004b000022a90000c13d0000000e010000290000137305100197000000000004004b00000000012300490000000001610019000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000800d020000390000000203000039000013ba040000414dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000020021000390000000c030000290000000000320435000000030200002900001a9d0000013d0000000a02000029000013700020009c00001370020080410000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000d020000294dbc4db20000040f000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000022e60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000022e20000c13d000000000006004b000022f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000023370000613d0000001f01400039000000600110018f0000000a04100029000000000014004b000000000100003900000001010040390000000002040019000013ab0040009c000009d30000213d0000000100100190000009d30000c13d000000400020043f000000200030008c00000d0b0000413d0000000a010000290000000001010433000a00000001001d0000000001020019000900000001001d0000000d020000290000000e030000290000000b040000294dbc2c110000040f00000009020000290000000001210049000013700010009c00001370010080410000006001100210000013700020009c00001370020080410000004002200210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000121019f000013b9011001c70000800d020000390000000203000039000013d8040000410000000c050000294dbc4db20000040f000000010020019000000d0b0000613d000000400100043d00000040021000390000000a0300002900000000003204350000002002100039000000080300002900000000003204350000000702000029000010380000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c903000041000000000032043500000024021000390000003403000039000012820000013d0000001f0530018f0000137206300198000000400200043d000000000462001900001bc80000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000233e0000c13d00001bc80000013d000013df0020009c000023670000813d00000005052002100000003f04500039000013b406400197000000400400043d0000000006640019000000000046004b00000000070000390000000107004039000013ab0060009c000023670000213d0000000100700190000023670000c13d000000400060043f00000000002404350000000002150019000000000032004b000023650000213d000000000012004b000023630000a13d00000002030003670000000005040019000000000613034f000000000606043b000013730060009c000023650000213d000000200550003900000000006504350000002001100039000000000021004b0000235a0000413d0000000001040019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000024260000213d000000e30010008c000024260000a13d00000002080003670000000402800370000000000202043b000013ab0020009c000024260000213d0000002303200039000000000013004b000024260000813d0000000403200039000000000338034f000000000303043b000013df0030009c000024280000813d00000005043002100000003f05400039000013b405500197000000400900043d0000000005590019000000000095004b00000000060000390000000106004039000013ab0050009c000024280000213d0000000100600190000024280000c13d0000002402200039000000400050043f00000000003904350000000004240019000000000014004b000024260000213d000000000003004b0000239c0000613d0000000003090019000000000528034f000000000505043b000013730050009c000024260000213d000000200330003900000000005304350000002002200039000000000042004b000023930000413d0000002402800370000000000302043b000013ab0030009c000024260000213d0000002302300039000000000012004b0000000004000019000013b304008041000013b305100197000013b302200197000000000652013f000000000052004b0000000002000019000013b302004041000013b30060009c000000000204c019000000000002004b000024260000c13d0000000402300039000000000228034f000000000402043b000013ab0040009c000024280000213d00000005064002100000003f02600039000013b407200197000000400200043d0000000007720019000000000027004b000000000a000039000000010a004039000013ab0070009c000024280000213d0000000100a00190000024280000c13d0000002403300039000000400070043f00000000004204350000000006360019000000000016004b000024260000213d000000000004004b000023cf0000613d0000000004020019000000000738034f000000000707043b000000200440003900000000007404350000002003300039000000000063004b000023c80000413d0000004403800370000000000403043b000013ab0040009c000024260000213d0000002303400039000000000013004b0000000006000019000013b306008041000013b303300197000000000753013f000000000053004b0000000003000019000013b303004041000013b30070009c000000000306c019000000000003004b000024260000c13d0000000403400039000000000338034f000000000603043b000013ab0060009c000024280000213d00000005076002100000003f03700039000013b40a300197000000400300043d000000000aa3001900000000003a004b000000000b000039000000010b004039000013ab00a0009c000024280000213d0000000100b00190000024280000c13d00000024044000390000004000a0043f00000000006304350000000007470019000000000017004b000024260000213d000000000006004b000024010000613d0000000006030019000000000a48034f000000000a0a043b00000020066000390000000000a604350000002004400039000000000074004b000023fa0000413d0000006404800370000000000404043b0000008406800370000000000706043b000013ab0070009c000024260000213d0000002306700039000000000016004b000000000a000019000013b30a008041000013b306600197000000000b56013f000000000056004b0000000005000019000013b305004041000013b300b0009c00000000050ac019000000000005004b000024260000c13d0000000405700039000000000558034f000000000605043b000013ab0060009c000024260000213d000000240570003900000005076002100000000007570019000000000017004b000024260000213d000000a401800370000000000701043b000013730070009c000024260000213d000000c401800370000000000801043b0000000001090019000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000301001900000000040304330000000001420436000000000004004b0000243a0000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000024340000413d000000000001042d0000000004010019000013ac0040009c000024d90000213d000000a30040008c000024d90000a13d00000002050003670000000401500370000000000201043b000013ab0020009c000024d90000213d0000002301200039000000000041004b000024d90000813d0000000401200039000000000115034f000000000301043b000013df0030009c000024db0000813d00000005063002100000003f01600039000013b407100197000000400100043d0000000007710019000000000017004b00000000080000390000000108004039000013ab0070009c000024db0000213d0000000100800190000024db0000c13d0000002402200039000000400070043f00000000003104350000000006260019000000000046004b000024d90000213d000000000003004b0000246b0000613d0000000003010019000000000725034f000000000707043b000013730070009c000024d90000213d000000200330003900000000007304350000002002200039000000000062004b000024620000413d0000002402500370000000000602043b000013ab0060009c000024d90000213d0000002302600039000000000042004b0000000007000019000013b307008041000013b303400197000013b302200197000000000832013f000000000032004b0000000002000019000013b302004041000013b30080009c000000000207c019000000000002004b000024d90000c13d0000000402600039000000000225034f000000000702043b000013ab0070009c000024db0000213d00000005087002100000003f02800039000013b409200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007204350000000008680019000000000048004b000024d90000213d000000000007004b0000249e0000613d0000000007020019000000000965034f000000000909043b000000200770003900000000009704350000002006600039000000000086004b000024970000413d0000004406500370000000000606043b000013ab0060009c000024d90000213d0000002307600039000000000047004b0000000008000019000013b308008041000013b307700197000000000937013f000000000037004b0000000003000019000013b303004041000013b30090009c000000000308c019000000000003004b000024d90000c13d0000000403600039000000000335034f000000000703043b000013ab0070009c000024db0000213d00000005087002100000003f03800039000013b409300197000000400300043d0000000009930019000000000039004b000000000a000039000000010a004039000013ab0090009c000024db0000213d0000000100a00190000024db0000c13d0000002406600039000000400090043f00000000007304350000000008680019000000000048004b000024d90000213d000000000007004b000024d00000613d0000000004030019000000000765034f000000000707043b000000200440003900000000007404350000002006600039000000000086004b000024c90000413d0000006404500370000000000404043b000013730040009c000024d90000213d0000008405500370000000000505043b000013730050009c000024d90000213d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ac0010009c000025030000213d000000a30010008c000025030000a13d00000002060003670000002402600370000000000202043b0000000403600370000000000703043b0000004403600370000000000303043b000013ab0030009c000025030000213d0000002304300039000000000014004b000025030000813d0000000404300039000000000446034f000000000404043b000013ab0040009c000025030000213d000000240330003900000005054002100000000005350019000000000015004b000025030000213d0000006401600370000000000501043b000013730050009c000025030000213d0000008401600370000000000601043b0000000001070019000000000001042d000000000100001900004dbe000104300000000003010019000013ac0030009c000025380000213d000000430030008c000025380000a13d00000002040003670000002401400370000000000501043b000013ab0050009c000025380000213d0000000401400370000000000101043b0000002302500039000000000032004b000025380000813d0000000402500039000000000224034f000000000602043b000013df0060009c0000253a0000813d00000005076002100000003f02700039000013b408200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000013ab0080009c0000253a0000213d00000001009001900000253a0000c13d0000002405500039000000400080043f00000000006204350000000007570019000000000037004b000025380000213d000000000006004b000025370000613d0000000003020019000000000654034f000000000606043b000013730060009c000025380000213d000000200330003900000000006304350000002005500039000000000075004b0000252e0000413d000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000000004010019000013ac0040009c000025600000213d000000830040008c000025600000a13d00000002050003670000000401500370000000000101043b0000002402500370000000000202043b000013ab0020009c000025600000213d0000002303200039000000000043004b000025600000813d0000000403200039000000000335034f000000000303043b000013ab0030009c000025600000213d000000240220003900000005063002100000000006260019000000000046004b000025600000213d0000004404500370000000000404043b000013730040009c000025600000213d0000006405500370000000000505043b000000000001042d000000000100001900004dbe00010430000013ac0010009c000025720000213d000000830010008c000025720000a13d00000002030003670000006401300370000000000401043b000013730040009c000025720000213d0000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900004dbe000104300000000003010433000000000023004b0000257b0000a13d000000050220021000000000012100190000002001100039000000000001042d000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe0001043000000000430104340000000001320436000000000003004b0000258d0000613d000000000200001900000000052100190000000006240019000000000606043300000000006504350000002002200039000000000032004b000025860000413d000000000231001900000000000204350000001f02300039000013de022001970000000001210019000000000001042d0010000000000002000100000005001d000000000a010019000000400b00043d00000000510a0434000600000005001d000000000001004b000700000003001d000800000002001d000200000004001d000027000000613d000400200030003d000500200020003d00001373024001970000000001000411000313730010019b000000000c000019000e0000000a001d000d00000002001d000000050dc00210000000060ed0002900000000010e0433000013e00300004100000000003b043500001373011001970000000403b0003900000000001304350000000001000414000000040020008c00100000000c001d000025b50000c13d00000003010003670000000103000031000025ce0000013d000b0000000e001d000c0000000d001d0000137000b0009c000f0000000b001d000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c74dbc4db70000040f00000000030100190000006003300270000113700030019d000013700330019700030000000103550000000100200190000027990000613d0000000e0a0000290000000f0b000029000000100c0000290000000c0d0000290000000b0e000029000013de0430019800000000024b0019000025d70000613d000000000501034f00000000060b0019000000005705043c0000000006760436000000000026004b000025d30000c13d0000001f05300190000025e40000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000013de021001970000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000013ac0030009c000027840000213d0000001f0030008c000027840000a13d00000000020b0433000013ab0020009c000027840000213d0000000003b300190000000004b200190000000002430049000013ac0020009c000027840000213d000000800020008c000027840000413d000013cb0010009c000027860000213d0000008002100039000000400020043f0000000052040434000013730020009c000027840000213d00000000022104360000000005050433000000010050008c000027840000213d000000000052043500000040054000390000000005050433000000000005004b0000000006000039000000010600c039000000000065004b000027840000c13d0000004006100039000000000056043500000060054000390000000005050433000013ab0050009c000027840000213d00000000044500190000001f05400039000000000035004b0000000006000019000013b306008041000013b305500197000013b307300197000000000875013f000000000075004b0000000005000019000013b305004041000013b30080009c000000000506c019000000000005004b000027840000c13d0000000046040434000013ab0060009c000027860000213d00000005076002100000003f05700039000013b408500197000000400500043d0000000008850019000000000058004b00000000090000390000000109004039000013ab0080009c000027860000213d0000000100900190000027860000c13d000000400080043f00000000006504350000000006740019000000000036004b000027840000213d000000000064004b000026410000813d0000000003050019000000200330003900000000470404340000000000730435000000000064004b0000263c0000413d000000600110003900000000005104350000000002020433000000010020008c0000000803000029000027920000213d00000000010a0433000000000002004b0000000702000029000026b80000613d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010204330000000000c1004b0000278c0000a13d000000400300043d000013b80030009c000027860000213d00000000010e043300001373021001970000000501d000290000000001010433000a00000001001d0000000401d000290000000001010433000900000001001d0000002001300039000c00000001001d000000400010043f000b00000003001d0000000000030435000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000090200002900000000002104350000004401b000390000000a0200002900000000002104350000002401b000390000000d020000290000000000210435000013e10100004100000000001b04350000000401b00039000000000200041100000000002104350000000b010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b0000000c06000029000026970000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000026900000413d0000000002120019000000000002043500000000040004140000000f02000029000000040020008c000026f80000613d0000001f01100039000013de01100197000000c401100039000013700010009c000013700100804100000060011002100000137000b0009c000013700300004100000000030b40190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000026f80000c13d000027a50000013d0000000000c1004b0000278c0000a13d00000000010304330000000000c1004b0000278c0000a13d00000000010e043300001373021001970000000501d000290000000001010433000c00000001001d000013b5010000410000000000100443000f00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000027980000613d000000000101043b000000000001004b0000000e0a000029000000100c000029000027840000613d000000400b00043d0000004401b000390000000c0200002900000000002104350000002401b000390000000d020000290000000000210435000013e20100004100000000001b04350000000401b000390000000302000029000000000021043500000000010004140000000f02000029000000040020008c000026f80000613d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b0011001c7000f0000000b001d4dbc4db20000040f000000100c0000290000000f0b0000290000000e0a00002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000027b20000613d000013ab00b0009c000027860000213d0000004000b0043f000000010cc0003900000000010a043300000000001c004b0000000d02000029000025a60000413d0000002401b0003900000080020000390000000000210435000013e30100004100000000001b0435000000010100002900001373021001970000000401b00039000000000021043500000000030a04330000008402b000390000000000320435000000a402b00039000000000003004b0000271a0000613d000000000400001900000007060000290000000807000029000000200aa0003900000000050a0433000013730550019700000000025204360000000104400039000000000034004b000027120000413d0000271c0000013d0000000706000029000000080700002900000000031200490000004404b00039000000000034043500000000030704330000000002320436000000000003004b0000272a0000613d00000000040000190000002007700039000000000507043300000000025204360000000104400039000000000034004b000027240000413d00000000011200490000006403b00039000000000013043500000000030604330000000001320436000000000003004b0000273a0000613d000000000200001900000002050000290000002006600039000000000406043300000000014104360000000102200039000000000032004b000027330000413d0000273b0000013d000000020500002900000000030004140000137302500197000000040020008c000027440000c13d0000000103000031000000200030008c00000020040000390000000004034019000027750000013d0000000001b10049000013700010009c000013700100804100000060011002100000137000b0009c000013700400004100000000040b40190000004004400210000000000141019f000013700030009c0000137003008041000000c003300210000000000131019f000f0000000b001d4dbc4db20000040f0000000f0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027640000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027600000c13d000000000006004b000027710000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000027d10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000027860000213d0000000100200190000027860000c13d000000400010043f000000200030008c000027840000413d00000000010b0433000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000002101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027a00000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ad0000c13d000027be0000013d00001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027ba0000c13d000000000005004b000027cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000027be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000027d80000c13d000027be0000013d000a000000000002000000000a020019000000000c010019000400000003001d0000000021030434000000000001004b000027fb0000613d00000000080000190000000003000019000000050780021000000000077200190000000007070433000000000037001a000027f50000413d00000000033700190000000108800039000000000018004b000027e60000413d000000000003004b000027fb0000613d000013cc023000d100000000013200d9000013cc0010009c000027fc0000613d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000002000019000300000006001d0000137309400197000000400b00043d000013e40100004100000000001b0435000013730d5001970000000401b000390000000000d104350000000001000414000000040090008c000900000009001d00080000000a001d00070000000c001d00060000000d001d000500000002001d000028110000c13d0000000103000031000000200030008c00000020040000390000000004034019000028430000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b2011001c70000000002090019000a0000000b001d4dbc4db70000040f0000000a0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000282e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000282a0000c13d000000000006004b0000283b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a000029000000070c000029000000060d00002900002b6b0000613d0000001f01400039000000600110018f000000000fb1001900000000001f004b00000000020000390000000102004039000013ab00f0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000f0043f0000001f0030008c00002b5c0000a13d000000000b0b0433000013e50200004100000000002f04350000000002000414000000040090008c0000288c0000613d000a0000000b001d0000137000f0009c000013700100004100000000010f40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f00001378011001c7000000000209001900020000000f001d4dbc4db70000040f000000020f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000028740000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b000028700000c13d000000000006004b000028810000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002b770000613d0000001f01400039000000600110018f000000000ef10019000013ab00e0009c00002b5e0000213d0000004000e0043f000000200030008c00002b5c0000413d00000000020f043300000000002b004b00000000040000390000000104004039000000050020006b000000000200003900000001020060390000000000420170000000050b006029000000000200041000000000002d004b000a0000000b001d00002a550000c13d000013e60200004100000000002e04350000002402e000390000000000d204350000000402e000390000000000d204350000000002000414000000040090008c000028dd0000613d0000137000e0009c000013700100004100000000010e40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000000209001900050000000e001d4dbc4db70000040f000000050e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e0019000028c50000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b000028c10000c13d000000000006004b000028d20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d00002900002bbc0000613d0000001f01400039000000600110018f0000000001e10019000013ab0010009c00002b5e0000213d000000400010043f000000200030008c00002b5c0000413d00000000020e04330000000000b2004b00002a550000813d0000002002100039000013e704000041000000000042043500000024041000390000000000d404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200e00008a000029030000c13d000200010000003d0000291f0000013d00010000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b270000613d000200000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e301700000001f0330018f000500000001001d000000000141001900000003050003670000293b0000613d000000000605034f0000000507000029000000006806043c0000000007870436000000000017004b000029370000c13d000000000003004b000029480000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000020000006b00002b330000613d000000000003004b000029670000c13d000200000002001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000020100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000029740000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000005010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400f00043d000013e60100004100000000001f04350000002401f000390000000000d104350000000401f000390000000000d104350000000001000414000000040090008c000029830000c13d0000000103000031000000200030008c00000020040000390000000004034019000029b70000013d0000137000f0009c000013700200004100000000020f40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900050000000f001d4dbc4db70000040f000000050f000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057f0019000029a00000613d000000000801034f00000000090f0019000000008a08043c0000000009a90436000000000059004b0000299c0000c13d000000000006004b000029ad0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a00002beb0000613d0000001f01400039000000600210018f0000000001f20019000000000021004b00000000020000390000000102004039000013ab0010009c00002b5e0000213d000000010020019000002b5e0000c13d000000400010043f000000200030008c00002b5c0000413d0000004404100039000000240510003900000000020f0433000000000002004b00002bc80000c13d0000002002100039000013e70600004100000000006204350000000000d50435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c00002b5e0000213d000000800f1000390000004000f0043f000013e80010009c00002b5e0000213d000000c004100039000000400040043f000000200400003900000000004f0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000029e40000c13d000500010000003d00002a000000013d00020000000f001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010420018f00030000000103550000006001100270000113700010019d000013700310019800002b3b0000613d000500000004001d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000020f0000290000001f013000390000000001e1016f0000003f011000390000000004e1016f000000400500043d0000000001540019000000000041004b00000000040000390000000104004039000013ab0010009c00002b5e0000213d000000010040019000002b5e0000c13d000000400010043f000000000205001900000000013504360000000004e30170000000000e0100190000001f0330018f00000000014e0019000000030500036700002a1c0000613d000000000605034f00000000070e0019000000006806043c0000000007870436000000000017004b00002a180000c13d000000000003004b00002a290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f00000000003104350000000003020433000000050000006b00002b460000613d000000000003004b00002a490000c13d000500000002001d00020000000e001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000002bd90000613d000000000101043b000000000001004b000000050100002900002bda0000613d0000000003010433000000000003004b0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020e00002900002a550000613d000013ac0030009c00002b5c0000213d000000200030008c00002b5c0000413d00000000010e0433000000000001004b0000000002000039000000010200c039000000000021004b00002b5c0000c13d000000000001004b00002bad0000613d000000400e00043d0000004401e000390000000000b10435000013af0100004100000000001e04350000000401e000390000000000d104350000002401e0003900000000009104350000000001000414000000040090008c00002a660000c13d0000000103000031000000200030008c0000002004000039000000000403401900002a980000013d0000137000e0009c000013700200004100000000020e40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013b0011001c7000000000209001900060000000e001d4dbc4db20000040f000000060e000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057e001900002a830000613d000000000801034f00000000090e0019000000008a08043c0000000009a90436000000000059004b00002a7f0000c13d000000000006004b00002a900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000909000029000000080a0000290000000a0b000029000000070c00002900002b830000613d0000001f01400039000000600110018f000000000de1001900000000001d004b00000000020000390000000102004039000013ab00d0009c00002b5e0000213d000000010020019000002b5e0000c13d0000004000d0043f000000200030008c00002b5c0000413d00000000020e0433000000000002004b0000000004000039000000010400c039000000000042004b00002b5c0000c13d0000002402d0003900000080040000390000000000420435000013ee0200004100000000002d0435000000030200002900001373042001970000000402d00039000000000042043500000000050c04330000008404d000390000000000540435000000a404d00039000000000005004b00002ac20000613d0000000006000019000000200cc0003900000000070c0433000013730770019700000000047404360000000106600039000000000056004b00002abb0000413d00000000052400490000004406d00039000000000056043500000000050a04330000000004540436000000000005004b00002ad00000613d0000000006000019000000200aa0003900000000070a043300000000047404360000000106600039000000000056004b00002aca0000413d00000000022400490000006405d000390000000000250435000000040700002900000000050704330000000002540436000000000005004b00002adf0000613d00000000040000190000002007700039000000000607043300000000026204360000000104400039000000000054004b00002ad90000413d0000000004000414000000040090008c00002b170000613d0000000001d20049000013700010009c000013700100804100000060011002100000137000d0009c000013700200004100000000020d40190000004002200210000000000121019f000013700040009c0000137004008041000000c002400210000000000121019f000000000209001900090000000d001d4dbc4db20000040f000000090d000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057d001900002b030000613d000000000801034f00000000090d0019000000008a08043c0000000009a90436000000000059004b00002aff0000c13d000000000006004b00002b100000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000a0b00002900002b8f0000613d0000001f01400039000000600110018f0000000002d10019000000000012004b00000000010000390000000101004039000013ab0020009c00002b5e0000213d000000010010019000002b5e0000c13d000000400020043f000000200030008c00002b5c0000413d00000000010d043300000000001b004b00002b640000c13d00000000010b0019000000000001042d0000006002000039000500800000003d0000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000200e00008a000000010f0000290000000003020433000000000004004b0000294b0000c13d00000000010f0019000000000003004b00002b490000613d0000000501000029000013700010009c0000137001008041000000400210021000002c0c0000013d0000006002000039000000800e0000390000000909000029000000080a0000290000000a0b000029000000070c000029000000060d000029000000020f0000290000000003020433000000000004004b00002a2c0000c13d00000000010f0019000000000003004b00002c090000c13d000000400400043d000a00000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f0000000a020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013ef010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b720000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b7e0000c13d00002b9a0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b8a0000c13d00002bf60000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002b9a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002b960000c13d000000000005004b00002ba70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf0200004100000000002104350000000402100039000000200300003900002bd30000013d0000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bc30000c13d00002bf60000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900002bf60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00002bf20000c13d000000000005004b00002c030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300000137000e0009c000013700e0080410000004002e00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe000104300002000000000002000200000004001d000000200510003900000060060000390000000000650435000013730220019700000000002104350000000202000367000000000532034f000000000505043b000013f10050009c00002d640000813d0000006004100039000100000004001d0000000000540435000000000500003100000000063500490000001f0860008a000000200a3000390000000006a2034f000000000606043b000013b30b600197000013b309800197000000000c9b013f00000000009b004b000000000b000019000013b30b004041000000000086004b000000000d000019000013b30d008041000013b300c0009c000000000b0dc01900000000000b004b00002d640000c13d0000000006360019000000000b62034f000000000c0b043b000013ab00c0009c00002d640000213d000000200d6000390000000506c00210000000000665004900000000006d004b000000000b000019000013b30b002041000013b306600197000013b30ed00197000000000f6e013f00000000006e004b0000000006000019000013b306004041000013b300f0009c00000000060bc019000000000006004b00002d640000c13d000000e00b100039000000800e100039000000800400003900000000004e04350000000000cb0435000001000b10003900000000000c004b00002c5a0000613d000000000e000019000000000fd2034f000000000f0f043b0000137300f0009c00002d640000213d000000000bfb0436000000200dd00039000000010ee000390000000000ce004b00002c510000413d000000200aa00039000000000ca2034f000000000c0c043b000013b30dc00197000000000e9d013f00000000009d004b000000000d000019000013b30d00404100000000008c004b000000000f000019000013b30f008041000013b300e0009c000000000d0fc01900000000000d004b00002d640000c13d000000000c3c0019000000000dc2034f000000000d0d043b000013ab00d0009c00002d640000213d000000200cc00039000000050ed00210000000000fe500490000000000fc004b0000000006000019000013b306002041000013b30ff00197000013b307c001970000000004f7013f0000000000f7004b0000000007000019000013b307004041000013b30040009c000000000706c019000000000007004b00002d640000c13d0000000104b0006a000000a0061000390000000000460435000000000fdb04360000001f0de0018f000000000bef001900000000000e004b00002c8b0000613d000000000cc2034f00000000c40c043c000000000f4f04360000000000bf004b00002c870000c13d00000000000d004b0000002004a00039000000000442034f000000000a04043b000013b304a00197000000000694013f000000000094004b0000000004000019000013b30400404100000000008a004b0000000007000019000013b307008041000013b30060009c000000000407c019000000000004004b00002d640000c13d00000000083a0019000000000382034f000000000303043b000013ab0030009c00002d640000213d000000200880003900000005093002100000000004950049000000000048004b0000000006000019000013b306002041000013b304400197000013b307800197000000000a47013f000000000047004b0000000004000019000013b304004041000013b300a0009c000000000406c019000000000004004b00002d640000c13d0000000104b0006a000000c0061000390000000000460435000000000a3b04360000001f0790018f00000000039a0019000000000009004b00002cbd0000613d000000000882034f000000008408043c000000000a4a043600000000003a004b00002cb90000c13d000000000007004b0000000004130049000000400110003900000000004104350000000201200360000000000101043b000013730010009c00002d640000213d000000000b130436000000020400002900000000014500490000002008400039000000000482034f000000000904043b0000001f0110008a000013b307100197000013b304900197000000000674013f000000000074004b0000000004000019000013b304004041000000000019004b000000000a000019000013b30a008041000013b30060009c00000000040ac019000000000004004b00002d640000c13d000000020a9000290000000004a2034f000000000904043b000013ab0090009c00002d640000213d000000200aa000390000000504900210000000000445004900000000004a004b0000000006000019000013b306002041000013b304400197000013b30ca00197000000000d4c013f00000000004c004b0000000004000019000013b304004041000013b300d0009c000000000406c019000000000004004b00002d640000c13d0000008004300039000000800600003900000000006b04350000000000940435000000a006300039000000000009004b00002cff0000613d000000000b0000190000000004a2034f000000000c04043b0000137300c0009c00002d640000213d0000000006c60436000000200aa00039000000010bb0003900000000009b004b00002cf60000413d0000002008800039000000000482034f000000000904043b000013b304900197000000000a74013f000000000074004b0000000004000019000013b304004041000000000019004b000000000b000019000013b30b008041000013b300a0009c00000000040bc019000000000004004b00002d640000c13d0000000209900029000000000492034f000000000a04043b000013ab00a0009c00002d640000213d0000002009900039000000050ba002100000000004b50049000000000049004b000000000c000019000013b30c002041000013b304400197000013b30d900197000000000e4d013f00000000004d004b0000000004000019000013b304004041000013b300e0009c00000000040cc019000000000004004b00002d640000c13d0000000004360049000000400c30003900000000004c0435000000000ca604360000001f0ab0018f0000000006bc001900000000000b004b00002d300000613d000000000992034f000000009409043c000000000c4c043600000000006c004b00002d2c0000c13d00000000000a004b0000002004800039000000000442034f000000000804043b000013b304800197000000000974013f000000000074004b0000000004000019000013b304004041000000000018004b0000000001000019000013b301008041000013b30090009c000000000401c019000000000004004b00002d640000c13d0000000204800029000000000142034f000000000101043b000013ab0010009c00002d640000213d000000200440003900000005071002100000000005750049000000000054004b0000000008000019000013b308002041000013b305500197000013b309400197000000000a59013f000000000059004b0000000005000019000013b305004041000013b300a0009c000000000508c019000000000005004b00002d640000c13d00000000053600490000006003300039000000000053043500000000051604360000001f0370018f0000000001750019000000000007004b00002d620000613d000000000242034f000000002402043c0000000005450436000000000015004b00002d5e0000c13d000000000003004b000000000001042d000000000100001900004dbe000104300014000000000002001100000003001d000000000003004b00002d950000613d000000400300043d001300000003001d000013f20030009c000032f20000813d00000013050000290000006003500039000000400030043f0000000204000039000000000545043600000000040000310000000204400367001000000005001d000000004604043c0000000005650436000000000035004b00002d760000c13d000013730910019700000010010000290000000000910435000013730120019700000013020000290000004002200039000100000002001d0000000000120435000013e601000041000000400b00043d00000000001b0435000000000100041000001373021001970000002401b0003900000000002104350000000401b00039000700000002001d00000000002104350000000001000414000000040090008c001400000009001d00002d970000c13d0000000103000031000000200030008c0000002004000039000000000403401900002dc60000013d0000000001000019000000000001042d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002db40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002db00000c13d000000000006004b00002dc10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000014090000290000336f0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f0000001f0030008c000032f00000a13d00000000020b0433000000110020006c00002f290000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002df30000c13d000000010200003900002e090000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032cb0000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002e230000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002e1f0000c13d000000000003004b00002e300000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002e4c0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b00000014090000290000000f0b00002900002e580000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000070200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c00002e680000c13d0000000103000031000000200030008c0000002004000039000000000403401900002e970000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900120000000b001d4dbc4db70000040f000000120b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900002e850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00002e810000c13d000000000006004b00002e920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000001409000029000033960000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000200030008c000032f00000413d0000004404100039000000240510003900000000020b0433000000000002004b0000337b0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000032f20000213d000000800a1000390000004000a0043f000013e80010009c000032f20000213d000000c004100039000000400040043f000000200400003900000000004a0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c00002ec50000c13d000000010200003900002edb0000013d00120000000a001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000032d30000613d0000001409000029000000120a0000290000001f01300039000013de011001970000003f01100039000013de04100197000000400c00043d0000000001c40019000000000041004b00000000040000390000000104004039000013ab0010009c000032f20000213d0000000100400190000032f20000c13d000000400010043f000000000b3c0436000013de043001980000001f0330018f00000000014b0019000000030500036700002ef50000613d000000000605034f00000000070b0019000000006806043c0000000007870436000000000017004b00002ef10000c13d000000000003004b00002f020000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030c0433000000000002004b000032da0000613d000000000003004b00002f1d0000c13d00120000000c001d000f0000000b001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b00000012010000290000338f0000613d0000000003010433000000000003004b0000000f0b00002900002f290000613d000013ac0030009c000032f00000213d000000200030008c000032f00000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b000033650000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000600000001001d00000013010000290000000001010433000000010010008c000033590000a13d000013ab0010009c000032f20000213d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001400000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000014030000290000000001130436001200000001001d0000001f0120018f000000000002004b00002f5b0000613d0000001204000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00002f570000c13d000000000001004b00000014010000290000000001010433000000000001004b000032f80000613d00000012010000290000001102000029000000000021043500000013010000290000000001010433000000000001004b000032bd0000613d000300600000003d000200800000003d0000000602000029000f13730020019b0000000005000019000000010210008a000000000025004b000030a70000813d000000000051004b000032f80000a13d0000000103500039000000000031004b000032f80000a13d0000000501500210000b00000001001d0000001006100029000000000106043300001373071001970000000504300210000000100240002900000000010204330000137301100197000000000017004b000032fe0000613d000e00000005001d000800000004001d001100000003001d000000000401001900000000010400190000000001074019000000000001004b000033120000613d000900000002001d000a00000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000d00000007001d000c00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00002fe20000c13d0000000103000031000000600030008c00000060040000390000000004034019000030100000013d000400000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700050000000a001d4dbc4db70000040f000000050a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900002ffe0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00002ffa0000c13d0000001f074001900000300b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000033240000613d00000004050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c000032f20000213d0000000100200190000032f20000c13d000000400010043f000000600030008c000032f00000413d00000000020a0433000013fc0020009c000032f00000213d0000000005050433000013fc0050009c000032f00000213d0000004003a000390000000003030433000013700030009c000032f00000213d0000000c040000290000000d0040006b00000000060500190000000006022019000000000502a019000000140200002900000000020204330000000e04000029000000000042004b0000001103000029000032f80000a13d00000013020000290000000002020433000000000042004b000032f80000a13d000000000032004b000032f80000a13d0000000a0200002900000000020204330000137302200197000000090300002900000000030304330000137304300197000000000042004b000032ff0000613d000d00000006001d00000000030400190000000003024019000000000003004b000033130000613d000e00000005001d0000000b0600002900000012056000290000000005050433000c00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000032f20000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000e02000029000032f00000613d000000000101043b00001373041001970000000c010000290000000d0300002900000006050000294dbc47890000040f000000140200002900000000020204330000001103000029000000000032004b000032f80000a13d00000008040000290000001202400029000000000012043500000013010000290000000001010433000000000001004b000000000503001900002f6c0000c13d000032bd0000013d00000014020000290000000002020433000000000002004b000032bd0000613d000000050220021000000014022000290000000002020433000000000002004b0000335d0000613d000000010010008c000032f80000613d000000100100002900000000010104330000137305100197000000010100002900000000010104330000137303100197000000000035004b000032fe0000613d00000000010300190000000001054019000000000001004b000033120000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001100000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000f0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d00000014020000290000000002020433000000000002004b000032f80000613d000000000101043b00000012020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af03000041000000000031043500000024032000390000000704000029000000000043043500000064030000390000000000320435000013f70020009c000032f20000213d000000a003200039000000400030043f000000000302043300000000040004140000001102000029000000040020008c0000312b0000c13d00000001020000390000000101000031000000000001004b0000313e0000c13d000031680000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000031680000613d0000001f03100039000013de033001970000003f03300039000013de03300197000000400400043d0000000003340019000300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c000032f20000213d0000000100400190000032f20000c13d000000400030043f00000003030000290000000005130436000013de031001980000001f0410018f000200000005001d000000000135001900000003050003670000315b0000613d000000000605034f0000000207000029000000006806043c0000000007870436000000000017004b000031570000c13d000000000004004b000031680000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000000002004b0000334f0000613d00000003010000290000000001010433000000000001004b0000317b0000613d000013ac0010009c000032f00000213d000000200010008c000032f00000413d00000002010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000032f00000c13d000000000001004b0000334f0000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000033230000613d00000013020000290000000002020433000000000002004b000032bd0000613d000000000101043b000913730010019b0000000001000019000000010320008a000000000031004b000032c30000813d000000000012004b000032f80000a13d0000000107100039000000000072004b000032f80000a13d00000005031002100000001003300029000000000303043300001373043001970000000505700210000000100350002900000000030304330000137303300197000000000034004b000032fe0000613d00000000080300190000000008044019000000000008004b000033120000613d000000000034004b0000000009030019000000000904201900000014060000290000000006060433000000000076004b000032f80000a13d00000012055000290000000005050433000000000034004b00000000040500190000000004002019000f00000004001d000000000500a019001100000005001d000000020420008a000000000041004b0000000704000029000e00000007001d000032160000813d0000000201100039000000000012004b000032f80000a13d00000005011002100000001002100029000000400100043d00000000020204330000137304200197000000000043004b000032ff0000613d000c00000009001d000d00000008001d00000000020400190000000002034019000000000002004b000033130000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b00001373041001970000000d080000290000000c09000029000d00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000032f20000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000090300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000032f20000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000032f00000613d000000000101043b000000400300043d000013b80030009c000032f20000213d00001373021001970000002001300039000b00000001001d000000400010043f000a00000003001d0000000000030435000013b5010000410000000000100443000c00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000033230000613d000000000101043b000000000001004b000032f00000613d000000400600043d00000064016000390000008002000039000000000021043500000044016000390000000d02000029000000000021043500000024016000390000000f020000290000000000210435000013f80100004100000000001604350000000401600039000000110200002900000000002104350000000a01000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000b07000029000032970000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000032900000413d0000000002210019000000000002043500000000040004140000000c02000029000000040020008c000032b50000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001100000006001d4dbc4db20000040f000000110600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000033300000613d000013ab0060009c000032f20000213d000000400060043f00000013010000290000000002010433000000000002004b0000000e01000029000031900000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000014010000290000000001010433000000020010008c000032f80000413d000000140100002900000040011000390000000001010433000000000001042d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002e330000c13d000032da0000013d000000600c000039000000800b0000390000001409000029000000120a00002900000000030c0433000000000002004b00002f050000c13d00000000010a0019000000000003004b000033870000c13d000000400400043d001400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000014020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000332b0000c13d0000333c0000013d00001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033380000c13d000000000005004b000033490000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000033070000013d000000400100043d0000004402100039000013fd03000041000033150000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a03000039000033070000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033760000c13d0000333c0000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000330c0000013d0000137000b0009c000013700b0080410000004002b00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d03000039000033180000013d0000001f0530018f0000137206300198000000400200043d00000000046200190000333c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000339d0000c13d0000333c0000013d0004000000000002000000400b00043d000013e60300004100000000003b0435000000000300041000001373033001970000002404b0003900000000003404350000000404b00039000000000034043500000000040004140000137309100197000000040090008c000400000009001d000300000003001d000033b70000c13d0000000103000031000000200030008c00000020040000390000000004034019000033e80000013d000100000002001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700040009c0000137004008041000000c002400210000000000112019f000013c6011001c7000000000209001900020000000b001d4dbc4db70000040f000000020b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033d50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000033d10000c13d000000000006004b000033e20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000004090000290000358e0000613d00000001020000290000001f01400039000000600410018f0000000001b40019000000000041004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f0000001f0030008c0000357d0000a13d00000000040b0433000000000024004b000035500000813d0000002002100039000013e70400004100000000004204350000002404100039000000000500041000000000005404350000004404000039000000000041043500000044041000390000000000040435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000000200a00008a000034160000c13d00000001020000390000342d0000013d00020000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137003100198000035510000613d0000000409000029000000200a00008a000000020b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c00190000000305000367000034470000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000034430000c13d000000000003004b000034540000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000034710000c13d00020000000d001d00010000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000201000029000035b40000613d0000000003010433000000000003004b0000000409000029000000200a00008a000000010c0000290000347d0000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000400b00043d000013e60100004100000000001b04350000002401b00039000000030200002900000000002104350000000401b0003900000000002104350000000001000414000000040090008c0000348d0000c13d0000000103000031000000200030008c00000020040000390000000004034019000034bd0000013d0000137000b0009c000013700200004100000000020b40190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f000013c6011001c7000000000209001900030000000b001d4dbc4db70000040f000000030b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000034aa0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000034a60000c13d000000000006004b000034b70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000000409000029000000200a00008a000035c50000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000013ab0010009c000035770000213d0000000100200190000035770000c13d000000400010043f000000200030008c0000357d0000413d0000004404100039000000240510003900000000020b0433000000000002004b0000359a0000c13d0000002002100039000013e706000041000000000062043500000000060004100000000000650435000000010500008a000000000054043500000044040000390000000000410435000013cb0010009c000035770000213d000000800b1000390000004000b0043f000013e80010009c000035770000213d000000c004100039000000400040043f000000200400003900000000004b0435000000a004100039000013e905000041000000000054043500000000040104330000000001000414000000040090008c000034eb0000c13d0000000102000039000035020000013d00030000000b001d000013700020009c00001370020080410000004002200210000013700040009c00001370040080410000006003400210000000000223019f000013700010009c0000137001008041000000c001100210000000000112019f00000000020900194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d00001370031001980000355a0000613d0000000409000029000000200a00008a000000030b0000290000001f013000390000000001a1016f0000003f011000390000000001a1016f000000400d00043d00000000011d00190000000000d1004b00000000040000390000000104004039000013ab0010009c000035770000213d0000000100400190000035770000c13d000000400010043f000000000c3d04360000000004a301700000001f0330018f00000000014c001900000003050003670000351c0000613d000000000605034f00000000070c0019000000006806043c0000000007870436000000000017004b000035180000c13d000000000003004b000035290000613d000000000445034f0000000303300210000000000501043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f000000000031043500000000030d0433000000000002004b000035610000613d000000000003004b000035440000c13d00030000000d001d00020000000c001d000013b501000041000000000010044300000004009004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000035b30000613d000000000101043b000000000001004b0000000301000029000035b40000613d0000000003010433000000000003004b000000020c000029000035500000613d000013ac0030009c0000357d0000213d000000200030008c0000357d0000413d00000000010c0433000000000001004b0000000002000039000000010200c039000000000021004b0000357d0000c13d000000000001004b0000357f0000613d000000000001042d000000600d000039000000800c0000390000000409000029000000200a00008a000000020b00002900000000030d0433000000000002004b000034570000c13d000035610000013d000000600d000039000000800c0000390000000409000029000000030b00002900000000030d0433000000000002004b0000352c0000c13d00000000010b0019000000000003004b000035ab0000c13d000000400400043d000400000004001d000013bf02000041000000000024043500000004034000390000002002000039000000000023043500000024024000394dbc25810000040f00000004020000290000000001210049000013700010009c0000137001008041000013700020009c000013700200804100000060011002100000004002200210000000000121019f00004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000000400100043d0000006402100039000013ec0300004100000000003204350000004402100039000013ed03000041000000000032043500000024021000390000002a030000390000000000320435000013bf02000041000000000021043500000004021000390000002003000039000035a50000013d0000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035950000c13d000035d00000013d000013bf02000041000000000021043500000004021000390000002003000039000000000032043500000036020000390000000000250435000013ea0200004100000000002404350000006402100039000013eb030000410000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000137000c0009c000013700c0080410000004002c00210000013700030009c00001370030080410000006001300210000000000121019f00004dbe00010430000000000001042f000000400100043d0000004402100039000013f003000041000000000032043500000024021000390000001d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000035d00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035cc0000c13d000000000005004b000035dd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000000003010019000000400400043d000000440140003900000000002104350000002001400039000013c502000041000000000021043500000024024000390000dead05000039000000000052043500000044020000390000000000240435000013fe0040009c0000364b0000813d0000008002400039000000400020043f00000000040404330000000002000414000000040030008c000036230000c13d00000001020000390000000104000031000000000004004b000036370000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c0000364b0000213d00000001006001900000364b0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036150000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036110000c13d000000000006004b000036390000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036390000013d000013700010009c00001370010080410000004001100210000013700040009c00001370040080410000006004400210000000000114019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020300194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000035fb0000c13d00000060010000390000008003000039000000000002004b000036510000613d0000000001010433000000000001004b0000364a0000613d000013ac0010009c000036650000213d0000001f0010008c000036650000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036650000c13d000000000001004b000036510000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000004010019000000400500043d000000440150003900000000003104350000002001500039000013c503000041000000000031043500001373022001970000002403500039000000000023043500000044020000390000000000250435000013fe0050009c000036cf0000813d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000036a70000c13d00000001020000390000000104000031000000000004004b000036bb0000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000036cf0000213d0000000100600190000036cf0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000036990000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000036950000c13d000000000006004b000036bd0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000036bd0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020400194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b0000367f0000c13d00000060010000390000008003000039000000000002004b000036d50000613d0000000001010433000000000001004b000036ce0000613d000013ac0010009c000036e90000213d0000001f0010008c000036e90000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000036e90000c13d000000000001004b000036d50000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013ff03000041000000000032043500000044021000390000140003000041000000000032043500000024021000390000002d030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe000104300000000005010019000000400600043d000000640160003900000000004104350000137301300197000000440360003900000000001304350000002001600039000013af03000041000000000031043500001373022001970000002403600039000000000023043500000064020000390000000000260435000014010060009c000037560000813d000000a002600039000000400020043f00000000030604330000000002000414000000040050008c0000372e0000c13d00000001020000390000000104000031000000000004004b000037420000613d0000001f01400039000013de011001970000003f01100039000013de03100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000013ab0030009c000037560000213d0000000100600190000037560000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000037200000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000371c0000c13d000000000006004b000037440000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000037440000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000037060000c13d00000060010000390000008003000039000000000002004b0000375c0000613d0000000001010433000000000001004b000037550000613d000013ac0010009c000037700000213d0000001f0010008c000037700000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000037700000c13d000000000001004b0000375c0000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa030000410000000000320435000000240210003900000031030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000000100001900004dbe0001043000000000030200190000000004010019000000400100043d000014020010009c000037bc0000813d0000002002100039000000400020043f00000000000104350000000001000414000000040040008c000037820000c13d00000001020000390000000101000031000000000001004b000037930000c13d000037b90000013d000013700010009c0000137001008041000000c001100210000000000003004b0000378b0000613d000013b9011001c7000080090200003900000000050000190000378c0000013d00000000020400194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000037b90000613d0000001f04100039000013de044001970000003f04400039000013de05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000013ab0050009c000037bc0000213d0000000100600190000037bc0000c13d000000400050043f0000000006140436000013de031001980000001f0410018f00000000013600190000000305000367000037ac0000613d000000000705034f000000007807043c0000000006860436000000000016004b000037a80000c13d000000000004004b000037b90000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000037c20000613d000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000a000000000002000300000006001d000200000005001d000800000004001d000900000003001d000700000002001d000a00000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000396c0000613d000000000201043b000000400c00043d000014030100004100000000001c0435000000070500002900001373065001970000002401c0003900000000006104350000000a0100002900001373071001970000000401c00039000000000071043500000000010004140000137302200197000000040020008c000600000002001d000038010000c13d0000000103000031000000200030008c00000020040000390000000004034019000038330000013d000400000007001d000500000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c700010000000c001d4dbc4db70000040f000000010c000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057c00190000381f0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b0000381b0000c13d000000000006004b0000382c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039c20000613d0000000705000029000000050600002900000004070000290000001f01400039000000600110018f000000000bc1001900000000001b004b00000000020000390000000102004039000013ab00b0009c000039660000213d0000000100200190000039660000c13d0000004000b0043f0000001f0030008c000039640000a13d00000000020c0433000013730020009c000039640000213d000000000002004b000038470000613d00000000010b00190000388f0000013d0000002402b000390000000000620435000014040200004100000000002b04350000000402b00039000000000072043500000000020004140000000604000029000000040040008c000038860000613d000400000007001d000500000006001d0000137000b0009c000013700100004100000000010b40190000004001100210000013700020009c0000137002008041000000c002200210000000000112019f000013c6011001c7000000060200002900010000000b001d4dbc4db20000040f000000010b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000038700000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000386c0000c13d000000000006004b0000387d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039f90000613d0000001f01400039000000600110018f0000000705000029000000050600002900000004070000290000000001b10019000013ab0010009c000039660000213d000000400010043f000000200030008c000039640000413d00000000020b0433000013730020009c000039640000213d000000000067004b0000396d0000613d0000000a02000029000000000305001900000000030240190000137300300198000039800000613d000000000067004b0000000005028019000700000003001d00000060033002100000002002100039000000000032043500000060035002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000039660000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000060300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000039660000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000039640000613d000000000201043b000000400b00043d000013fb0100004100000000051b043600000000010004140000137302200197000000040020008c000038ec0000c13d0000000103000031000000600030008c000000600400003900000000040340190000391b0000013d000500000005001d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700060000000b001d4dbc4db70000040f000000060b000029000000000301001900000060033002700000137003300197000000600030008c000000600400003900000000040340190000001f0640018f000000600740019000000000057b0019000039090000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000039050000c13d000000000006004b000039160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000039e00000613d00000005050000290000001f01400039000000e00110018f0000000002b10019000000000012004b00000000010000390000000101004039000013ab0020009c000039660000213d0000000100100190000039660000c13d000000400020043f000000600030008c000039640000413d00000000010b0433000013fc0010009c000039640000213d0000000004050433000013fc0040009c000039640000213d0000004003b000390000000003030433000013700030009c000039640000213d00000007050000290000000a0350014f000013730030019800000000030100190000000003046019000000000104c01900000000003101a00000395c0000613d000000090000006b000039900000613d000000000001004b000039af0000613d000000000003004b000039af0000613d00000009043000b900000009054000fa000000000035004b000039990000c13d00000000053400d9000000090050006c0000399f0000c13d00000000041400d90000000805000029000000000054004b0000395f0000a13d000000000005004b000039900000613d00000008041000b900000008054000fa000000000015004b000039990000c13d00000000011400d9000000080010006c0000399f0000c13d00000000013400d9000000090010006c000039ec0000213d000000020010006c0000000804000029000039f20000413d0000000002040019000000000001042d00000009010000290000000802000029000000000001042d000000030040006c00000009010000290000395a0000813d000013bc01000041000039f30000013d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000001042f0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000000064012000390000140803000041000000000031043500000044012000390000140903000041000000000031043500000024012000390000002503000039000039b70000013d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440120003900001405030000410000000000310435000000240120003900000014030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013b0011001c700004dbe00010430000000640120003900001406030000410000000000310435000000440120003900001407030000410000000000310435000000240120003900000028030000390000000000310435000013bf010000410000000000120435000000040120003900000020030000390000000000310435000013700020009c00001370020080410000004001200210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000039cd0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039c90000c13d000000000005004b000039da0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000039e70000c13d00003a040000013d000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe00010430000013bd010000410000000000120435000013700020009c0000137002008041000000400120021000001378011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900003a040000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a000000c13d000000000005004b00003a110000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe000104300013000000000002001300000006001d000500000005001d000100000004001d001200000003001d000200000002001d001000000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000130010006c00003e320000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000600000001001d00000012010000290000000021010434000f00000002001d000000010010008c00003e350000a13d000013df0010009c00003dcb0000813d00000005021002100000003f03200039000013b403300197000000400400043d0000000003340019001300000004001d000000000043004b00000000040000390000000104004039000013ab0030009c00003dcb0000213d000000010040019000003dcb0000c13d000000400030043f00000013030000290000000001130436001100000001001d0000001f0120018f000000000002004b00003a5f0000613d0000001104000029000000000224001900000000030000310000000203300367000000003503043c0000000004540436000000000024004b00003a5b0000c13d000000000001004b00000013010000290000000001010433000000000001004b00003dd10000613d00000011010000290000001002000029000000000021043500000012010000290000000001010433000000000001004b00003dc10000613d0000000602000029000e13730020019b0000000005000019000000010210008a000000000025004b00003ba90000813d000000000051004b00003dd10000a13d0000000103500039000000000031004b00003dd10000a13d0000000501500210000a00000001001d0000000f061000290000000001060433000013730710019700000005043002100000000f0240002900000000010204330000137301100197000000000017004b00003dd70000613d000d00000005001d000700000004001d001000000003001d000000000401001900000000010400190000000001074019000000000001004b00003deb0000613d000800000002001d000900000006001d0000006003100210000000400100043d00000020021000390000000000320435000000000047004b000c00000007001d000b00000004001d0000000003040019000000000307201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00003ae40000c13d0000000103000031000000600030008c0000006004000039000000000403401900003b120000013d000300000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700040000000a001d4dbc4db70000040f000000040a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900003b000000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00003afc0000c13d0000001f0740019000003b0d0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000003dfd0000613d00000003050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00003dcb0000213d000000010020019000003dcb0000c13d000000400010043f000000600030008c00003dc90000413d00000000020a0433000013fc0020009c00003dc90000213d0000000005050433000013fc0050009c00003dc90000213d0000004003a000390000000003030433000013700030009c00003dc90000213d0000000b040000290000000c0040006b00000000060500190000000006022019000000000502a019000000130200002900000000020204330000000d04000029000000000042004b000000100300002900003dd10000a13d00000012020000290000000002020433000000000042004b00003dd10000a13d000000000032004b00003dd10000a13d000000090200002900000000020204330000137302200197000000080300002900000000030304330000137304300197000000000042004b00003dd80000613d000c00000006001d00000000030400190000000003024019000000000003004b00003dec0000613d000d00000005001d0000000a0600002900000011056000290000000005050433000b00000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00003dcb0000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000d0200002900003dc90000613d000000000101043b00001373041001970000000b010000290000000c0300002900000006050000294dbc47890000040f000000130200002900000000020204330000001003000029000000000032004b00003dd10000a13d00000007040000290000001102400029000000000012043500000012010000290000000001010433000000000001004b000000000503001900003a6e0000c13d00003dc10000013d00000013020000290000000002020433000000000002004b00003dc10000613d000000050220021000000013022000290000000002020433000000020020006c00003e390000413d000000010010008c00003dd10000613d0000000f01000029000000000101043300001373051001970000001201000029000000400110003900000000010104330000137303100197000000000035004b00003dd70000613d00000000010300190000000001054019000000000001004b00003deb0000613d0000006004100210000000400100043d00000020021000390000000000420435000000000035004b001000000005001d000000000305201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000e0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d00000013020000290000000002020433000000000002004b00003dd10000613d000000000101043b00000011020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000010300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c00003dcb0000213d000000a003200039000000400030043f000000000302043300000000040004140000001002000029000000040020008c00003c570000c13d00000001020000390000000104000031000000000004004b000000200300008a00003c6b0000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c00003dcb0000213d000000010050019000003dcb0000c13d000000400030043f0000000003410436000013de054001980000001f0640018f0000000004530019000000030700036700003c490000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00003c450000c13d000000000006004b00003c6d0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500003c6d0000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700040009c0000137004008041000000c003400210000000000131019f4dbc4db20000040f000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a00003c2f0000c13d00000060010000390000008003000039000000000002004b00003e280000613d0000000001010433000000000001004b00003c7e0000613d000013ac0010009c00003dc90000213d000000200010008c00003dc90000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b00003dc90000c13d000000000001004b00003e280000613d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003dfc0000613d00000012020000290000000002020433000000000002004b00003dc10000613d000000000101043b000813730010019b0000000001000019000000010320008a000000000031004b00003dc70000813d000000000012004b00003dd10000a13d0000000107100039000000000072004b00003dd10000a13d00000005031002100000000f033000290000000003030433000013730430019700000005057002100000000f0350002900000000030304330000137303300197000000000034004b00003dd70000613d00000000080300190000000008044019000000000008004b00003deb0000613d000000000034004b0000000009030019000000000904201900000013060000290000000006060433000000000076004b00003dd10000a13d00000011055000290000000005050433000000000034004b00000000040500190000000004002019000e00000004001d000000000500a019001000000005001d000000020420008a000000000041004b0000000504000029000d00000007001d00003d190000813d0000000201100039000000000012004b00003dd10000a13d00000005011002100000000f02100029000000400100043d00000000020204330000137304200197000000000043004b00003dd80000613d000b00000009001d000c00000008001d00000000020400190000000002034019000000000002004b00003dec0000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b00001373041001970000000c080000290000000b09000029000c00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003dcb0000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000080300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003dcb0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003dc90000613d000000000101043b000000400300043d000013b80030009c00003dcb0000213d00001373021001970000002001300039000a00000001001d000000400010043f000900000003001d0000000000030435000013b5010000410000000000100443000b00000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003dfc0000613d000000000101043b000000000001004b00003dc90000613d000000400600043d0000006401600039000000800200003900000000002104350000000c0100002900001373011001970000004402600039000000000012043500000024016000390000000e020000290000000000210435000013f80100004100000000001604350000000401600039000000100200002900000000002104350000000901000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000a0700002900003d9b0000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003d940000413d0000000002210019000000000002043500000000040004140000000b02000029000000040020008c00003db90000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f001000000006001d4dbc4db20000040f000000100600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003e090000613d000013ab0060009c00003dcb0000213d000000400060043f00000012010000290000000002010433000000000002004b0000000d0100002900003c930000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000001301000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f0000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e040000c13d00003e150000013d00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003e150000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003e110000c13d000000000005004b00003e220000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa0300004100000000003204350000002402100039000000310300003900003de00000013d000000400100043d000013dc0200004100003e3b0000013d000000400100043d0000004402100039000013fd0300004100003dee0000013d000000400100043d000013db020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000200000003001d000300000002001d000400000001001d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f000000010020019000003fc50000613d00000003020000290000000032020434000600000003001d000000000002004b00003f8b0000613d0000000403000029000100200030003d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b00003f910000813d000000000012004b00003f9a0000a13d0000000107100039000000000072004b00003f9a0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b00003fa00000613d00000000080300190000000008044019000000000008004b00003fb40000613d000000000034004b0000000009030019000000000904201900000004060000290000000006060433000000000076004b00003f9a0000a13d00000001055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000204000029000b00000007001d00003ee30000813d0000000201100039000000000012004b00003f9a0000a13d0000000501100210000000060110002900000000010104330000137304100197000000000043004b00003fa00000613d000a00000009001d00000000010400190000000001034019000000000001004b00003fb40000613d000900000008001d0000006005100210000000400100043d00000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00003f920000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000013730410019700000009080000290000000a09000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f20010009c00003f920000813d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00003f920000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000003f980000613d000000000101043b000000400300043d000013b80030009c00003f920000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f000000010020019000003fc50000613d000000000101043b000000000001004b00003f980000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b000000080700002900003f650000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003f5e0000413d0000000002120019000000000002043500000000040004140000000902000029000000040020008c00003f830000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000131019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d0003000000010355000000010020019000003fc60000613d000013ab0060009c00003f920000213d000000400060043f00000003010000290000000002010433000000000002004b0000000b0100002900003e5d0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000000000001042f00001370033001970000001f0530018f0000137206300198000000400200043d000000000462001900003fd20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003fce0000c13d000000000005004b00003fdf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe00010430000d000000000002000b00000007001d000100000006001d000800000005001d000d00000004001d000c00000003001d000900000002001d000a00000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b0000000b0010006c000042dd0000213d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d0000000002000031000000000101043b000b00000001001d0000000d01000029000013df0010009c0000000c06000029000042820000813d0000000d0100002900000005011002100000003f03100039000713b40030019b000000400300043d0000000704300029000000000034004b00000000050000390000000105004039000013ab0040009c000042820000213d0000000100500190000042820000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000042800000213d000000000067004b000040310000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000042800000213d000000200220003900000000005204350000002004400039000000000074004b000040280000413d0000000b010000290000000a02000029000a00000007001d4dbc4b210000040f0000000c03000029000200000001001d0000000021010434000300000002001d000000000001004b000042880000613d00000003010000290000000001010433000000090010006c000042e00000213d0000000d0000006b000042880000613d0000000201000367000000000231034f000000000502043b000013730050009c000042800000213d0000000d02000029000000010020008c000042880000613d0000002002300039000000000121034f000000000201043b000013730020009c000042800000213d000000400100043d000000000025004b000042900000613d00000000030200190000000003054019000000000003004b000042a40000613d000000600430021000000020031000390000000000430435000000000025004b000000000205201900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c000042820000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000900000005001d4dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000b020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009050000290000000a0c0000290000000c0b0000290000000100200190000042800000613d00000002020000290000000002020433000000000002004b000042880000613d000000000101043b00000003020000290000000003020433000000400200043d000000640420003900000000003404350000137301100197000000440320003900000000001304350000002001200039000013af030000410000000000310435000000080300002900001373033001970000002404200039000000000034043500000064030000390000000000320435000013f70020009c000042820000213d000000a003200039000000400030043f00000000030204330000000002000414000000040050008c000040ed0000c13d00000001020000390000000104000031000000000004004b000000200300008a000041040000613d0000001f01400039000000000131016f0000003f01100039000000000331016f000000400100043d0000000003310019000000000013004b00000000050000390000000105004039000013ab0030009c000042820000213d0000000100500190000042820000c13d000000400030043f0000000003410436000013de054001980000001f0640018f00000000045300190000000307000367000040df0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000040db0000c13d000000000006004b000041060000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000041060000013d000013700010009c00001370010080410000004001100210000013700030009c00001370030080410000006003300210000000000113019f000013700020009c0000137002008041000000c002200210000000000121019f00000000020500194dbc4db20000040f0000000a0c0000290000000c0b000029000000010220018f00030000000103550000006001100270000113700010019d0000137004100197000000000004004b000000200300008a000040c50000c13d00000060010000390000008003000039000000000002004b000042d30000613d0000000001010433000000000001004b000041170000613d000013ac0010009c000042800000213d000000200010008c000042800000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000042800000c13d000000000001004b000042d30000613d000000400200043d0000000701200029000400000002001d000000000021004b00000000020000390000000102004039000013ab0010009c000042820000213d0000000100200190000042820000c13d000000400010043f00000004010000290000000d030000290000000001310436000600000001001d0000000000c0007c000042800000213d0000000000bc004b000041350000a13d000000020100036700000004020000290000000003b1034f000000000303043b000013730030009c000042800000213d00000020022000390000000000320435000000200bb000390000000000cb004b0000412c0000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f00000001002001900000428e0000613d00000004020000290000000002020433000000000002004b000042780000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b0000427e0000813d000000000012004b000042880000a13d0000000107100039000000000072004b000042880000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b0000428f0000613d00000000080300190000000008044019000000000008004b000042a30000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b000042880000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000041d00000813d0000000201100039000000000012004b000042880000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000042900000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000042a40000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000042820000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000042820000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000042800000613d000000000101043b000000400300043d000013b80030009c000042820000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f00000001002001900000428e0000613d000000000101043b000000000001004b000042800000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000042520000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b0000424b0000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000042700000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000042b40000613d000013ab0060009c000042820000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b010000290000414a0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000042c00000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000042bc0000c13d000000000005004b000042cd0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000006402100039000013f90300004100000000003204350000004402100039000013fa03000041000000000032043500000024021000390000003103000039000042980000013d000000400100043d000013dc02000041000042e20000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe00010430000d000000000002000b00000005001d000100000004001d000d00000003001d000c00000002001d000900000001001d000013ad0100004100000000001004430000000001000414000013700010009c0000137001008041000000c001100210000013ae011001c70000800b020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b0000000b0010006c0000000c01000029000046570000213d0000000d0000006b0000460c0000613d0000000201100367000000000101043b000b00000001001d000013f10010009c000046040000813d0000137501000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b00001373011001970000000b0010006b0000465a0000c13d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d0000000002000031000000000101043b000a00000001001d0000000d01000029000013df0010009c0000000c06000029000046060000813d0000000d0100002900000005011002100000003f03100039000813b40030019b000000400300043d0000000804300029000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000d0400002900000000004304350000000007610019000000000027004b000046040000213d000000000067004b0000434d0000a13d000000020100036700000000020300190000000004060019000000000541034f000000000505043b000013730050009c000046040000213d000000200220003900000000005204350000002004400039000000000074004b000043440000413d0000000a010000290000000902000029000900000007001d4dbc4b210000040f000200000001001d0000000021010434000300000002001d000000000001004b0000460c0000613d000000030100002900000000020104330000000001000416000700000002001d000000000012004b0000465d0000213d000013b50100004100000000001004430000000b0100002900000004001004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b0000000c05000029000046040000613d000000400600043d000013c301000041000000000716043600000000010004140000000b04000029000000040040008c000043910000613d000500000007001d000013700060009c000600000006001d000013700200004100000000020640190000004002200210000013700010009c0000137001008041000000c001100210000000000121019f0000000703000029000000000003004b000043850000613d000013c4011001c700008009020000390000000005000019000043870000013d00001378011001c700000000020400194dbc4db20000040f000300000001035500000000030100190000006003300270000113700030019d00000001002001900000000c05000029000000060600002900000005070000290000468e0000613d000013ab0060009c000046060000213d000000400060043f0000000202000367000000000152034f000000000101043b000013730010009c000046040000213d0000000d03000029000000020030008c0000460c0000413d0000002003500039000000000232034f000000000202043b000013730020009c000046040000213d000000000021004b000046650000613d00000000030200190000000003014019000000000003004b000046780000613d00000060033002100000000000370435000000000021004b000000000102a01900000060011002100000003402600039000000000012043500000028010000390000000000160435000013f30060009c000046060000213d0000006001600039000000400010043f000013700070009c000013700700804100000040017002100000000002060433000013700020009c00001370020080410000006002200210000000000112019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000000a020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000009060000290000000c050000290000000100200190000046040000613d00000002020000290000000002020433000000000002004b0000460c0000613d000000000101043b00000003020000290000000002020433000000400b00043d0000002403b000390000000000230435000013c50200004100000000002b043500001373011001970000000402b00039000000000012043500000000010004140000000b02000029000000040020008c000044090000c13d0000000103000031000000200030008c00000020040000390000000004034019000044380000013d0000137000b0009c000013700300004100000000030b40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013c6011001c7000b0000000b001d4dbc4db20000040f0000000b0b000029000000000301001900000060033002700000137003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000044250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000044210000c13d000000000006004b000044320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046ad0000613d0000000c0500002900000009060000290000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000400000002001d000013ab0020009c000046060000213d0000000100100190000046060000c13d0000000401000029000000400010043f000000200030008c000046040000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000046040000c13d000000000001004b000046880000613d00000008010000290000000401100029000000040010006c00000000020000390000000102004039000013ab0010009c000046060000213d0000000100200190000046060000c13d000000400010043f0000000d0100002900000004030000290000000001130436000600000001001d000000000060007c000046040000213d000000000056004b0000446c0000a13d00000002010003670000000402000029000000000351034f000000000303043b000013730030009c000046040000213d000000200220003900000000003204350000002005500039000000000065004b000044630000413d000013750100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000013700010009c0000137001008041000000c00110021000001376011001c700008005020000394dbc4db70000040f0000000100200190000046120000613d00000004020000290000000002020433000000000002004b000045af0000613d000000000101043b000513730010019b0000000001000019000000010320008a000000000031004b000045b50000813d000000000012004b0000460c0000a13d0000000107100039000000000072004b0000460c0000a13d00000005031002100000000603300029000000000303043300001373043001970000000505700210000000060350002900000000030304330000137303300197000000000034004b000046130000613d00000000080300190000000008044019000000000008004b000046270000613d000000000034004b0000000009030019000000000904201900000002060000290000000006060433000000000076004b0000460c0000a13d00000003055000290000000005050433000000000034004b00000000040500190000000004002019000c00000004001d000000000500a019000d00000005001d000000020420008a000000000041004b0000000104000029000b00000007001d000045070000813d0000000201100039000000000012004b0000460c0000a13d00000005011002100000000602100029000000400100043d00000000020204330000137304200197000000000043004b000046140000613d000900000009001d000a00000008001d00000000020400190000000002034019000000000002004b000046280000613d000000600520021000000020021000390000000000520435000000000043004b000000000304a01900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b00001373041001970000000a080000290000000909000029000a00000004001d0000006003800210000000400100043d0000002002100039000000000032043500000060039002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c000046060000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f5040000410000000000430435000000600310003900000000002304350000004002100039000000050300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c000046060000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000046040000613d000000000101043b000000400300043d000013b80030009c000046060000213d00001373021001970000002001300039000800000001001d000000400010043f000700000003001d0000000000030435000013b5010000410000000000100443000900000002001d00000004002004430000000001000414000013700010009c0000137001008041000000c001100210000013b6011001c700008002020000394dbc4db70000040f0000000100200190000046120000613d000000000101043b000000000001004b000046040000613d000000400600043d0000006401600039000000800200003900000000002104350000000a0100002900001373011001970000004402600039000000000012043500000024016000390000000c020000290000000000210435000013f801000041000000000016043500000004016000390000000d0200002900000000002104350000000701000029000000000101043300000084026000390000000000120435000000a402600039000000000001004b0000000807000029000045890000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b000045820000413d0000000002210019000000000002043500000000040004140000000902000029000000040020008c000045a70000613d0000001f01100039000013de01100197000000a401100039000013700010009c00001370010080410000006001100210000013700060009c000013700300004100000000030640190000004003300210000000000131019f000013700040009c0000137004008041000000c003400210000000000113019f000d00000006001d4dbc4db20000040f0000000d0600002900000000030100190000006003300270000113700030019d00030000000103550000000100200190000046380000613d000013ab0060009c000046060000213d000000400060043f00000004010000290000000002010433000000000002004b0000000b01000029000044810000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe0001043000000002010000290000000001010433000000000001004b0000460c0000613d000000030100002900000000010104330000000002000416000000000312004b000046020000a13d000000400100043d000013b80010009c000046060000213d00000000040004110000002002100039000000400020043f00000000000104350000000001000414000000040040008c000045cd0000c13d00000001020000390000000101000031000000000001004b000045da0000c13d000046000000013d000013700010009c0000137001008041000000c001100210000013b9011001c7000080090200003900000000050000194dbc4db20000040f00030000000103550000006001100270000113700010019d0000137001100197000000000001004b000046000000613d0000001f03100039000013de033001970000003f03300039000013de04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000013ab0040009c000046060000213d0000000100500190000046060000c13d000000400040043f0000000006130436000013de031001980000001f0410018f00000000013600190000000305000367000045f30000613d000000000705034f000000007807043c0000000006860436000000000016004b000045ef0000c13d000000000004004b000046000000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000100200190000046b90000613d0000000201000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000000000001042f000000400100043d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000000400100043d0000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046400000c13d000000000005004b000046510000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d000013dc020000410000465f0000013d000000400100043d000013da020000410000465f0000013d000000400100043d000013d9020000410000000000210435000013700010009c0000137001008041000000400110021000001378011001c700004dbe000104300000006401600039000013c00200004100000000002104350000004401600039000013c1020000410000000000210435000000240160003900000025020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013c2011001c700004dbe000104300000004401600039000013be02000041000000000021043500000024016000390000001e020000390000000000210435000013bf010000410000000000160435000000040160003900000020020000390000000000210435000013700060009c00001370060080410000004001600210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000000101000039000000040010043f000013b20100004100004dbe0001043000001370033001970000001f0530018f0000137206300198000000400200043d00000000046200190000469a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046960000c13d000000000005004b000046a70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300000001f0530018f0000137206300198000000400200043d0000000004620019000046440000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046b40000c13d000046440000013d000000400100043d0000006402100039000013c80300004100000000003204350000004402100039000013c9030000410000000000320435000000240210003900000034030000390000461c0000013d0001000000000002000000400700043d00001373042001970000137305300197000000000054004b000047220000613d000000000603001900000000060240190000137300600198000047350000613d000100000001001d000000000054004b000000000302801900000060046002100000002002700039000000000042043500000060033002100000003404700039000000000034043500000028030000390000000000370435000013f20070009c0000471a0000813d0000006003700039000000400030043f000013700020009c000013700200804100000040022002100000000001070433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000001020000290000137302200197000000400310003900000000002304350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c0000471a0000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000100200190000047200000613d000000000101043b0000137301100197000000000001042d000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000006402700039000013c00300004100000000003204350000004402700039000013c1030000410000000000320435000000240270003900000025030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013c2011001c700004dbe000104300000004402700039000013be03000041000000000032043500000024027000390000001e030000390000000000320435000013bf020000410000000000270435000000040270003900000020030000390000000000320435000013700070009c00001370070080410000004001700210000013b0011001c700004dbe00010430000000000001004b000047540000613d000000000002004b0000475e0000613d000000000003004b0000475e0000613d00000000041300a900000000051400d9000000000035004b000047720000c13d00000000033400d9000000000013004b000047780000c13d00000000012400d9000000000001042d000000400100043d00000064021000390000140803000041000000000032043500000044021000390000140903000041000000000032043500000024021000390000002503000039000047670000013d000000400100043d000000640210003900001406030000410000000000320435000000440210003900001407030000410000000000320435000000240210003900000028030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000400100043d000000440210003900001405030000410000000000320435000000240210003900000014030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe0001043000060000000000020000000006020019000000400c00043d0000000407c00039000000000001004b0000482b0000613d000000000006004b000048380000613d000000000003004b000048380000613d0000140a0200004100000000002c04350000137302400197000000000027043500000000040004140000137302500197000000040020008c000047a00000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000047d30000013d000100000001001d000200000003001d000300000006001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000047bf0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000047bb0000c13d000000000006004b000047cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f00030000000103550000000100200190000048580000613d0000000306000029000000020300002900000001010000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c0000484a0000213d00000001002001900000484a0000c13d000000400080043f0000002000b0008c000048500000413d00000000050c0433000027100050008c000048250000213d0000000004000415000000050440008a0000000504400210000027100050008c00000000070000190000000002000019000047fe0000613d000027100550008900000000021500a900000000041200d9000000000054004b000048250000c13d00000000045200d9000000000014004b000048150000c13d0000000004000415000000060440008a0000000504400210000000000002004b000048100000613d0000000004000415000000060440008a000000050440021000000000073200a900000000052700d9000000000035004b000048250000c13d00000000053700d9000000000025004b000048150000c13d0000000504400270000000000407001f00002710046000c900000000056400d9000027100050008c000048250000c13d000027100540011a000000000065004b000048150000c13d000000000042001a000048250000413d000000000142001a000048520000613d00000000011700d9000000000001042d0000000007000019000000000200001900000000053700d9000000000025004b000048010000613d000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002704350000006401c000390000140b0200004100000000002104350000004401c000390000140c0200004100000000002104350000002401c000390000002b02000039000048440000013d000013bf0200004100000000002c0435000000200200003900000000002704350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000048630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000485f0000c13d000000000005004b000048700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe0001043000040000000000020000000007020019000000400c00043d0000000406c00039000000000001004b000049140000613d000000000007004b000049210000613d000000000003004b000049210000613d0000140a0200004100000000002c04350000137302400197000000000026043500000000040004140000137302500197000000040020008c0000488d0000c13d000000010b0000310000002000b0008c000000200400003900000000040b4019000048c00000013d000100000007001d000200000001001d000300000003001d0000137000c0009c000013700300004100000000030c40190000004003300210000013700040009c0000137004008041000000c001400210000000000131019f000013b2011001c700040000000c001d4dbc4db70000040f000000040c00002900000000030100190000006003300270000013700b3001970000002000b0008c000000200400003900000000040b40190000001f0640018f000000200740019000000000057c0019000048ac0000613d000000000801034f00000000090c0019000000008a08043c0000000009a90436000000000059004b000048a80000c13d000000000006004b000048b90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500010000000b001f000300000001035500000001002001900000493b0000613d0000000303000029000000020100002900000001070000290000001f02400039000000600220018f0000000008c20019000000000028004b00000000020000390000000102004039000013ab0080009c000049330000213d0000000100200190000049330000c13d000000400080043f0000002000b0008c000049390000413d00000000041700a900000000027400d9000000000012004b000048f80000c13d00000000021400d9000000000072004b000048fe0000c13d00000000060c0433000000000004004b000048df0000613d00002710024000c900000000054200d9000027100050008c000048f80000c13d000027100520011a000000000045004b000048e30000613d000048fe0000013d0000000002000019000027100520011a000000000045004b000048fe0000c13d000000000413004b000048f80000413d000027100060008c000048f80000213d0000490e0000613d000027100560008900000000074500a9000000000013004b000048ef0000613d00000000064700d9000000000056004b000048f80000c13d00000000055700d9000000000045004b000048fe0000c13d000000000007004b0000490e0000613d00000000017200d9000000010110003a000048f80000613d000000000001042d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe00010430000000440280003900001405030000410000000000320435000000240280003900000014030000390000000000320435000013bf020000410000000000280435000000040280003900000020030000390000000000320435000013700080009c00001370080080410000004001800210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002c0435000000200200003900000000002604350000006401c000390000140d0200004100000000002104350000004401c000390000140e0200004100000000002104350000002401c000390000002c020000390000492d0000013d000013bf0200004100000000002c0435000000200200003900000000002604350000006401c00039000014060200004100000000002104350000004401c00039000014070200004100000000002104350000002401c00039000000280200003900000000002104350000137000c0009c000013700c0080410000004001c00210000013c2011001c700004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000000000100001900004dbe000104300000001f05b0018f0000137206b00198000000400200043d0000000004620019000049460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000049420000c13d000000000005004b000049530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001b00210000013700020009c00001370020080410000004002200210000000000121019f00004dbe000104300010000000000002000400000001001d000d00000003001d0000000031030434000300000003001d000000010010008c00004b1d0000a13d000013df0010009c00004ad60000813d00000005031002100000003f04300039000013b404400197000000400500043d0000000004450019000f00000005001d000000000054004b00000000050000390000000105004039000013ab0040009c00004ad60000213d000000010050019000004ad60000c13d000000400040043f0000000f040000290000000001140436000e00000001001d0000001f0130018f000000000003004b0000497e0000613d0000000e05000029000000000335001900000000040000310000000204400367000000004604043c0000000005650436000000000035004b0000497a0000c13d000000000001004b0000000f010000290000000001010433000000000001004b00004ad00000613d0000000e0100002900000000002104350000000d010000290000000001010433000000000001004b00004ac60000613d0000000402000029000c13730020019b0000000005000019000000010210008a000000000025004b00004acc0000813d000000000051004b00004ad00000a13d0000000103500039000000000031004b00004ad00000a13d0000000501500210000800000001001d000000030610002900000000010604330000137308100197000000400100043d0000000504300210000000030740002900000000020704330000137302200197000000000028004b00004adc0000613d000b00000005001d000500000004001d001000000003001d000000000402001900000000020400190000000002084019000000000002004b00004aef0000613d000600000007001d000700000006001d000000600320021000000020021000390000000000320435000000000048004b000a00000008001d000900000004001d0000000003040019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004ad60000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400a00043d000013fb0100004100000000051a043600000000010004140000137302200197000000040020008c00004a020000c13d0000000103000031000000600030008c0000006004000039000000000403401900004a300000013d000100000005001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004a1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004a1a0000c13d0000001f0740019000004a2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004aff0000613d00000001050000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004ad60000213d000000010020019000004ad60000c13d000000400010043f000000600030008c00004ace0000413d00000000020a0433000013fc0020009c00004ace0000213d0000000005050433000013fc0050009c00004ace0000213d0000004003a000390000000003030433000013700030009c00004ace0000213d00000009040000290000000a0040006b00000000060500190000000006022019000000000502a0190000000f0200002900000000020204330000000b04000029000000000042004b000000100300002900004ad00000a13d0000000d020000290000000002020433000000000042004b00004ad00000a13d000000000032004b00004ad00000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004adc0000613d000a00000006001d00000000030400190000000003024019000000000003004b00004aef0000613d000b00000005001d00000008060000290000000e056000290000000005050433000900000005001d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004ad60000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f000000010020019000004ace0000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004ad60000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f00000001002001900000000b0200002900004ace0000613d000000000101043b000013730410019700000009010000290000000a0300002900000004050000294dbc47890000040f0000000f0200002900000000020204330000001003000029000000000032004b00004ad00000a13d00000005040000290000000e0240002900000000001204350000000d010000290000000001010433000000000001004b00000000050300190000498c0000c13d000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000000f01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe000104300000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004b0a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004b060000c13d000000000005004b00004b170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004af10000013d000f000000000002000900000003001d0000000043030434000300000004001d000000010030008c00004d8f0000a13d000013df0030009c00004d050000813d00000005043002100000003f05400039000013b405500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000013ab0050009c00004d050000213d000000010060019000004d050000c13d000000400050043f0000000a050000290000000003350436000800000003001d0000001f0340018f000000000004004b00004b450000613d0000000806000029000000000446001900000000050000310000000205500367000000005705043c0000000006760436000000000046004b00004b410000c13d000000000003004b0000000a030000290000000003030433000000000003004b00004d110000613d00000005033002100000000a03300029000000000023043500000009020000290000000002020433000000000002004b00004d110000613d000000010320008c00004d010000613d000c13730010019b000f0002002000920000000f0030006b00004d110000213d000000090100002900000000010104330000000f0010006c00004d0b0000a13d000000000031004b00004d0b0000a13d0000000f010000290000000504100210000000030640002900000000010604330000137308100197000000400100043d0000000505300210000000030750002900000000020704330000137302200197000000000028004b00004d1d0000613d000500000005001d000e00000003001d000000000502001900000000020500190000000002084019000000000002004b00004d300000613d000600000007001d000700000006001d000400000004001d000000600320021000000020021000390000000000320435000000000058004b000b00000005001d0000000003050019000000000308201900000060033002100000003404100039000000000034043500000028030000390000000000310435000013f30010009c00004d050000213d0000006003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000d00000008001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000d05000029000000010020019000004d030000613d000000000201043b000000400a00043d000013fb0100004100000000061a043600000000010004140000137302200197000000040020008c00004bcc0000c13d0000000103000031000000600030008c0000006004000039000000000403401900004bfb0000013d000100000006001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f00001378011001c700020000000a001d4dbc4db70000040f000000020a000029000000000301001900000060033002700000137003300197000000600030008c00000060040000390000000004034019000000600640019000000000056a001900004be80000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004be40000c13d0000001f0740019000004bf50000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d650000613d0000000d0500002900000001060000290000001f01400039000000e00210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000600030008c00004d030000413d00000000020a0433000013fc0020009c00004d030000213d0000000006060433000013fc0060009c00004d030000213d0000004003a000390000000003030433000013700030009c00004d030000213d0000000b0050006c00000000030600190000000003022019000d00000003001d000000000602a019000000090200002900000000020204330000000f0020006c0000000e0300002900004d0b0000a13d000000000032004b00004d0b0000a13d000000070200002900000000020204330000137302200197000000060300002900000000030304330000137304300197000000000042004b00004d1d0000613d00000000030400190000000003024019000000000003004b00004d300000613d000000600530021000000020031000390000000000530435000000000042004b000000000204a01900000060022002100000003404100039000000000024043500000028020000390000000000210435000013f30010009c00004d050000213d0000006002100039000000400020043f000013700030009c000013700300804100000040023002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c70000801002000039000b00000006001d4dbc4db70000040f000000010020019000004d030000613d000000000201043b000000400100043d000000a003100039000013f40400004100000000004304350000008003100039000013f50400004100000000004304350000006003100039000000000023043500000040021000390000000c0300002900000000003204350000002002100039000013f6030000410000000000320435000000a0030000390000000000310435000013e80010009c00004d050000213d000000c003100039000000400030043f000013700020009c000013700200804100000040022002100000000001010433000013700010009c00001370010080410000006001100210000000000121019f0000000002000414000013700020009c0000137002008041000000c002200210000000000112019f000013b9011001c700008010020000394dbc4db70000040f0000000b05000029000000010020019000004d030000613d000000000401043b0000000a0100002900000000010104330000000e0010006c00004d0b0000a13d00000005020000290000000803200029000000400a00043d0000000401a000390000000008030433000000000008004b00004d460000613d000000000005004b0000000c0200002900004d530000613d0000000d0000006b00004d530000613d00001373034001970000140a0400004100000000004a043500000000003104350000000001000414000000040020008c00004c910000c13d0000000103000031000000200030008c0000002004000039000000000403401900004cc00000013d000600000008001d0000137000a0009c000013700300004100000000030a40190000004003300210000013700010009c0000137001008041000000c001100210000000000131019f000013b2011001c700070000000a001d4dbc4db70000040f000000070a000029000000000301001900000060033002700000137003300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900004cad0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00004ca90000c13d0000001f0740019000004cba0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004d710000613d0000000b0500002900000006080000290000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000013ab0010009c00004d050000213d000000010020019000004d050000c13d000000400010043f000000200030008c00004d030000413d00000000045800a900000000025400d9000000000082004b0000000e0700002900004d110000c13d00000000028400d9000000000052004b00004d170000c13d00000000030a0433000000000004004b00004ce00000613d00002710024000c900000000054200d9000027100050008c00004d110000c13d000027100520011a000000000045004b00004ce40000613d00004d170000013d0000000002000019000027100520011a000000000045004b00004d170000c13d0000000d0480006b00004d110000413d000027100030008c00004d110000213d00004d400000613d000027100530008900000000034500a90000000d0080006b00004cf00000613d00000000064300d9000000000056004b00004d110000c13d00000000055300d9000000000045004b00004d170000c13d000000000003004b00004d400000613d0000000a0100002900000000010104330000000f0010006c00004d0b0000a13d0000000404000029000000080140002900000000023200d900000001022000390000000000210435000000010370008c000000000207001900004b540000c13d0000000a01000029000000000001042d000000000100001900004dbe00010430000013d201000041000000000010043f0000004101000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000003201000039000000040010043f000013b20100004100004dbe00010430000013d201000041000000000010043f0000001101000039000000040010043f000013b20100004100004dbe000104300000004402100039000014050300004100000000003204350000002402100039000000140300003900004d350000013d0000006402100039000013c00300004100000000003204350000004402100039000013c1030000410000000000320435000000240210003900000025030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013c2011001c700004dbe000104300000004402100039000013be03000041000000000032043500000024021000390000001e030000390000000000320435000013bf020000410000000000210435000000040210003900000020030000390000000000320435000013700010009c00001370010080410000004001100210000013b0011001c700004dbe00010430000013d201000041000000000010043f0000001201000039000000040010043f000013b20100004100004dbe00010430000013bf0200004100000000002a0435000000200200003900000000002104350000006401a000390000140d0200004100000000002104350000004401a000390000140e0200004100000000002104350000002401a000390000002c0200003900004d5f0000013d000013bf0200004100000000002a0435000000200200003900000000002104350000006401a00039000014060200004100000000002104350000004401a00039000014070200004100000000002104350000002401a00039000000280200003900000000002104350000137000a0009c000013700a0080410000004001a00210000013c2011001c700004dbe000104300000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d6c0000c13d00004d7c0000013d0000001f0530018f0000137206300198000000400200043d000000000462001900004d7c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004d780000c13d000000000005004b00004d890000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000013700020009c00001370020080410000004002200210000000000112019f00004dbe00010430000000400100043d0000004402100039000013fd0300004100004d320000013d000000000001042f00000000050100190000000000200443000000050030008c00004da20000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00004d9a0000413d000013700030009c000013700300804100000060013002100000000002000414000013700020009c0000137002008041000000c002200210000000000112019f0000140f011001c700000000020500194dbc4db70000040f000000010020019000004db10000613d000000000101043b000000000001042d000000000001042f00004db5002104210000000102000039000000000001042d0000000002000019000000000001042d00004dba002104230000000102000039000000000001042d0000000002000019000000000001042d00004dbc0000043200004dbd0001042e00004dbe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000c0000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000030b4eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000ad5c464700000000000000000000000000000000000000000000000000000000d06ca61e00000000000000000000000000000000000000000000000000000000ef94387300000000000000000000000000000000000000000000000000000000f369fff600000000000000000000000000000000000000000000000000000000f369fff700000000000000000000000000000000000000000000000000000000fb3bdb4100000000000000000000000000000000000000000000000000000000fccc281300000000000000000000000000000000000000000000000000000000ef94387400000000000000000000000000000000000000000000000000000000f305d71900000000000000000000000000000000000000000000000000000000e8e336ff00000000000000000000000000000000000000000000000000000000e8e3370000000000000000000000000000000000000000000000000000000000ea326d0a00000000000000000000000000000000000000000000000000000000d06ca61f00000000000000000000000000000000000000000000000000000000ded9382a00000000000000000000000000000000000000000000000000000000baa2abdd00000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000caced41b00000000000000000000000000000000000000000000000000000000baa2abde00000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000b317532f00000000000000000000000000000000000000000000000000000000b317533000000000000000000000000000000000000000000000000000000000b5306a5200000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec000000000000000000000000000000000000000000000000000000004a25d949000000000000000000000000000000000000000000000000000000007fce8fec000000000000000000000000000000000000000000000000000000008803dbed000000000000000000000000000000000000000000000000000000008803dbee000000000000000000000000000000000000000000000000000000009470dbea00000000000000000000000000000000000000000000000000000000ac72d40c000000000000000000000000000000000000000000000000000000007fce8fed000000000000000000000000000000000000000000000000000000007ff36ab50000000000000000000000000000000000000000000000000000000051257b3b0000000000000000000000000000000000000000000000000000000051257b3c000000000000000000000000000000000000000000000000000000007836d201000000000000000000000000000000000000000000000000000000004a25d94a0000000000000000000000000000000000000000000000000000000050838b34000000000000000000000000000000000000000000000000000000001f00ca73000000000000000000000000000000000000000000000000000000002a672bd5000000000000000000000000000000000000000000000000000000002a672bd60000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000001f00ca74000000000000000000000000000000000000000000000000000000002195995c00000000000000000000000000000000000000000000000000000000152dd62200000000000000000000000000000000000000000000000000000000152dd6230000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000002751cec0000000000000000000000000000000000000000000000000000000011c14f640000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000000000000000000000000000000b8a6abab51386a3071fb438ebb04cc730ccf097f4b26db380a28d6ad585ab71300000000000000000000000000000000000000400000000000000000000000009f7a0a3f000000000000000000000000000000000000000000000000000000001010b17000000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a205a45524f5f41444452455353000008c379a0000000000000000000000000000000000000000000000000000000004553534553000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a204944454e544943414c5f414444520000000000000000000000000000000000000084000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000020455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000000000000de0b6b3a7640000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc34e2e900000000000000000000000000000000000000000000000000000000640b72aee190d6ac2e748df93827ab24ab42fdb52e42e3c89f1559f749ad183c4e487b7100000000000000000000000000000000000000000000000000000000b40d0368000000000000000000000000000000000000000000000000000000001cc03654c8d84a558bb1ef5e144119415c18d227f08f8ade6f3fd4e9aaaf9b06fff6cae900000000000000000000000000000000000000000000000000000000f1dd93140000000000000000000000000000000000000000000000000000000083020aff000000000000000000000000000000000000000000000000000000008eb0a36d3e3c933d02dc9675dd46e61769bf93ee7948c15314d12aaf2f997fa89a3ee1c80000000000000000000000000000000000000000000000000000000057415354000000000000000000000000000000000000000000000000000000007a7bb3c6000000000000000000000000000000000000000000000000000000009c9340e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000001000000000000000006d81bf400000000000000000000000000000000000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004c4c45de0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e86937eb400000000000000000000000000000000000000000000000000000000e9f48e9a00000000000000000000000000000000000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff9fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f432020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff5f022c0d9f00000000000000000000000000000000000000000000000000000000616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074720902f1ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff556e697377617056324c6962726172793a20494e56414c49445f504154480000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffe0e6a4390500000000000000000000000000000000000000000000000000000000c9c653960000000000000000000000000000000000000000000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000004951554944495459000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4c4d4f554e54000000000000000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f418c232838000000000000000000000000000000000000000000000000000000004e5055545f414d4f554e54000000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4955545055545f414d4f554e540000000000000000000000000000000000000000556e697377617056324c6962726172793a20494e53554646494349454e545f4f0200000200000000000000000000000000000000000000000000000000000000d428b3d22b9d43b26182a61bca7ec11e0198c7cd6599abee921a4f1b32fb5aa2" + ] +} \ No newline at end of file diff --git a/deployments/zkSyncSepolia/NftVaultFactory.json b/deployments/zkSyncSepolia/NftVaultFactory.json new file mode 100644 index 0000000..585ac47 --- /dev/null +++ b/deployments/zkSyncSepolia/NftVaultFactory.json @@ -0,0 +1,1223 @@ +{ + "address": "0x259A75B880d1ac494fC84D8b77bcb4754eeC3435", + "abi": [ + { + "inputs": [], + "name": "VaultAlreadyDeployed", + "type": "error" + }, + { + "inputs": [], + "name": "VaultDoesNotExist", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": true, + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "vaultId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct INftVault.CollectionData[]", + "name": "collections", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "creator", + "type": "address" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllVaults", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getVaultAt", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVaultLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "hashVault", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVault", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "vaultHashMap", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "name": "vaultIdMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0x259A75B880d1ac494fC84D8b77bcb4754eeC3435", + "transactionIndex": 0, + "gasUsed": "74144090", + "logsBloom": "0x00000000000400080000010000000000000000000000400000004000000000000000000000000000001000000001000000000000800000000000000000000000000100000000240001000028000040000400000000000000000000000000080400000000020100010000000000000a00000000000000400000000010000000000000001000000000000004000100000000000100000000000000400000000080804000000800100000000000c00100000000000100000000002000010000080000000002008000000000000000000000000010000100000000000000000020000200000000010000000400000010000000000040000000000000000080000000", + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817", + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x000000000000000000000000000000000000000000000000000ebe282acd0e00", + "logIndex": 0, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e1bd1f27610f2baa553642133e750b104d6e7391d886170a43fe4992c31925b61", + "logIndex": 1, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x1bd1f27610f2baa553642133e750b104d6e7391d886170a43fe4992c31925b61" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000007272079100000000000000000000063201008041000006320010009c000000000101043b000000010020019018c318be0000040f000000c0011002100000000001000414000080100200003900000672011001c7000000000001004b000000000010043f000000200010043f00000dd20000613d00000dd20000213d00000dd20000c13d000000400100043d0000000000320435000018c500010430000000000101041a0000000000210435000005930000213d0000063202008041000006320020009c0000000001000019000000200030008c00000000010004160000000001010433000000000112019f0000004001100210000000000020043f0000066a0010009c00000dd20000413d000000000001042d0000069601000041000000040010043f0000069b010000410000000c02000029ffffffffffffffff000000000005004b0000002004000039000000c0022002100000000002000414000000400200043d00000044021000390000000401e003700000000004034019000000000021041b000006350010009c00000632033001970000006003300270000000000301001918c318b90000040f000000000004004b0000002402100039000000000021004b0000000c010000290000000008980436000000007907043c000000000202043b000000400010043f000017510000613d000000200000043f000000000701034f0000004002200210000000040010044300000000001004430000002003000039000000030300003900000020022000390000000b01000029000015400000613d0000000008020019000000000121019f000000000034004b00000637011001c700000003060000290000000502000029000000000003001f0000800d0200003900000000001404350000006402100039000018c40001042e000000000048004b000000000462001900000634063001980000001f0530018f0000066a01100197000000000002004b000005930000c13d0000000005000019000000000012004b0000000701000039000000010010008c0000010005500089000000000656022f00000000065601cf0000000006040433000000000200003900000de10000413d000000400060043f00000000020000190000000801000039000000000161019f00000000015101cf000000000151022f00000003055002100000006001100210000000090200002900000009010000390000000a0100003900000000010004120000000b020000290000000001000039000006350020009c000c00000001001d00000f820000213d0000002002100039000000000201041a000000000131019f000000400330021000000041010000390000000402100039000000040020008c0000000000120435000000000006004b0000000000650435000005fa0000013d000000440030008c0000000a030000290000070c0000013d000080050200003900000678011001c70000066e01000041000006320300004100000008010000290000000000310435000000000003004b0000067502000041000000000042043500000de00000613d0000000802000029000006350060009c000000000404043b00000000044e034f00000001010000390000002401e0037000000000005404350000000002020433000006350040009c000000000047004b00000021010000390000000102004039000000000300003100000004020000290000000007000019000000800010043f00000681011001c70000000a0200002900000000010004100000000a01000029000000000043043500000020033000390000066f0660019700000004042000390000002304200039000a00000001001d0000001f01100039000000000030043f0000002001100039000000000300001900000000000204350000001f01400039000b00000001001d000000000141034f0000000007870436000000006806043c000000000601034f00000020044001900000001f0540018f0000000002060019000006ad011001c7000000040060008c000000000071043500000024070000390000006004100039000300000001001d000006320060009c00000000001604350000000601000029000000600210018f000000000686019f0000000008050433000000030200002900000000010204330000000602000029000000000012041b0000000000ab043500000000000a004b0000002009900039000000400040043f00000dda0000a13d0000000201000039000008ea0000613d000006320030019d00008002020000390000067c011001c70000067b0100004100000004030000290000002004400039000000000035004b0000000006000019000000000606043b00000024022000390000002402e00370000000010220003900000007010000290000000100100190000000400600043d000000000031004b000015420000413d000000030100002900000002020000290000000201000029000011e70000213d000006af0010009c000006a604000041000000000100043d0000002404100039000000000001042f00000679040000410000000002320019000000600130021000000020010000390000000000340435000000800100043d00000000030304330000000c03000029000000000013004b000000200bb00039000000000707043b000000000301041a00000001011000390000067f011001c70000006002200210000000010330003900000007020000290000000004000019000000000041004b000008ea0000013d000000000052004b000000010070019000000001070040390000000007000039000000000076004b000000400700043d000000050540021000000000010004110000000005050433000006350050009c000006a801100197000000400020043f000018090000613d000017530000613d00000000010b04330000000001b2001900000000066701cf000000000767022f0000010006600089000000000868022f00000000086801cf0000000306600210000000000771034f000000000059004b0000000009a90436000000008a08043c00000000090b0019000000000801034f00000000057b001900000020074001900000001f0640018f00000000030b40190000063200b0009c00000000001b0435000000400b00043d000013230000613d0000123b0000613d0000000108000029000100000008001d00000f840000213d0000001101000039000000040160003900000024016000390000004401600039000100000001001d000000020200003900000024001004430000002400000443000000000161034f0000068a011001c700000004010000390000002001200039000006a902200167000006a90220027f0000000b03000029000000400400043d0000008004000039000000200200003900000000004504350000000601000039000000020300002900000676011001c70000066d010000410000000002030019000c00000003001d000000ff00100190000000ff0020019000000040020000390000000005250019000000000046043500000000066700190000003f06500039000000000605c019000006360040009c00000636060040410000063604400197000006360500804100000000062e034f000000050450021000000dd20000813d0000066a0020009c000000000301043b00000020055000390000001e03000039000006a403000041000000040030008c72616e736665722045524332303a20740200000200000000ffffffffffffffe0020000000000000000000000ffffffff0000186a0000613d0000000305000029000017540000413d0000000503000029000200000001001d000011c80000613d00000005088002100000000008000415000200000002001d00000ef50000213d00000697020000410000000101000029000100000002001d000300000006001d000000000102041a000000000121001900000000014300d9000000000401043b000000010110018f0000000101006039000000000200041000000696011001c7000000000058004b00000694011001c700000693010000410000069501000041000000400a00043d000500000003001d000a00000003001d000000000104043300000dd40000213d00000009010000290000001f02200039000000010440003900000000030000390000063203008041000006320030009c000000c401100039000000000563001900000000042300190000067d0100004100000022030000390000044c0000013d000000000c0c043b000000000b0000190000000000ba0435000b00000003001d00000000002304350000000102000039000000010100c039000006350070009c0000001f0010008c000c00000002001d000000000103001918c30e9a0000040f00000004011000390000068001000041000000000202041a0000000202100039000900000001001d0000006401e00370000000a40030008c18c3188b0000040f0000062d0000013d0000000406000029000000800050043f0000008006600039000006700060009c0000003f06400039000000000504043b000000840030008c000000000201043b000900000002001d0000004401e00370000005df0000013d000800000004001d000005d50000c13d0000000101002039000000000103041a0000000906000029000000000032004b0000000002010433000006360500404100000dd40000c13d000000240030008c45524332303a206145524332303a2062000000240000000000000044000000007fffffffffffffff0000002000000000000018280000013d0000066a01100198000017ac0000613d000300000005001d000400000006001d000017370000613d00000000005104350000066a05100197000600000003001d000000080010006c0000158f0000613d0000000603000029000600000004001d000015480000613d000015400000413d0000155b0000c13d0000155b0000213d000015530000613d0000066a012001970000135f0000613d000013230000413d000013250000c13d000013250000213d000000030b00002900030000000b001d0000000402b000390000002401b000390000000401b000390003000000000002000011ed0000213d000011e60000613d000011c80000013d000011800000013d000011c80000c13d0000000502800270000010ea0000013d000000000112016f0000001f0030008c000006ae0500004100060000000000020000000000cb004b00000f820000c13d000000000cb4034f00000f840000c13d00000f820000413d0000000104000367000006880010009c000000000303043b000006a8022001970000067e020000410000069a02000041000006840300004100000683030000410000002103000039000006860300004100000685030000410000001f03000039000006990300004100000682040000410000004001600210000006320600804100000020016000390000000003064019000000c402600039000000a4026000390000006401600039000000a00200003900000084016000390000000002064019000006320200004100000daf0000613d000000010010006b000000000021001a00000003030000290000000c0010006c000400000002001d00000de10000c13d0000069804000041000000000032001a000000010330008a0000000001a2001900000000040a001900000000067601cf000000000676022f0000010007700089000000000878022f00000000087801cf0000000307700210000000000661034f0000001f0740019000000000080a001900000000056a0019000000200640019000000000030a40190000063200a0009c0000000401a0003900000000001a0435000000500000613d000600000001001d00000e080000613d0000000003020019000000000023004b000000000131001900000080031000390000006003100039000006aa02200197000000000040043f000000000041041b0000000001030433000000010020008c000700000001001d0000000003010433000000a0011000390000000000ab004b000000010bb00039000000000c090433000000a002200039000000000a09043300000000090904330000006009900039000000010a00c039000000000a000039000000000a0a0433000000400a900039000000000b0b04330000066a0aa0019700000000ba0904340000002008800039000000600990008a0000000c04000029000000000223016f000000f80220018f0000000302200210000000000051041b0000000c0600002900000000043100190000000503300270000000010320008a0000000100300190000000010300403900000000043404360000069c040000410000000002210019000c00000004001d0000069e030000410000069d03000041000000090000006b00000003024002100000002403000039000006a0030000410000069f030000410000000c0000006b0000000000a9004b0000063500c0009c000000000d000039000000000008004b000000000a000019000006350090009c000000000909043b0000000100b0008c000000000b0b043b000000000a0a043b000000000a9e034f000000000074043500000009040000290000000000240435000000010200c039000000020110003900000000012100490000066c011001c7000006700040009c000006170000013d000000a005200039000000000403041a000006170000413d000000020020008c0000000100600190000000000662013f0000000106002039000000000600003900000000010460190000007f0410018f00000001012002700000000105200190000000000203041a0000000105500039000000800300043d0000000002210436000000200020043f000000800400043d000000000045004b000000a004400039000700000000001d00000002060000290000000604000029000000060600002918c310010000040f000000250300003918c30ee30000040f0000008401e00370000000000026004b00000000066200190000066f062001970000002401100039000007860000613d0000000b0000006b0000070a0000c13d18c318330000040f000800000000001d000000800200043d00000000042e034f0000006402e00370000000000064043500000007060000290000004402e00370000000000042004b0000066a0060009c0000008005000039000000000424001900000000040004150000004403000039000080050100003918c317bf0000040f0000066a02200197000000200200008a000000000002041b0000000002230019000000000113001900000005011002700000000002004019000000050220027000000008040000290000000000010435000900000003001d000000400030043f000006350030009c000006a803300197000006360020009c00000636022001970000001f024000390000000007070433000000000065004b0000000005010433000000c001100039000006910000013d0000008002000039000200000000000274e8b5266c15b4f4ecbe7936dc58d5060222227178cfff6121075256c6208e4b207a65726f20616466726f6d20746865647265737300000065726f2061646472746f20746865207a65737300000000007863656564732062616d6f756e742065616c616e63650000520b404e00000000185e917c00000000d9b67a260000000080ac58cd00000000ffffffffffffff9fffffffff000000000000000000007530ffffffffffffffa00000000000000001ffffffffffffff004e2312e00000000001ffc9a7000000006e74206b657900006f6e6578697374656c654d61703a206e456e756d657261625e2516446f71f85b69c3395a3b0502d0f959f8c92f12db28c2575a0e9e593c00150b7a020000000077616e6365000000656e7420616c6c6f6e7375666669636945524332303a20697a65726f20616464726f6d20746865207070726f766520667265737300000000726f2061646472656f20746865207a657070726f7665207473730000000000005b200ac8c7c3b925dd0314c0f7b2291ed14f71427d1e84f38c5be1e5ebec7d5b4e487b7100000000edcb51b10000000061646472657373006865207a65726f20696e7420746f207445524332303a206d84754544f4c709d7997762752e3a09523ad067ef1ee35ce4dcbc1c05240f31ff49986e73000000006352211e0000000000fdd58e000000008004ef9a0000000090f22bf1000000007c4ef3dc00000000403b2b6700000000baece7f7773c34176bbff8cb8233491f9b8a6d039632aa572ebca503d1d89988841a60c0c883f2c13fb0c1037d551236ad726df49aeea3e909addddcec1d7ba633195adc0000000099b777de000000005daa87a000000000af1ad76e000000006f2061646472657320746865207a657275726e2066726f6d730000000000000064732062616c616e6e7420657863656575726e20616d6f75636500000000000057c710a59a2cb567182111d630394f0c7bc2a656f546ab9ef341246adaac6f49000000640000000042842e0e000000000000000400000000545c577100000000f242432a00000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf265ffffffffffffffdf28f55a4df523b3ef952ba7f163c4a11669c2b068fc378daaddf252ad1be2c89bb64bfe7fe36bd19b8e8600b4aa8c65c639ae7d344fd709f28a35acfbc15ff81a000000840000000008c379a00000000063652062656c6f7720616c6c6f77616e656372656173656445524332303a2064207a65726f0000000000004000000000bc197c8100000000ffffffffffffff7fab882de59d99a32eff553aecb10793d015d089f94afb7896310ab089e4439a4c0000002000000080f23a6e61000000000000000006d81bf40000000001ffc9a700000000095ea7b30000000006fdde030000000006fdde0200000000139f1144000000000c7056b80000000018160ddd00000000150b7a0200000000150b7a01000000000c7056b70000000023b872dd0000000020e8c565000000003950935100000000313ce56700000000313ce566000000004c4c45de000000003a51f3830000000070a082310000000056359baa0000000056359ba9000000003a51f3820000000020e8c564000000007cc25370000000007bfe950c000000007ddc2cd1000000007ccc2ec2000000007ccc2ec1000000008b878cb20000000086937eb4000000009ac246870000000095d89b410000000095d89b400000000086937eb300000000a9059cbb00000000a457c2d700000000bc197c8100000000b58d775000000000b58d774f00000000cbf1304d00000000c2ee3a0800000000f23a6e6100000000dd62ed3e00000000dd62ed3d00000000c2ee3a0700000000a457c2d6000000007bfe950b000000c00000010000000002000000000ddd2935029d80000de0b6b3a7640000800000000000000000000000ffffffe000000001ffffffe0000018c300000432000018c100210423000018bc00210421000018b80000613d0000000002050019000006bb011001c7000018a30000413d000000000121043a00000000020200310000000502400270000000000020044300000000050100190000189e0000613d0000187f0000013d0000000105000029000018760000613d0003066a0020019c000200000003001d0000186c0000613d0000002603000039000006b603000041000006b5030000410000002303000039000006b803000041000006b703000041000006ba03000041000006b90300004100000001020000290000181f0000413d0001000400100074000018150000613d0002066a0020019c0000180b0000613d000400000003001d0004000000000002000017b90000613d000017a80000c13d000017760000013d0000179a0000013d00000005010000290000175d0000213d000017a00000613d00000007030000290000000002120019000017100000413d0000000007830019000017170000613d00000002080000290000175d0000813d000006b40020009c000017ac0000013d000016d70000c13d000017370000c13d000017980000c13d000017870000613d000017810000c13d000016dc0000613d0000000405000029000000000013041b000000020300003900000004010000290000176d0000413d0002000600100074000017630000613d0000163c0000413d000000060230006b000200000004001d0000163c0000c13d0000066a02100197000017540000c13d000015fb0000613d00000008034000b9000000080220006c0000175a0000413d0000175a0000613d00080000000000020000159c0000613d0000158b0000c13d0000158f0000013d0000157f0000c13d0000156d0000013d000015550000013d00000005060000290000000001410019000000000041001a0000154c0000613d000000000414004b000015130000213d000000030010006b000000040110006b000400000005001d000015130000613d000015420000c13d00000000015400d9000014f20000613d00000000042500a9000000000501043b000500000005001d0000066a05200197000015490000813d000015400000213d000015840000613d000014860000613d000014750000c13d000014790000613d000000020b00002900020000000b001d000014a00000013d000000020110006c000015780000613d000014470000613d000014360000c13d0000143a0000613d000000010b00002900010000000b001d0000144a0000013d0000141e0000c13d000014890000013d0000145d0000c13d0000149f0000c13d000000020000006b000015670000613d000015610000c13d0000140b0000613d000013b90000c13d000013970000c13d000400000004001d0000136c0000613d0000135b0000c13d0000135f0000013d0000134f0000c13d000013230000213d000013540000613d0000130a0000613d000012f90000c13d000012fd0000613d000013420000413d000000010110006c000013480000613d000012cd0000613d000012bc0000c13d000012c00000613d000012d00000013d000012a40000c13d0000130d0000013d000012e10000c13d000013210000c13d000000010000006b000013310000613d0000132b0000c13d000012910000613d000000ff0110018f000012290000613d000000ff011001900000000201200039000012390000613d000012160000c13d000006b302000041000011e30000613d000011dd0000013d000006b202000041000011ed0000813d000000020010008c000011e30000c13d000011d50000613d0000000000020032000011c80000413d000000000200043d000011bc0000613d000011ab0000c13d000011af0000613d000011c50000813d000011940000c13d000006b1050000410000117f0000c13d000011710000613d0000115f0000c13d000011630000613d000010fd0000813d0000113d0000613d0000112b0000c13d0000112f0000613d000011480000c13d000011460000413d000011140000c13d00000024051000390000000102100195000010b10000813d000010e80000613d000010de0000613d000010cc0000c13d000010d00000613d000010e60000413d000010b50000c13d000006b005000041000500010000003d000000050880008a0000109f0000013d000010ec0000c13d000400010000603d000400000000003d000000040880008a0000109a0000613d000010880000613d000010770000c13d0000107b0000613d000010ec0000013d000600000000003d000000060880008a000010920000013d000010610000c13d0000105c0000613d0000105c0000413d0000105b0000613d000010400000613d0000102f0000c13d000010330000613d0000105c0000013d000010480000813d000010190000c13d000011e70000813d000006ac0010009c000006a603000041000000000601001900000fff0000613d000000400130021000000ff90000c13d000000010040019000000ff90000213d000000010400403900000000040000390000000001240019000006a804100197000000200410008a000000000124004900000fa90000013d00000fca0000413d0000000004c4043600000fa90000613d000000800b40003900000000007a0435000000600a400039000000400b40003900000ff30000813d0000000200b0008c000000000aa4043600000000090104330000000006960436000000000924004900000fd10000813d000000010880003900000fac0000013d0000000008000019000000800700003900000fd10000613d000000000446001900000060062000390000004004200039000000200320003900000f980000613d000000000102001900000f1e0000013d00000f780000413d0000000000ed0435000000200dd00039000000000e0e043b000000000eb4034f000000000d0a001900000f1e0000813d00000000001c004b000000000cbd0019000000440bb000390000000000ca04350000004000e0043f0000000100f001900000063500e0009c000000010f004039000000000f0000390000000000ae004b000000000eea00190000066f0ea001970000003f0ad00039000000050dc00210000000000c0a043b000000000aa4034f000000240ab00039000000000a0cc0190000063600e0009c000006360a0040410000000000da004b000000000eda013f000006360d100197000006360aa00197000006360c008041000000000c00001900000000001a004b000000430ab00039000000000bab00190000063500b0009c000000000bb4034f0000000000cd0435000000400d9000390000000000dc004b000000010d00c03900000000000c004b0000000000dc04350000000100d0008c000000000d0d043b000000000db4034f000000000cc904360000066a00c0009c000000240ba000390000004000b0043f000000800b900039000006700090009c000000400900043d000000800090008c000006880090009c0000000009a30049000000000a590019000000000964034f00000f800000813d00000020066000390000000000980435000000600b90003900000f250000013d00000f800000613d000000000017004b0000000007760019000000240650003900000000008204350000000100900190000000010900403900000000090000390000003f02700039000000050780021000000f840000813d000006ab0080009c000000000802043b000000000224034f000000040250003900000f820000813d0000002302500039000000000502043b0000000402400370000000240310008c000000640440037000000044034003700000002402400370000000040140037000000ef50000a13d000000830010008c0000000001340019000000000262019f00000000025201cf000000000252022f00000000060104330000000305600210000000000252034f00000ed80000613d00000ec70000c13d000000000018004b0000000008040019000000000702034f00000ecb0000613d00000000015400190000001f0630018f000006a805300198000000000215034f00000ee10000213d000000000027004b0000000007310019000000400070043f00000edb0000c13d000000010080019000000edb0000213d000000010800403900000000080000390000000007740019000006a8074001970000003f04400039000006a8044001970000001f0430003900000edb0000813d000006ab0030009c000000000315034f000000010500036700000ee10000613d000000000304c019000006360060009c0000063603002041000000000053004b000000000653013f0000063603300197000006360520019700000636040040410000001f0310003900000e940000c13d00000e940000213d00000000011200190000000000030435000000000321001900000e7b0000413d000000000024004b00000000060604330000000006430019000000000514001900000e820000613d00000040011000390000000032020434000000000431043600000e660000413d0000000001510436000000000502043300000e6c0000613d0000000003020433000000a0041000390000006002200039000000010300c0390000004003200039000000400410003900000e6d0000813d000000020030008c00000000030504330000066a044001970000000054020434000000000331043600000e440000c13d00000691020000410000068b0200004100000e320000c13d00000e250000c13d00000e180000c13d0000068c02000041000007270000013d0000068f0200004100000690020000410000003201000039000005010000013d00000c1f0000413d000700070020002d000000070020002a0000000b06000029000000050500002900000e2a0000613d00000d8a0000413d000000000573001900000d910000613d00000003070000290000067a0020009c00000e1d0000013d00000daf0000c13d00000e0b0000c13d00000d570000613d0000000805000029000000000131004900000e010000413d0003000a0010007400000df70000613d00000cc60000413d000300000002001d0000000a0230006b000300000004001d00000cc50000c13d00000c870000613d0000000c034000b90000000c0220006c00000ded0000413d00000006011000290000066a0320019700000ded0000613d000000000331001900000005022002100008066a0010019b0005066a0010019b0000024a0000013d00000a360000413d000800080020002d000000080020002a000000000031001a00000df00000613d000000000313004b00000be20000213d0000000a0010006b0000000b0110006b000b00000004001d00000be20000613d00000bc30000613d00000000032400a9000000090500002900000ded0000813d00000e3d0000613d00000b590000613d00000b480000c13d00000b4c0000613d000000060a00002900060000000a001d00000b740000013d000000060110006c00000e110000613d00000b1a0000613d00000b090000c13d00000b0d0000613d000000020a00002900020000000a001d00000b1d0000013d00000af20000c13d0000002401a0003900000b5c0000013d00000b310000c13d00000b730000c13d000000060000006b00000ae00000613d00000a8e0000c13d00000a6c0000c13d000000000132001900000007012000290000066a0410019700000005013002100003066a0010019b0009066a0010019b000008ff0000013d000009bb0000413d0000000901100029000000000031041b00000001022001bf00000dea0000c13d00000de70000413d000000050330021000000e3a0000613d000008ff0000c13d0000068e0400004100000001030000390000000002130049000009950000413d000000000363043600000000060204330000099b0000613d000000c0031000390000000004020433000000a00310003900000040031000390000066a03300197000000010220c1bf0000000a0000006b0000000a040000290000068d0110009a000000000043041b0000000603000039000000010410003900000e0e0000c13d0000002001300039000600000002001d00000e370000c13d000009110000613d000000600430003900000040013000390000000501200210000008760000813d000009040000013d000008f70000613d000008e60000c13d000008b60000013d000008d70000413d0000000002c20436000008b60000613d000000800b20003900000000006a0435000000600a200039000000400b200039000000000aa20436000000000908043300000000059504360000000009420049000008500000813d000000000037004b0000000107700039000008b90000013d000000000806001900000080060000390000063a0100004100000120001004430000010000100443000001a000200443000001800010044300000160001004430000014000000443000000a00020043f00000639020000410000063801000041000000040200003900000001022002100000000a033000290000089e0000813d0000000c0020006c0000088c0000c13d0000000a060000290000063d0000013d0000068901000041000008a10000013d0000000101400210000000000221016f0000087d0000613d000008fd0000c13d000000050200003900000000020404330000000002430019000006a803200197000000200320008a0000000002420049000008b20000c13d00000000025200190000000502300210000000600540003900000040024000390000002001400039000008840000c13d0000063c0000613d000008930000013d000008860000c13d0000000c02200180000008780000a13d000008250000413d000008290000813d0000001f02300039000008290000413d000000200010008c000000000121013f00000001020020390000001f0020008c000b00000002001d0000007f0220618f0000000102100270000000030200003900000001011001bf00000001011002100000000c03300029000007f40000813d000000080020006c000007e20000c13d0000061e0000013d18c30e490000040f00000060012000390000000c01200029000006a8021001970000000c0140006a000007c20000413d0000000b0500002900000dd20000013d0000016e0000c13d0000000c05000029000008de0000613d000007630000413d0000076a0000613d0000000806000029000000c402400039000000a4024000390000000402400039000000240140003900000044014000390000006402400039000000a003000039000000840240003900000001011003670000008401000039000800000001001d0000067a0010009c0000078d0000c13d000007f70000013d0000000102400210000000000121016f000007170000613d000000080000006b00000687020000410000071f0000c13d0000069e0000013d000006f60000413d0000000000cb0435000000000c9e034f000000000b0800190000069e0000813d00000000003a004b000000000a9b001900000044099000390000000000a804350000004000c0043f0000000100d00190000000010d00403900000000008c004b000000000cc80019000000400800043d0000066f0c8001970000003f08b00039000000050ba002100000063500a0009c000000000a08043b00000000088e034f000000240890003900000000000b004b000000000b0ac019000006360080009c000006360b0040410000063608800197000006360a008041000000000038004b0000004308900039000000000989001900000000099e034f000000400b7000390000000000ba004b000000010b00c039000000000b000039000000000b9e034f000000000aa704360000066a00a0009c0000002409800039000000400090043f0000008009700039000006700070009c000000800070008c000006880070009c0000000007810049000000000827001900000000075e034f0000083d0000813d00000000008904350000006009700039000006a50000013d0000001d03000039000006a103000041000006fe0000813d0008000a00100074000007c80000013d000007be0000c13d0000000002320436000a00000004001d00000020024000390000004003400039000000800240003900000040014002100000063204008041000006320040009c00000692010000410000069c0000c13d000000000007004b000000000036004b00000000065600190000002405200039000000800070043f000000800440003918c30e730000040f18c30e880000040f0000008001000039000006100000413d00000677030000410000000002006039000000a00010043f000006aa012001970000060a0000c13d000000400120021018c30f8a0000040f0000002201000039000006010000613d0000000403000039000006a20100004118c311f30000040f0000001201000039000006330000a13d0000066f044001970000003f046000390000000506700210000000000704043b0000000402e003700000000002000416000000240130008c000005750000413d000006a303000041000006040000613d18c318a00000040f0000066e0200004100000005044002100000000e0440008a000d00000000003d000e00000001001d00000000021200490000053d0000413d00000000026204360000066a06600197000005440000613d0000004002100039000005230000413d000000000043004b000000a00550003900000005053002100000066a04500197000000000050043f000000000505041a0000068d0530009a0000000802000039000005330000613d000005190000c13d0000000005650436000000003603043c000000a00500003900000000033e034f0000051d0000613d0000001f0240018f0000008002200039000006700020009c0000066f022001970000003f02400039000000050410021000000c1a0000c13d000004f60000413d000004fd0000613d000200000007001d000004c30000413d000004ca0000613d000600000007001d0000048e0000413d000004970000613d000000010030008c000000000302043b00000674030000410000067303000041000006280000813d0000000b0310006c18c313720000040f18c315a20000040f000000800020043f00000001022061bf000006a70010009c0000000102006039000006a60010009c000006a5001001980000066b01000041000006400010009c000005e30000613d0000063f0010009c000006570010009c000005db0000613d000006560010009c18c30f9a0000040f18c30ef70000040f0000064b0010009c000005c60000613d0000064a0010009c000006620010009c000005b00000613d000006610010009c0000067101000041000003a80000413d000000000051004b00000000041e034f000003af0000613d00000000051500190000003f02500039000000000402043b00000000022e034f000000000504c01900000636040080410000002302100039000003780000413d0000000000520435000000000505043b00000000051e034f0000037f0000613d000000000414001900000004041000390000002304100039000006450010009c000005a00000613d000006440010009c000006280000013d0000000003120019000000000012001a000000010220036700000024020000390000065c0010009c000005990000613d0000065b0010009c000003170000c13d000007860000c13d0000000402300039000000000013043500000024013000390000004401300039000000400300043d0000072b0000c13d000002db0000613d000002b90000c13d000006500010009c0000057d0000613d0000064f0010009c000006670010009c0000055d0000613d000006660010009c000003dd0000013d00000024022003700000000c0200035f000c0000000e0353000006420010009c0000054d0000613d000006410010009c000003df0000213d0000063e0010009c00000a310000c13d0000023f0000413d000002460000613d000400000007001d0000020c0000413d0000000704000029000002130000613d000700000007001d000001d70000413d000001e00000613d000006590010009c000005040000613d000006580010009c000003cc0000213d000006550010009c000005570000013d000000100440008a000f00200000003d001000000001001d0000064d0010009c0000046a0000613d0000064c0010009c000003c10000213d000006490010009c18c3123d0000040f000006640010009c000004570000613d000006630010009c000003b80000213d000006600010009c0000027c0000013d000006470010009c000004180000613d000006460010009c0000034d0000213d000006430010009c0000024d0000213d0000063d0010009c0000062b0000013d000006890000c13d000006a90010009c0000000002000411000000640030008c0000065e0010009c000004110000613d0000065d0010009c0000031c0000213d0000065a0010009c000001ad0000213d000006540010009c0000000501000039000006520010009c0000040a0000613d000006510010009c0000027e0000213d0000064e0010009c0000019c0000213d000006480010009c000001730000213d0000063c0010009c000007e90000013d000007dc0000c13d0000000802200180000007120000a13d0000001f0040008c0000010f0000413d000001130000813d000000200040008c000001130000413d000000200050008c000700000005001d0000001f0050008c0000007f0550618f0000000105100270000000010210019000000000040104330000000a01200029000000db0000413d00000000053100190000000004160019000000e20000613d000000000014004b0000000004320019000000e0034000390000000003260436000a00000006001d000000010050019000000001050040390000000005000039000000000063004b00000000033600190000003f033000390000001f03200039000000c002400039000000000503c0190000063603008041000000e00400043d0000000c02200029000000a50000413d000000000025004b000000000076043500000000074500190000000006580019000000ac0000613d0000000b08000029000000000015004b0000000005420019000000e004400039000b00000005001d0000000005260436000c00000006001d000000400050043f000000c001300039000000010100403900000000051600190000003f011000390000001f01200039000000c001400039000000000502c019000006360010009c00000636011001970000063602008041000000c00400043d000000400030008c000000000252019f00000000024201cf000000000242022f0000010004400089000000000545022f00000000054501cf000000030440021000000000025e034f000000760000613d000000650000c13d0000000002720436000000006706043c00000000060e034f000000690000613d000000c00150003900000634053001980000001f0430018f00000633011001970000001f01300039000000c002000039000006430000c13d000006430000613d000000e00010043f0000006001000039000000c00000043f000000a00000043f000000800000043f0000010001000039000006690010009c000003f90000613d000006680010009c0000026b0000213d000006650010009c000001890000213d0000065f0010009c000001340000213d000006530010009c000001250000213d0000063b0010009c000000e00110027000000000010e043b000000570000c13d0000063203100197000000600110027000000000010e001900010000000e0355000000000e01034f001000000000000202a70790078f078e078d078c078b0004078a02a60105014f00200789078807870786078507840783078207810780077f077e077d000f01aa0020001a000a000f002d00030073001f000e077c003c077b077a0779077807770038000b0066000c00070002000100060009000800050004000d00030013005d0776000a01a900ad005c000c00070002000100060009000800050004000d00030013000a004607750010002c014e00110036014d02a507740105001a000a000f0773077202a4003c07710770076f076e076d076c076b005b076a003507690768076702a307660765003b0764076307620761001407600020075f0095000e00ac00db0065075e075d000a005a01a8075c075b0027000f075a01a700720015075901040758010400da075702a2007107560103001500d90059075507540753075207510750074f074e000e0058074d074c005a074b074a02a10749014c074807470746004500ab07450095000e02a001a600aa0744029f0058005a01a8029e07430027000f07420094007200150741029d0740029d00da073f073e073d073c029c0015073b0059029b073a0739029a073807370736000e005801a507350018073407330102009300a900370732073100a902990038073000950015004401a4072f072e072d072c007101a3005b01a2072b072a01a1072900a80007000200010006004b000800050004000d029802a0029707280296014b00d800a7029502940293005b00440727029200d7005b07260725072400a80007000200010006004b000800050004000d0291072300030722004307210720071f071e071d071c071b071a07190718000f001a000a000f071701a00716071507140713071207110710000f070f0020001a000a000f002d00030073001f000e0092000300ad001f000e019f000300a60038000b0091000c00070002000100060009000800050004000d0003070e0290019e001e000c00070002000100060009000800050004000d00030013070d070c003800700081028f070b070a070907080707070607050704000f00800020001a000a000f002d019d014a000e0092014b0101028f070307020701070006ff06fe000f00800020001a000a000f002d0003001f000e00d6003b06fd007f06fc06fb06fa06f906f8000f001a000a000f006f06f706f6028e028d028c06f506f406f306f206f106f006ef000f019c0020001a000a000f002d0003001f000e00d6003b0072000e00a5004a014900a40090019b010300150148019a00a30199001501980064019700d5028b004a000e002706ee028a014700d40289000e014c007e0045028806ed0287003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff014006ec00fe00fd00fc008e001500fb005900640286013f00d5013e00d2000e003506eb06ea014700d400d10285004500fa06e90284003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff014006e800fe00fd00fc008e001500fb005900640196013f00d5013e00d2000e003506e700d00283008f00a200a1004500fa06e602820058028106e50010008d019506e406e306e206e106e0000f00800020001a000a000f002d0003001f000e000b006e000c013d001806df019406de06dd003b001e000c0018013d06dc06db06da06d9000f00800020001a000a000f002d019d014a000e0092014b010102800091007f06d806d706d6000f01930020001a000a000f002d00030073001f000e0092000300ad005d000e019f000300a6001f000e01920003019100a0000b0066000c00070002000100060009000800050004000d00030013000a06d5005c000c00070002000100060009000800050004000d00030013000a06d400a0000b006d000c00070002000100060009000800050004000d00030190018f013c027f006c001e000c00070002000100060009000800050004000d00030013013b027f027e06d300cf004200a00041000700020001000600ce00cd00050004008c0003000a000d06d206d1006c001406d000250014018e06cf009f0057013a06ce007c0007009e007b027d00250017001600400002000100060049009d009e00340033003200cc000406cd003100560055002b005400cb003f0048003a0039005306cc00f906cb06ca06c9000f00800020001a000a000f002d00030073001f000e0101000b0091000c00070002000100060009000800050004000d00030025001e000c00070002000100060009000800050004000d0003001306c806c7003b06c6006306c506c406c306c206c1000f01930020001a000a000f002d0003001f000e00920003001f000e019f00030030000e06c0004a014906bf0090019b010300150148019a00a301990015019800640197027c06be004a000e002706bd06bc06bb004506ba00a900f806b9019200030030000e06b801a600f706b7029f0058005a01a8029e06b60027000f007a06b506b400950015010006b3027b002b027a027900fd00fc008e001500fb00590064008b027c06b200d2000e003506b106b0008f0045008b00a906af06ae027800030030000e018d0139018c06ad007f06ac06ab06aa000f001a000a000f00ca01a006a906a806a7000f001a000a000f018b06a606a5007f06a406a306a2000f01aa0020001a000a000f002d0003001f000e000b003e013d0018019401a006a106a0069f000f01930020001a000a000f002d0003001f000e00920003001f000e027800030030000e018d0139018c069e007f01aa0020001a000a000f002d0003069d000f069c0062069b069a0699069801380052001a000a000f018b02770697007f001a000a000f018b02770696007f00800020001a000a000f002d00030073001f000e0092000300ad0101000b0091000c00070002000100060009000800050004000d00030025001e000c00070002000100060009000800050004000d00030013069506940010005106930011002c06920011003602760011008a0014007a0043001100020001001d0137001200800020001a000a000f002d0003001f000e00d6069101390690000e018a0275001000250195019c0020001a000a000f002d0003001f000e00d6003b0072000e00a5004a014900a40090019b010300150148019a00a30199001501980064019700d5028b004a000e0027068f028a014700d40289000e014c007e00450288068e0287003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff0140068d00fe00fd00fc008e001500fb005900640274013f00d5013e00d2000e0035068c0273014700d400d10285004500fa068b0284003b0072000e00a5004a005a01460145003500d3014401430142007d000f00a40090008f009500150100014100a300ff0140068a00fe00fd00fc008e001500fb005900640272013f00d5013e00d2000e0035068901360283008f00a200a1004500fa06880282005802710687001000f60195001a000a000f01350013003000150686068506840683001506820105009c068100350680067f0270067e067d067c026f067b0058026e0035067a067900aa00db00c9067806770676026d004a00c9067506740673013400f5026e0672067100100133026c026b001106700089066f0132005a00d10061066e066d026a00d2066c066b0017001600f400020001001d001c0052001a000a000f006f066a0669028e028d028c0668066706660665009c01380052001a000a000f0044026902680267026602650189026402630262026101a2009c0027066400a802600065025f06630065025e025d013400f50045005b0662025c0661002006600058000f065f003b0072000e00a5004a014900a40090065e01880015065d065c065b025b065a0024000b0079002300220012001a000a000f0659009c0138005200800020001a000a000f002d0003001f000e00d6003b0658000a00710187007f019c0020001a000a000f002d0003001f000e00920003001f000e019200030030000e018d0139018c0657007f001a000a000f0656026902680267026602650189026402630262026106550024000b0654002300220012001a000a000f01350013009c0138005200800020001a000a000f002d0003001f000e00d6003b018a014a000e000b0091000c013d00180194002506530013002b007c001700160652025a0052009c002706510650064f00350133064e025c00a802600065025f064d0065025e025d013400f50045005b064c0045064b064a0010007302a606490025025900020001006b0017001600400049005201010025028000100186001400020001001d025a0052064800c80647064606450644000e06430642064100500640063f063e00f3001200ad0038000b006d000c00070002000100060009000800050004000d00030258001300a60038000b006d000c00070002000100060009000800050004000d0131025b0015009e013c0003063d010500620257063c0185063b013000110025063a025600f200f1002b018a01840639019e000b0007000200010006004b000800050004000d027e063802550637063606350010002c06340011003606330011008a0014007a0043001100020001001d009d00120132063200d1063106300254014c02a2062f062e00f00188000e062d062c062b000e062a002000ff06290015062806270626025302520625000e062400c7062302510250000e018300c70253025200c6062206210620000f061f00c500c7061e024f024e000e061d061c061b024d061a0619024c01820618061706160615000f061406130612061100150610060f060e060d060c060b024b060a024a00150609005906080607060606050604000e0249060306020601018100ef060000c7024905ff05fe024805fd0010005102470011002c02460011003602450180001005fc001400020001001d00f3001205fb001805fa0046001b02980244012f012e05f905f8004905f7024305f60010005102420011002c024100110036017f0180001000ad05f500150070012d05f4003c00ab00cf004200a00041000700020001000600ce00cd00050004008c0003000a000d0131017e005005f305f2000305f105f0001105ef007c05ee006c001405ed00250014009f005705ec007c0046001b05eb007c024005ea000a05e905e800aa017d017c0102009300a200ee05e7023f00ab002a0081014f027d00a70104017b00020001006b00ed017a017900780077001700160029001c009e00340033003200cc000405e60038003000150038003c001800520038000b0091000c00070002000100060009000800050004000d0003006c001e000c00070002000100060009000800050004000d0003008d002f0010001400020001001d002a001700160029001c004b004f0044023e05e501a50034000405e405e300030065025505e200f1023d00f200d700fa05e105e000a705df05de00370178023c0030009e0015023b0059003c05dd00ed00880010007305dc05db023a02390238004301770237017c0102023600a200f200f805da05d905d8008d02350234012f012e05d700ec0233002f008705d605d505d400c400a0001b007300300015012c001300d905d305d205d105d0006205cf05ce00d901a2004605cd05cc012c000b0007000200010006004b000800050004000d00ed05cb029700190296014b004600a7029502940293005b05ca029200d7005b05c90038018905c8012c000b0007000200010006004b000800050004000d029105c7000305c6004305c5013100eb000a05c401350013000a05c305c20133001405c1026b001105c005bf05be008905bd05bc05bb00ea017605ba05b901a60178023c00720015023b0059010500020001001d05b80017001600f4001c002a001700160029001c012b000800050004000d000305b700c400eb000a05b6001800520248001805b50175001b02320244012f012e05b405b305b205b105b0023a023902380043017705af017c0102023600a200f200f805ae05ad05ac002502350234012f012e05ab00ec0233002f0091002505aa001c05a900c405a8009c05a705a605a505a400e905a305a205a100ca05a0059f0052059e009b059d059c059b059a059905980231059702300596022f022e0595022d025001740183022c022b00c6022a0229059400c502280227059305920591022600c5022500c60590018200c70224058f02230222058e058d003100560055002b005400cb003f0048003a00390053058c0027058b012a006a00610060005f0003005e006900680067005000e8001700160040001c00120065058a00c300d700eb005b058905880221022005870073001b000a058605850173001b000a058401a105830582021f01a7021e0174021d0057019e018402750046001b005700a6000b0066000c00070002000100060009000800050004000d0003006c002f00a0000b005c000c00070002000100060009000800050004000d00030013000a0581013500130030000800150580057f057e057d057c021c01a40191021b005c000c0007000200010006000900050004000d0003006c002f0038001b00a60046001b0057000b006d000c00070002000100060009000800050004000d000302580076021a057b057a002f00100133026c013000ec0579001100f60094021e0174057801850025009400580062025702190185008d00940218013200a10577057600a1057500350574005a004505730572026a026f057105700017001600f400020001001d001c002a0017001600290049012b004f056f056e003400040008000d0038001b000a056d0087001b02200089056c00aa00f70172056b021700a9001b007300f8056a0046001b0057000b006d000c0007000200010006000900050004000d00030025001e000c00070002000100060009000800050004000d00030013013b05690046001b0057000b006d000c00070002000100060009000800050004000d00030025001e000c00070002000100060009000800050004000d00030076021a0568002f0046001b0057000b006d000c00070002000100060009000800050004000d000300f200f1029c00080015029a00f50567000b0007000200010006004b00050004000d000305660232021c008100f50087001b01a702160008056505640563009f05620065028100d8001b00370215009a00c900c200db00c901710561021500750221001b0560055f001b00ad055e001b00a60240021b0066000c00070002000100060009000800050004000d00030013000a055d005c000c00070002000100060009000800050004000d00030013000a02140038000b006d000c00070002000100060009000800050004000d00030190018f013c055c0070001e000c00070002000100060009000800050004000d00030013013b02140038000b006e000c00070002000100060009000800050004000d00030070001e000c00070002000100060009000800050004000d0003001302130038000b0066000c00070002000100060009000800050004000d00030013005d055b000a01a9005c000c00070002000100060009000800050004000d00030013000a0212055a00180081002505590170016f02110210013000880007007b0558009900190028002e05570170055600700014016e0211021000c1001400070025007b0555009900190028002e0554020f0086020e00780002000100060077016d05530005055200330032003100190028002e020d020c0551003f020b003a0039016c0550020a054f0209020800c00207020600d402050204020300bf007e004e0004054e00ac00be020202010037006200980030001500040059003c001900200173054d008100630025054c020f0086020e00780002000100060077016b054b0005054a00330032003100190028002e020d020c0549003f020b003a0039016c0548020a05470209020800c00207020600d402050204020300bf007e004e0004054600ac00be020202010037006200980030001500040059003c001900200173001f000e016a003700710169008100250168020000ee0545001e006e000c00070002000100060009000800050004000d00030070001e000c00070002000100060009000800050004000d00030076008101ff006300e7002f0010007500110070001400020001001d002a001700160029001c0009004f004401fe0544023700340004000d00850042006f0041012900070002000100060084008300050004008c0167009e0543003505420166003701fd00ca0013000a054100a60540013a00850042006f004100e9012800070002000100060084008300050004008c0003053f00ed0063053e00a0053d053c00630243053b00ca0013053a0063013a0217012700c40175000b003e00070002000100060009000800050004000d0003007600ed00e7002f0010008800020001001d002a001700160029001c004b004f004400e6005a01a500340004000d0025053900630538004d00d700eb005b053705360535009f05340065027100bd001b0037013600c9021d003700c901fc0533012d053200ec013a00890531022500940530052f001b0191018400a8006e000c00070002000100060009000800050004000d0003006c001e000c00070002000100060009000800050004000d0003001301fb052e0046000b006e000c00070002000100060009000800050004000d0003006c001e000c00070002000100060009000800050004000d00030076052d0063002f00850042006f0041012900070002000100060084008300050004008c0167052c0035052b016601fb01fd00ca001300db052a052901720087000b003e00070002000100060009000800050004000d000301fa0528006305270013012600850042006f004100e9012800070002000100060084008300050004008c000300c101f900810063016501f800870526000b003e00070002000100060009000800050004000d000300f100870172000a0525000b003e00070002000100060009000800050004000d00030013052405230087000b003e00070002000100060009000800050004000d000300c1002f012701640081052200c40010008800020001001d002a001700160029001c004b004f004400e6052100d300340004000d0046000b0066000c00070002000100060009000800050004000d00030013005d0520000a01a9005c000c00070002000100060009000800050004000d00030013000a02120038005d051f00cf004200460041000700020001000600ce00cd00050004008c0003000a000d00da0125006c00140124004d0014018e00bc0123008d001400070070007b01f700bb01f601f500400002000100060049009d007001630034004c0033003200cc0004051e051d002b051c0015012d00ba003c016200ab00cf004200460041000700020001000600ce00cd00050004008c0003000a000d00da01f401f3001401f2002500140125006c00140124004d0014017e00bc0123008d00140161001b01f1007c01f0000a051b051a00aa017d05190102009300a200ee0518023f00ab002a0130014f01f700a70104017b00020001006b00bb008601ef00780077001700160029001c007001630034004c0033003200cc00040517008e00150064017500bc01ee0025001400bb01ed01ec002a001700160029001c0009004f004401eb0516051500340004000d009e051400630513009a00d700eb005b05120511001800120024000b00970023002200120024000b051000230022001200e50024000b01220023002200120010050f00820010050e00820010016000820010002c01ea0011003601e902a50010005101e80011002c01e70011003601e601800010005101e50011002c01e4050d001001e30082001001e200820010050c008200560055002b005400cb003f0048003a00390053050b00f9003100560055002b005400cb003f0048003a00390053050a00f9003100560055002b005400cb003f0048003a00390053050900f900100508008200100507008200560055002b005400cb003f0048003a00390053050600f9004305050504050300a105020501050004ff00ea04fe00ec0089017804fd00b900ea04fc00940218013200a104fb04fa00ea02a4008904f900f7004504f804f70177004a04f600210024000b0097002300220012004304f504f4025604f3005804f200f704f104f004ef007e00d104ee04ed04ec04eb017601e101650021017601e104ea003700620098003004e9000404e8003c00210024000b007900230022001204e7021600f704e604e504e404e304e200aa04e104e004df008904de04dd04dc01e004db04da04d904d804d704d6013104d5009604d404d3018804d204d104d004cf023d00a904ce04cd04cc04cb04ca04c904c804c704c604c5003a003904c404c3007d04c204c104c004bf0060005f003b005e04be04bd04bc001404bb029900210024000b00790023002200120018001201df015f04ba04b901de04b80003001f015f04b7003b014a015f04b601e004b5008f00210018001201df007404b401dd01de04b304b20103007404b1005b04b004af04ae04ad04ac04ab04aa04a9027b002b027a027904a804a7008e012104a601dc006404a504a404a304a20074024c04a1004804a00230049f00c5049e049d00fe049c049b024f024e0074049a049904980074049701dd04960495012104940493049201db018104910074049000ef048f048e048d0074048c00ef01db0181048b024b048a048901da0488048700ef048602510485007404840483048204810480047f047e047d047c024d047b047a047900c601da047804770476024a01210475047404730170047204710470046f046e0121046d01dc046c046b046a04690468007401d904670466046504640463046200ef01d904610460045f0021001800120024000b00790023002200120290001e000c00070002000100060009000800050004045e0003002100180012002b045d002800a102a3045c0093045b0148045a002704590458045704560455016c045404530231045200a90451022f022e0450022d044f044e0183022c022b00c6022a0229044d00c502280227044c044b044a022600c5027000c60449018200c702240448022302220447044604450444008b00a70443044200f8044104400030043f043e043d003c017a0179043c00940017001600f4001c002a001700160029001c012b000800050004043b000300210024000b00970023002200120024000b00790023002200120018001201d8015e043a001000750439001100e400ea00b800b7043804370219029b00b60163043600c2000b0099001904350434001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2043300b1009b00b000af009604320027043100ae006a00610060005f0003005e0069006800670050004e000400b8043000e3004c0019042f000a042e0010007500e2008b00e401d7009300b700e100e000b900c800b6042d00c2000b042c004c015d042b015c042a0429001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2042800b1009b00b000af009604270027042600ae006a00610060005f0003005e0069006800670050004e01d6007101a301d500d900b8042500e3004c015d0424015c000a0423042204210420015d041f015c041e004c0010007500e2008b00e4041d009300b700e100e000b900c800b6041c00c2000b0019041b000a0071018701d40120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2041a00b1009b00b000af009604190027011f041800ae006a00610060005f0003005e0069006800670050004e000400b8041700e3004c00190416001801d40018004c01d304150010007500e2008b0414013400b700e100e000b900c800b6041300c2000b00190412000a0018015b0010007500e2008b00e401d7009300b700e100e000b900c800b6041100c2000b000a001801d201d10120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2041000b1009b00b000af0096040f002700b8040e00ae006a00610060005f0003005e0069006800670050004e00040018004c011f015b00e30019040d001801d00120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2040c00b1009b00b000af0096040b0027011f040a00ae006a00610060005f0003005e0069006800670050004e01d6007101a301d5005d00b8040900e3004c000a001801d201d1004c0010007500e2008b00e40408009300b700e100e000b900c800b604070094001e00190018040601d00120001700160040001b00020001006b004900b500b4000500330032003100190028002e00b300b2040500b1009b00b000af009604040027040300ae006a00610060005f0003005e0069006800670050004e00040018011f015b040200190018040100580071018701d3040003ff00d903fe00df03fd03fc000a01cf001003fb03fa00d903f900df005d01ce01cf001003f8001400020001001d00f3001200df005d01ce00210024000b00790023002200120024000b009700230022001202a701620057015a000b0066000c00070002000100060009000800050004011e00030013000a03f7005c000c00070002000100060009000800050004011e00030013000a03f600df000b006d000c00070002000100060009000800050004011e019d03f5001303f403f300210161000b026d00070002000100060009000800050004011e0003001303f20021001800210018001201cd015e005700ba000b006e000c00070002000100060009000800050004011d000300de001e000c00070002000100060009000800050004011d00030013012600dd000b0066000c00070002000100060009000800050004011d00030013005d03f1000a03f0005c000c00070002000100060009000800050004011d00030013000a03ef03ee001800c103ed011c016f011b01cc013600880007007b03ec009900190028002e03eb011c01cb00de0014016e011b009f005701ca007c000700c1007b03ea009900190028002e03e9011a0086011900780002000100060077016d01c9000501c800330032003100190028002e01180117011603e80115011401130112011103e7007d03e60110010f00c0010e010d00f0010c010b010a00bf007e004e000403e500ac00be0109003700620098003001c7000401c6003c001901c5010803e403e30021011a0086011900780002000100060077016b01c9000501c800330032003100190028002e01180117011603e20115011401130112011103e1007d03e00110010f00c0010e010d00f0010c010b010a00bf007e004e000403df00ac00be0109003700620098003001c7000401c6003c001901c50108001f03de016a00370071016901680021001800120024000b00790023002200120024000b00970023002200120010002c014e00110036014d0011008a0014007a0043001100020001001d009d00120024000b012200230022001200560055002b005401c4003f0048003a0039005303dd03dc00560055002b005401c4003f0048003a0039005303db002703da012a006a00610060005f0003005e006900680067005000e8001700160040001c001201d803d9017100ba01c30213000b0066000c00070002000100060009000800050004004700030013000a03d8005c000c00070002000100060009000800050004004700030013000a01c200bd000b006d000c00070002000100060009000800050004004700030190018f013c03d7004d001e000c00070002000100060009000800050004004700030013013b01c200bd000b006e000c0007000200010006000900080005000400470003004d001e000c00070002000100060009000800050004004700030013015a00bd000b0066000c00070002000100060009000800050004004700030013005d03d6000a03d5005c000c00070002000100060009000800050004004700030013000a03d403d3001800d000c303d2011c016f011b01cc015900880007007b03d1009900190028002e03d0011c01cb004d0014016e011b009f005701ca007c000700c3007b03cf009900190028002e03ce011a0086011900780002000100060077016d03cd000503cc00330032003100190028002e01180117011603cb0115011401130112011103ca007d03c90110010f00c0010e010d00f0010c010b010a00bf007e004e000403c800ac00be0109003700620098003001c1000401c0003c001901bf010803c700d000dc00c303c6011a0086011900780002000100060077016b03c5000503c400330032003100190028002e01180117011603c30115011401130112011103c2007d03c10110010f00c0010e010d00f0010c010b010a00bf007e004e000403c000ac00be0109003700620098003001c1000401c0003c001901bf0108001f03bf016a00370071016900d000c30168020000ee03be001e006e000c0007000200010006000900080005000400470003004d001e000c0007000200010006000900080005000400470003007600d001ff00dc00e7002f001000750011004d001400020001001d002a001700160029001c00c103bd0009004f004401fe03bc027400340004004700850042006f004101290007000200010006008400830005000401be03bb009a03ba0027015903b903b8003703b701270164000a03b600ba03b501bd00850042006f004100e901280007000200010006008400830005000401be000303b401590273012700dc03b300dd03b203b100dc008903b0016403af00dc03ae00c400a8003e00070002000100060009000801bd0005000400470003007601bc00e7002f0010008800020001001d002a001700160029001c004b004f004400e6005a03ad00340004004700bd0021001800120024000b012200230022001200e50010016003ac0010002c01ea0011003601e903ab001001e3001400020001001d00f300120024000b00790023002200120024000b00970023002200120010002c014e00110036014d0011008a0014007a0043001100020001001d009d001200560055002b005401bb003f0048003a0039005303aa03a900560055002b005401bb003f0048003a0039005303a8002703a7012a006a00610060005f0003005e006900680067005000e8001700160040001c001203a6017100ba01a1003503a501c3021f000b006e000c00070002000100060009000800050004003d0003004d001e000c00070002000100060009000800050004003d0003001301ba03a400d8000b006e000c00070002000100060009000800050004003d0003004d001e000c00070002000100060009000800050004003d0003007603a30158002f00850042006f00410129000700020001000600840083000500040107016703a2003503a1016601ba03a0009f039f00ca001300db01fc039e039d01b9001e003e00070002000100060009000800050004003d00030136039c0158015e0013012600850042006f004100e90128000700020001000600840083000500040107000300de01f901bc0158016501f8009a039b001e003e00070002000100060009000800050004003d000300f1009a01b90058039a001e003e00070002000100060009000800050004003d00030013039903980397000b003e00070002000100060009000800050004003d000300de002f039601a400c3025903950010001400020001001d002a001700160029001c004b004f004400e6039400d300340004003d00d8000b0066000c00070002000100060009000800050004003d00030013005d0393000a0392005c000c00070002000100060009000800050004003d00030013000a03910087005d039000cf004200d80041000700020001000600ce00cd0005000401070003000a003d00da0125004d0014018e00bc0123009a001400dd01b8012401b7000700f6007b01b600bb01f601f500400002000100060049009d00f601b501b40034015701960033003200cc0004038f003100560055002b005401b3003f0048003a00390053038e038d002b038c038b012d015a003c016200ab00cf004200d80041000700020001000600ce00cd0005000401070003000a003d00da01f401f3001401f2008d00140125004d0014017e00bc0123009a001400dd01b8012401b70161001b01f1007c01f0000a038a038900aa017d038802a1025400a200ee0387038600ab002a0385014f01b600a70104017b00020001006b00bb008601ef00780077001700160029004900f601b501b40034015701960033003200cc00040384008e03830064038200bc01ee008d001400bb01ed01ec002a001700160029001c0009004f004401eb028600340004003d00bd00210018001200e50024000b01220023002200120010016003810024000b00790023002200120010005101e80011002c01e70011003601e603800010005101e50011002c01e400110036017f0011008a0014007a0043001100020001001d013700120024000b00970023002200120010002c014e00110036014d0011008a0014007a0043001100020001001d009d0012001001e2001400020001001d00f30012003100560055002b005401b3003f0048003a00390053037f0027037e012a006a00610060005f0003005e006900680067005000e8001700160040001c0012037d037c01b2037b037a037900ba000b003e000700020001000600090008000500040106000300130378037700dd000b003e00070002000100060009000800050004010600030376002f00df000b003e0007000200010006000900080005000401060003007600d000e7002f0010008800020001001d002a001700160029001c004b004f004400e6015702720034000401060021001800120010005103750011002c037400110036027601b10010005103730011002c037200110036037101b10010005103700011002c036f00110036036e0011008a0014007a0043001100020001001d0137001201cd01b2036d036c036b036a0126000b0091000c0007000200010006000900080005000401fa0156000300a8000c0007000200010006000900080005004c00040156000300de002f0010001400020001001d002a001700160029001c004b004f0044023e03690034000401560021001800120010005102470011002c024600110036024503680010005102420011002c024100110036017f0011008a0014007a0043001100020001001d0137001200e500020001001d0017001600f4001c002a001700160029001c012b0008000500040367000300210018001203660365012c03640363036200d100db0361017a017900e8002a001700160029001c0360035f00050004035e0003002100e5035d0186002100650021035c0186002100650021035b00520012000000000000000000000155000000000000035a0000000000000359000000000000002603580000000000000154000001b000000000000000000357000000000000035603550000035400000000000000000353000000000000035200000000000003510000000000000350000000000000034f000000000000034e000000000000034d000000000000034c000000000000034b000000000000034a0000000000000349000000000000034800000000000003470000000000000346000000000000034500000000000003440000000000000343000000000000034200000000000003410000000000000340000000000000033f000000000000033e000000000000033d000000000000033c000000000000033b000000000000033a0000000000000339000000000000033800000000000003370000000000000336000000000000033500000000000003340000000000000333000000000000033200000000000003310000000000000330000000000000032f000000000000032e000000000000032d000000000000032c000000000000032b000000000000032a00000000000003290000000000000328000000000000032700000000000003260000000000000325000001550026002603240000000000000000000001b000000000000003230000032203210320031f01af002600260153000000000000031e031d00000000000001540000031c0000031b000000000000031a0319031803170316000000000000000000000315000003140313031203110152000001ae00000310030f030e030d000000000000030c030b030a030903080152000001ad00000307000000000000030600000000000000000000030500000304000000000000000000000303000003020301030002ff02fe00000000000001ac02fd02fc02fb02fa00000000000001ac02f902f802f702f600000000000001af00260026002602f5000000000000015400000000000002f400000000000002f300000000000002f202f102f002ef02ee02ed02ec02eb02ea00000000000002e900000000000002e800000000000002e700000000000002e60000000000000000000001ae000002e50000000000000000000001ad000002e400000000000002e302e202e102e002df02de02dd02dc02db00000000000002da00000000000002d902d802d702d602d500000000000001ab02d402d302d202d100000000000001ab02d002cf02ce02cd02cc02cb02ca02c900000000000002c802c702c602c502c402c302c202c1015500260026002602c000000000000002bf0000000000000026002600260153002600260026002600260026002602be0000000002bd000000000000000002bc02bb00000000000002ba00000000000000000000000002b902b800000000000002b700000000000002b600000000000002b5000000000000000000000000015302b40000000000000151015002b302b202b10000000000000151015002b002af02ae0000000000000151015002ad02ac015200000000000002ab02aa02a902a80000000000000000000000000000", + "logIndex": 2, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b7", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e493b58c8c374003f1612aae57c437eb95320206121cd359d47fee8deaceca1e0", + "logIndex": 4, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x493b58c8c374003f1612aae57c437eb95320206121cd359d47fee8deaceca1e0" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e1203e700000000000000000000012c0000c13d0000013c0000213d000000000101043bffffffffffffffff000001a40020009c0000012c0000213d000001a401008041000001a40010009c000001a40200804100000001002001900000068c00010430000000000112019f000000000010043f000000200aa00039068a06850000040f000000000001004b0000012c0000613d0000801002000039000000200010043f0000068b0001042e000005fb0000213d0000012c0000413d0000000000bc043500000000000b004b00000040011002100000000001000019000000000001042d000000c001100210000000000100041400000060022002100000013c0000c13d0000000000210435000000000101041a000000000c0000190000002006600039000001c101000041000000040010043f000001c001000041000001bb011001c7000001ba011001c7000000c0022002100000000002000414000000000002004b000000000a0a043300000020055000390000000000cb0435000000000b0b043b000000000009004b000000000005004b000000000003004b000000400200043d00000040020000390000000201000039000000800010043f000000000100041a0000000001000416000000200bb00039000005fd0000213d000000000021041b000001b50010009c0000000008980436000000000b0b04330000000000ba004b0000000000cb004b000000000c0c043b000000000ba1034f00000000009a0435000000400010043f000000000300003900000000003204350000002002000039000000000004004b00000004011003700000000002000416000000240030008c068a066b0000040f000001be010000410000000000ab043500000000000a004b0000000202000029000001a403008041000001a40030009c068a06800000040f00000000004304350000000002000019000001d904400197000000000034043500000000007604350000000007070433000000007907043c000000000701034f000000400100043d0000056a0000213d0000000000bc004b000000010cc00039000000000d0a0433000000000b0a0433000000600aa00039000000010b00c039000000000b000039000000400ba00039000000000c0c0433000001b30bb0019700000000cb0a04340000000009a904360000000000dc0435000000000d0d043b000000400900043d000001b500b0009c00000000000c004b000000000b0000190000000100c0008c000000400800043d00000020044000390000000005000019000000410100003900000000060500190000000004000019000000400020043f0000000100300190000001b50020009c0000000103004039000000000032004b000001d903200197000000800300043d000000000035004b00000000001204350000000101000039000004ee2d6d415b00000024000000000200000000000000ffffffffffffffe07fffffffffffffff00000000ffffffff0000000102000039000005fb0000c13d000000000cb4034f000005fd0000c13d000005fb0000413d000000210100003900000000080200190000002008800039000000000a00001900000000090000390000000009090433000000000026004b000000000001042f00000000004204350000001f04400039000000000808043300000000060000190000000000450435000000010100002900000002030000290000000000140435000000000161019f00000000015101cf000000000151022f0000010005500089000000000656022f00000000065601cf0000000006040433000000000048004b000000400300043d0003000000010355000001d9033001970000001f033000390000000000050435000000000785001900000000002304350000000403000029000000000012004b00000000006504350000000006060433000000000013043500000003055002100000000001320019000000000787043600000007040000290000004003000039000000070300002900000006040000290000000000030435000000000654001900000000080300190000002001100039000001d9053001970000000002000039000000010770003900000000070000190000000002d20436000000a002200039000000800c20003900000000005b0435000000600b200039000000400c2000390000000200c0008c000000000bb20436000000000a060433000000000a420049000000010880003900000000090400190000000008000019000000800500003900000000008704350000008007000039000000200cc00039000000000da1034f000000000c09001900000000003b004b000000000bac0019000000440aa000390000000000b904350000004000d0043f0000000100e00190000001b500d0009c000000010e004039000000000e00003900000000009d004b000000000dd90019000001b60d9001970000003f09c00039000000050cb00210000000000b09043b000000000991034f0000002409a00039000000000c0bc019000001b90090009c000001b90c004041000001b909900197000001b90b008041000000000039004b0000004309a00039000000000a9a0019000001b500a0009c000000000a0a043b000000000aa1034f000000400c800039000000010c00c039000000000c000039000000000ca1034f000000000bb80436000001b300b0009c000000240a9000390000004000a0043f000000800a800039000001b70080009c000000800080008c000001b80080009c0000000008920049000001b50080009c000000000808043b000000000076004b000000600a80003900000040033002100000000002120049000001d904100197000000000037004b0000002406500039000001b50090009c000001b50050009c000001b301100197000001c20110009a000000000021004b000000000000043f00000007010000290000001f02200039000000200320008a00000000024200190000000502300210000000000008004b000000000036004b000001c30080009c0000012c0000813d000001b50040009c000000240230008c0000000301000039000001b4011001c7000001b30010009c000000010100c0390000000001000039000001b300100198068a06030000040f068a05700000040f0000000001030019000000040030008c000000400040043f000000800400003900000000030100199325c516c8771252da99e794edeb23979bd15cc8fbbfbc1853b071427d6e39e6eb71f42c3160b9823cef35a83f2c1a6a38236fd7a1588dd5cb0452bbe0e15990ffffffff0000000000000000ffffffe07ccc2ec2000000000200000200000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf265115bdc118c235bfd8c7dbab89d703809978f128b93471df49c4d535bdea7cd8ac32661a6876ae1b74283c20cac8d9c9414cd1a7801437273010006bd265cfb84ffffffffffffff7b6c740000000000004d61676963566175756c7420000000004d616769632056617f000000000000003839616263646566303132333435363700ffffffffffffff0000000005f5e100002386f26fc1000085acef80ffffffff85acef81000000006e38ed64bf6a1f01e93ff9f4daa797ed0000000000184f03ce992a36000000000000000000000001c9d06ce9f10c1a9db459436ab7bff70929fcba5677c79037d6f21326ab749d574e487b7100000000362f93160ef3e5634ba6bc95484008f6d60345a988386fc8290decd9548b62a8000000200000008000000004000000004d827f170000000000000040000000008000000000000000ffffffffffffff7f000000200000000000000000652b9b410000000054af84a100000000812617c7000000007a98742d0000000074449c600000000074449c5f000000009ac246870000000097331bf900000000f68790c700000000f396455100000000d126fc1900000000d126fc180000000097331bf8000000400000010000000002000000000000068a00000432000006880021042300000683002104210000067e0000613d000006680000613d00000000020204330000004001300210000006620000c13d0000000100400190000006620000213d00000001040040390000000004000039000000000041004b00000000012400190000001f01100039000000200410008a0000000001240049000006130000013d000006330000413d0000000004d40436000006130000613d000000a004400039000000800c40003900000000007b0435000000600b400039000000400c4000390000065c0000813d000000000bb40436000000000a010433000000000a6400490000063a0000813d000000000058004b000006160000013d00000000090600190000063a0000613d000000000464001900000005045002100000006006200039000000000054043500000040042000390000000005010433000000200400003900000020032000390000000001020019000005970000013d000005f10000413d0000000000ed0435000000200dd00039000000000e0e043b000000000eb4034f000000000d0a0019000005970000813d00000000001c004b000000000cdb0019000000440bb000390000000000ca04350000004000e0043f0000000100f00190000001b500e0009c000000010f004039000000000f0000390000000000ae004b000000000eea0019000000400a00043d000001b60ea001970000003f0ad00039000000050dc00210000001b500c0009c000000000c0a043b000000000aa4034f000000240ab00039000000000a0cc019000001b900e0009c000001b90a0040410000000000da004b000000000eda013f000001b90d100197000001b90aa00197000001b90c00804100000000001a004b000000430ab00039000000000bab0019000000000bb4034f0000000000cd0435000000400d9000390000000000dc004b000000010d00c039000000000d0000390000000100d0008c000000000db4034f000000000cc90436000001b300c0009c000000240ba000390000004000b0043f000000800b900039000001b70090009c000000800090008c000001b80090009c0000000009a30049000000000a590019000000000909043b000000000964034f000005f90000813d0000000000980435000000600b9000390000059e0000013d000005f90000613d000000000017004b00000000077600190000000000820435000000400060043f0000000100900190000001b50060009c00000001090040390000000006620019000001b6062001970000003f027000390000000507800210000005fd0000813d000000000802043b000000000224034f0000000402500039000005fb0000813d0000002302500039000000000502043b00000004024003700000000204000367000000240310008c000001b80010009c000005430000013d000005630000413d0000000000ab004b000000010bb000390000000003c30436000000000c0904330000002009900039000005430000613d000000a003300039000000000a090433000000800b30003900000000002a0435000000600a3000390000006009900039000000400b300039000000010a00c039000000000a000039000000400a9000390000000000ba04350000000100b0008c000000000aa30436000001b30aa0019700000000ba09043400000000090604330000000009530049000004d20000813d000000000047004b000005460000013d0000000008050019000000000602001900000040022002100000006001300210000000000161034f000005390000613d000005280000c13d0000052c0000613d0000000004620019000001d6063001980000001f0530018f000001a403300197000004f90000013d000005190000413d00000000009a004b000000010aa000390000000001b10436000000000b080433000004f90000613d000000a0011000390000000009080433000000800a100039000000000049043500000060091000390000006008800039000000400a100039000000010900c03900000040098000390000000000a904350000000100a0008c0000000009910436000001b30990019700000000a908043400000000080504330000000008310049000004320000813d0000000106600039000004fc0000013d0000000007030019000000000504001900000007060000290000000205000029000001d80400004100000003030000390000800d020000390000000002130049000000000400041100000060021000390000053f0000c13d000000000353001900000005034002100000000005430436000000800400043d0000004005100039000000000413004900000000033400190000000005340019000004bd0000413d000000000045004b0000000006350019000004c40000613d000000030800002900000000034504360000000004030433000000000415004900000000055400190000000000060435000004a80000413d000000000046004b00000000089600190000000007560019000004af0000613d0000000509000029000000a00510003900000080051000390000000004040433000000000321043600000080020000390000000702000029000000000030043f000000000232019f000001d702200197000000000201041a00000008010000290000000102000029000000000020043f000100000001001d000000000020041b00000001021000390000047a0000c13d0000000201000029000005200000613d000101a40030019d0000006003300270000000000121019f000000000131019f0000006001100210000000000131004900000001030000290000044b0000613d000004f40000c13d000000000131001900000005012002100000004403300039000100000003001d000000800200043d00000024013000390000000401300039000001d501000041000004f30000613d0000800202000039000001d4011001c70000000400100443000200000001001d0000000000200443000001d302000041000000400230021000000060012002100000000305600210000000000151034f0000040a0000613d000000000006004b000003f90000c13d000003fd0000613d00000000045300190000001f0620018f000001d905200198000001a402200197000101a40020019d00000060022002700000000002010019000003f20000013d00000001020000310000000301000367000004120000c13d000003ed0000613d0000800602000039000000c002500210000001a405008041000001a40050009c00000004031000390000000000310435000001d2030000410000006404100039000000840320008a0000000002230019000000000064043500000060060000390000000005000414000000440410003900000000000404350000000004230019000003bf0000413d000000000034004b00000000067400190000000005240019000003c60000613d0000000307000029000000000234043600000000030204330000000402000029000000a403100039000000000224004900000000044300190000000005430019000003a90000413d0000000006450019000003b00000613d0000000508000029000000e404100039000000c40410003900000000030304330000000603000029000001d10400004100000024031000390000008402100039000001d00010009c0000000102004039000001d90210019700000049011000390000000a0210003900000000000204350000000002310019000003810000413d000000200220003900000000064200190000000005320019000003880000613d00000000010204330000002a03500039000400000005001d000300000003001d000001cf010000410000002003500039000000400500043d0000036b0000213d0000000000510435000000000565019f000001cd05500197000001cc0550021f000001cb066001970000000006010433000000010110008a0000000a5330011a000000090030008c0000002101100039000003630000c13d000000000067004b000000001801043c00000000070400190000000006640019000003670000613d0000001f0550018f000001d9065001980000000004420436000000010430003900000000042400190000005f045000390000000103302039000000090040008c000000640440811a0000ffff0440818f0000000203308039000000640040008c000027100440811a000001a4044081970000000403308039000027100040008c000001ca0440812a000001b5044081970000000803308039000001ca0040009c000001c80440812a000001c90440819700000010033081bf000001c80040009c0000002003002039000001c60440212a000001c70040009c000003460000013d000001c50440012a0000033d0000413d000001c50030009c00000000024300190000004b022000390000000c0320003900000000035200190000031f0000413d000000000024004b0000000007340019000003260000613d00000000020404330000002c05600039000600000006001d0000000000250435000500000005001d000001ce020000410000002005600039000000400600043d000003090000213d0000000000620435000000000676019f000001cd06600197000001cc0660021f000001cb077001970000000007020433000000010220008a00000003066002100000000a6550011a000000090050008c000000070500002900000021022000390000000002240019000003010000c13d000000000068004b0000000006630019000003050000613d000000020110036700000000010000310000001f0510018f000001d90610019800000000033404360000000103200039000000400030043f0000000100500190000001b50030009c00000001050040390000000005000039000000000053004b0000000003450019000000400400043d0000005f03100039000001d9012001970000000102202039000000090010008c000000640110811a0000ffff0110818f0000000202208039000000640010008c000027100110811a000001a4011081970000000402208039000027100010008c000001ca0110812a000001b5011081970000000802208039000001ca0010009c000001c80110812a000001c90110819700000010022081bf000001c80010009c0000002002002039000001c60110212a000001c70010009c000001b4013001c7000001bd011001c7000001c402000041000000ad0000013d000000400700043d000001640000013d0000029c0000013d000002bc0000413d0000029c0000613d0000016f0000813d0000029f0000013d000002700000013d000002900000413d000002700000613d0000056a0000813d000000b80000813d000000000038004b000002730000013d0000020b0000013d000002630000413d0000020b0000813d0000000009480019000000000851034f000002c50000813d000000000065004b0000002007700039000002120000013d000001a90000013d000002010000413d000001a90000813d0000000009580019000000000861034f000002c30000813d0000000000840435000001bd013001c7000001bc01000041000002cf0000c13d000001b3011001980000000003024019000001a4030000410000000002080433000000000283001900000000003804350000000002820049000002970000c13d000000600480003900000040028000390000002001800039000001b00000c13d000001530000413d00000001055000390000000002620436000001b3066001970000000046040434000000a004000039000001590000613d000000c002400039000000a00240003900000080014000390000003201000039000001480000a13d000001b70040009c000000410160008a000001310000413d000000000014004b000000010440003900000001033000390000000005560436000000000503041a000001bf03000041000000a005000039000001620000a13d0000000007670019000000800090043f000000400080043f0000008008600039000001b70060009c000001b6066001970000003f067000390000000507900210000000000906043b000000000661034f00000004065000390000002306500039000000000505043b00000004051003700000000005000416000001420000813d000000000200041a000001490000013d0000000004020019000000a0010000390000012e0000c13d000002db0000013d000001c50110012a000002d20000413d000001c50010009c000700000001001d000002c70000c13d000800000001001d00000000020704330000000002730019000000000037043500000000027200490000026b0000c13d000000600470003900000040027000390000002001700039000002090000c13d00000000065600190000002405400039000000800080043f000000400070043f0000008007500039000001b70050009c000001b6055001970000003f0560003900000005068002100000013c0000813d000000000805043b000000000551034f00000004054000390000002305400039000000000404043b000000040410037000000000040004160000010a0000013d0000004001200210000001ac0020009c000000f20000613d000001ab0020009c000001b20020009c0000008e0000613d000001b10020009c000000660000013d000001aa0020009c0000010f0000613d000001a90020009c0000007b0000613d000001a80020009c0000005c0000a13d000001a70020009c000001a501000041000001200000044300000100001004430000002001000039000001b00020009c000000fe0000613d000001af0020009c0000006d0000613d000001ae0020009c000000420000a13d000001ad0020009c000000290000213d000001a60020009c000000e002200270000000000201043b000000210000c13d000001a40040019d00020000000103550003000000310355000001a40340019700000060043002700008000000000002000400000000000203e603e5012103e403e303e203e103e00120011f000a03df011e001603de03dd03dc03db03da03d903d803d703d603d503d4000100380010000100370036004d001400380010000103d303d203d103d0001403cf03ce03cd03cc03cb03ca03c90001003800100001011d011c011b000d003500130034001a004c0021011a0119011803c803c703c603c50001004b0016004a002b00010049000301170006000d008000130034001a004c00210010011901180036004d001403c403c303c20001003800100001011d011c011b0033007f0005000903c101160014004b0016004a002b000100490003000d003500130034001a004c03c0004b0016004a002b00010049000301170006000d011500130034001a004c00210036004d00140114001603bf0048000103be03bd0113000603bc007e011203bb03ba03b9011103b803b703b603b503b4000203b303b203b103b003af01100006010f03ae03ad0047002003ac007d004603ab010e010d003203aa03a9010c03a8010b007c03a7007b0045007a007900020078001f007700080007001903a600050009001e000c002a000500090029000c00280012000f000a0011000303a5000d00350013001d00080007001c00270012000f000a001100030021011a03a4003703a303a203a10034010a03a0039f00380010000100470037003601090010039e039d039c039b004b0016004a002b000100490003039a0108039901090107002101060036004d00140114001603980031000103970396010500060395011001120394039303920104000203910390038f038e0002038d038c038b0103038a01020389001a000b038803870076007503860385038403830382038103800101037f037e0026000d007400250024000b0026000d037d00250024000b037c00440020037b007d0046037a00320379037800730377037603750374007e0373010000050009001e000800070019000c0014003003720371004700200370007d0046036f010e010d0032036e036d010c036c010b007c036b007b0045007a007900020078001f0077000800070019036a00050009001e000c002a000500090029000c00280012000f000a00110003000d00350013001d00080007001c00270012000f000a0011003300050369036800ff00030021036703660365007f0364000b007200fe00430363002300fd0362036100fc00fb0006036000fa00f9000600f80016007100f7000200f600f500f40042002f00f3000600f2000e00f1004100700006002e000e0042002f001800f000ef0040000100ee0017000e00ed00ec00eb000600ea00e900e8006f00e700e60030002200e500e400e3006e000100e200e100e0006d000200df00de00dd006c00dc00db00da00d900d8000200d7001f00d600d500d400d300d20006003f035f00d100d0006b00cf006a000e003f035e035d00ce035c035b00fe004300cd002d035a0359035800fc00fb0006035700fa00f9000600f80016007100f7000200f600f500f40042002f00f3000600f2000e00f1004100700006002e000e0042002f001800f000ef0040000100ee0017000e00ed00ec00eb000600ea00e900e8006f00e700e60030002200e500e400e3006e000100e200e100e0006d000200df00de00dd006c00dc00db00da00d900d8000200d7001f00d600d500d400d300d20006003f035600d100d0006b00cf006a000e003f0355035400cc007500cb00ca035300c90352035100c80069002300c70068006700c6006600c50350002e0065003e00180064006300c400170062002c00c300c200c10061001700c00018034f0022000e006000bf005f005e034e034d00cc007500be00ca034c00bd0102034b00c80069002300c70068006700c600660070005d002e0065003e00180064006300c400170062002c00c300c200c10061001700c00018034a0022000e006000bf005f005e034903480071034703460345005c034400200008000700190343000b007f03420014010a0341034000bc033f033e033d033c033b033a0339033803370336033503340333033203310330032f032e032d032c032b00bb032a0329032803270326032500020324001f03230322032100ba0320031f031e031d031c031b005b00b9005a003d031a03190031031803170316031503140313031203110310030f030e030d030c030b030a0309030803070306030503040303002b0302007600b80301005900580072030002ff02fe00b702fd00b6005702fc007c02fb007b0045007a007900020078001f007700b502fa02f900b400b302f802f700b302f602f5004502f402f302f202f102f002ef02ee02ed02ec02eb02ea02e902e802e702e602e502e402e302e200bb02e1005602e001130002011f02df02de002d02dd02dc02db02da02d902d800b202d702d6003100b102d500b502d402d300b002d202d102d002cf02ce02cd02cc02cb02ca02c902c802c700af02c602c502c4001002c3005502c202c100ae00ad02c000ac02bf02be02bd02bc00ab00aa02bb02ba00b1010800bc02b9003c0002000a001f004402b8000202b702b602b5005400b4004602b402b302b2005702b1003202b002af007302ae00a900590058002d007e02ad02ac00a800a700a602ab02aa02a900aa02a802a702a6003202a502a4007602a302a200ae00ad007202a102a0029f029e029d029c029b029a00a700a60100029902980297005702960295029400b700050009001e000800070019000c029302920291000c002802900053000a028f00030010028e028d028c028b00a5028a0289028802870286028500a402840283005b00b9005a003d00a3028202810280027f027e00a200a100a00003009f009e009d009c009b00050009027d00520051027c000c000b027b027a010602790278001d00080007001c02770276000f000a027500030010001100a4027400af0273004700200272027100200270026f026e026d002b026c002a009a011e026b026a02690008000702680052005100ff026700050009002902660050005301210265026400a5000a02630099003c0002009900440262000d00800013001d00080007001c00270012000f000a001100030021001002610037003c00020260025f01070050003b0037025e025d00800013001d00080007001c00270012000f000a00110003025c003b025b000d00350013001d00080007001c00270012000f000a00110003025a0259009a0258003b025701150013001d00080007001c00270012000f000a001100030256003b0255005c025400b6025302520098025100480250024f0097024e024d009600cd0023024c024b00b8024a0095005602490248005400ab024702460048024502440073024300a900590058002d02420241024000a800950056023f023e023d0098023c023b023a023900480238023702360094023500050009001e000800070019000c002a000500090029000c0028023402330232023102300053000a0011005c005000200008000700190116001400930120022f0097022e022d022c0092022b022a00b2002d0229022802270226002c0225005d0224022300910030009002220221004302200096021f021e021d021c0043021b0030021a008f008e02190218021702160215021402130212021100330210020f005b008d005a003d00a3020e0031020d020c00b000a200a100a00003009f009e009d009c009b020b00050009020a000c000b020900be0208020700bd020602050204003d00230203020202010200003e01ff005d01fe01fd002c004f01fc01fb01fa004e01f9009101f801f701f601f5004e01f4004f01f3006f01f201f101f001ef01ee01ed01ec0026000d008c00250024000b01eb001501ea008b01e901e801e70105001501e600ac01e501e401e301e2011101e101e001df01de003301dd0092009001dc01db003a01da008a01d901d8010301d701d60015010f01d5008d01d4008e01d3004e01d2002300fd01d101d001cf0104001501ce01cd01cc001501cb008b006c01ca003a01c901c801c70089004101c6001501c5003901c4006b01c30015006a003900890041006e01c201c101c0008801bf01be003901bd002f006d001501bc01bb01ba002201b901b801b701b601b5008f01b401b301b2004f008801b101b001af01ae003a01ad01ac01ab01aa01a901a801a701a601a5003a01a4008a01a301a201a101a0019f00150040019e019d019c019b019a019900390040019801970196001b001a000b0026000d007400250024000b00330195019400540193019201910190018f018e0031018d00ce00cb018c018b00c9018a01890188006900ba0187006800670186006600c50185002e0065003e001800640063018400170062002c0183018201810061001701800018017f0022000e0060017e005f005e017d017c017b017a0094017901010178017701760175003c0174017301720044005200510171017000050009001e000c002a000500090029000c00280012000f000a016f0003001b0026000d008c00250024000b0026000d007400250024000b001a000b009300080007001900050009001e000c002a000500090029000c00280012000f000a016e0003001b001a000b016d0087001b0055001b016c0087001b0055001b016b0014000b0000000000000000000000000086016a000001690000000000000000016800000000000001670000000000000166000000000000016500000000000001640000000000000163000000000000016200000000000001610000000000000160000000000000015f000000000000015e000000000000015d000000000000015c000000860004000400000000015b000000000000000000040085000400040084000000000000015a0085000400040004015900000000000000830000000000000083000001580000015700000000000000000000015600000000000001550000015401530152015101500000000000000000000000820000014f014e014d014c00000000014b0000014a00000000000001490148014700000000000000810146000000000081014500000000000001440000000000040004000000000000014301420004000400040141014000000000013f000000000000013e013d00000000013c013b00000000000000000000013a0139013801370136013501340133013201310130012f012e012d000000820000012c000000000000000000000000012b0004012a000000000129012801270126000400040004008401250124012301220000000000000000000000000000", + "logIndex": 5, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x010001db5d767185714cc92b45e71aa204d217485b14dabe76b1c480a7f435a5", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 6, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x010001db5d767185714cc92b45e71aa204d217485b14dabe76b1c480a7f435a5", + "0x000000000000000000000000259a75b880d1ac494fc84d8b77bcb4754eec3435" + ], + "data": "0x", + "logIndex": 7, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + }, + { + "transactionIndex": 0, + "blockNumber": 3908530, + "transactionHash": "0x26de418dcb77b8c44df4edc0d7c38bc499a9539f3479da8dc5165fed9da0f369", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x00000000000000000000000000000000000000000000000000082850c3228780", + "logIndex": 8, + "blockHash": "0xef2ef7f1a0d87a2931207b1e37380aa9371d389d8b7349409ace03476063c817" + } + ], + "blockNumber": 3908530, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "5ce2fc077c07b62f4a56303c32131ea8", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "name": "VaultAlreadyDeployed", + "type": "error" + }, + { + "inputs": [], + "name": "VaultDoesNotExist", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": true, + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "vaultId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "indexed": false, + "internalType": "struct INftVault.CollectionData[]", + "name": "collections", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "creator", + "type": "address" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllVaults", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "getVaultAt", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVaultLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "enum INftVault.NftType", + "name": "nftType", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "allowAllIds", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "internalType": "struct INftVault.CollectionData[]", + "name": "_collections", + "type": "tuple[]" + } + ], + "name": "hashVault", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVault", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "vaultHashMap", + "outputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract INftVault", + "name": "", + "type": "address" + } + ], + "name": "vaultIdMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "VaultAlreadyDeployed()": [ + { + "details": "Vault with identical configuration is already deployed" + } + ], + "VaultDoesNotExist()": [ + { + "details": "Vault does not exist" + } + ] + }, + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "params": { + "collections": "configuration used for vault creation", + "creator": "address of vault creator", + "name": "vault's name", + "symbol": "vault's name", + "vault": "vault's address as INftVault", + "vaultId": "vault's index in `vaults` AddressSet" + } + } + }, + "kind": "dev", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "details": "If vault already exists, function reverts", + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address of deployed vault" + } + }, + "exists((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "true if vault with given config exists" + } + }, + "getAllVaults()": { + "returns": { + "_0": "all deployed vaults" + } + }, + "getVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "vault": "address" + } + }, + "getVaultAt(uint256)": { + "params": { + "index": "vaultId or index in NftVaultFactory.vaults array" + }, + "returns": { + "_0": "vault address" + } + }, + "getVaultLength()": { + "returns": { + "_0": "length of vault's EnumerableSet" + } + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "params": { + "collections": "vault's config" + }, + "returns": { + "_0": "config hash" + } + }, + "isVault(address)": { + "params": { + "vault": "address" + }, + "returns": { + "_0": "true if vault is deployed by the factory" + } + } + }, + "stateVariables": { + "vaultHashMap": { + "params": { + "hash": "vault's config hash" + }, + "return": "address", + "returns": { + "_0": "address" + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "VaultCreated(string,string,address,uint256,(address,uint8,bool,uint256[])[],address)": { + "notice": "Emitted when new vault is deployed" + } + }, + "kind": "user", + "methods": { + "createVault((address,uint8,bool,uint256[])[])": { + "notice": "Create new vault" + }, + "exists((address,uint8,bool,uint256[])[])": { + "notice": "Returns true if vault with given config exists" + }, + "getVault((address,uint8,bool,uint256[])[])": { + "notice": "Get vault by it's config" + }, + "getVaultAt(uint256)": { + "notice": "Get vault by its EnumerableSet vaultId" + }, + "hashVault((address,uint8,bool,uint256[])[])": { + "notice": "Get config hash" + }, + "isVault(address)": { + "notice": "Returns true if vault has been deployed by factory" + }, + "vaultHashMap(bytes32)": { + "notice": "Get vault by its config hash" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Vault/NftVaultFactory.sol": "NftVaultFactory" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Vault/INftVault.sol": { + "keccak256": "0x1b55813c809306ff889c9a07ea9aae68a4267568b5d09226096779b2bc8f552c", + "license": "MIT", + "urls": [ + "bzz-raw://a890283e8f67d5c2d8ff78486e4d2c214587aac76dd941f5d0a3a7a1b02b2280", + "dweb:/ipfs/QmUBhfyiit6VHerjJGmQL2q9C3P3XiX1gjv97jVx37qn6v" + ] + }, + "contracts/Vault/INftVaultFactory.sol": { + "keccak256": "0x48b76dac0e86e80a6c31e9566a42445b82c30b5bb184a0f70badeb1ac4448c20", + "license": "MIT", + "urls": [ + "bzz-raw://6bc21cf0dd88cb6ca4a990513c0f88010a2b8745a6f3bceff9a8e55fe822ddca", + "dweb:/ipfs/QmU3UFqt2aU8W8MSBQznzGMT6Mh3jTGcvxZrKjBdrYB8yG" + ] + }, + "contracts/Vault/NftVault.sol": { + "keccak256": "0xfcc3dc2246c4519105987c2c55330caa44fd280bf12b9e17769cfb2d44d3af30", + "license": "MIT", + "urls": [ + "bzz-raw://92e5cc716c130e5ea8948a1d67d2c66967f05a59320bbdcd1e2f7d1b1178bd67", + "dweb:/ipfs/QmdyPtrKpLUNA9auRcweLK33EeBHammReNft4xEA56wfC8" + ] + }, + "contracts/Vault/NftVaultFactory.sol": { + "keccak256": "0x30fb7e6ba0a7016ba9d745883b070c96645e7e2af429e3435bf812dfae03881a", + "license": "MIT", + "urls": [ + "bzz-raw://755d95704a415d732c996a54a239821ad262f0b54c7846ec090b0599634c639f", + "dweb:/ipfs/QmWC2wg75hEYuDa3ATLitL5xM1zvLJawbTCkRpSnHfxNUK" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673", + "license": "MIT", + "urls": [ + "bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2", + "dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "keccak256": "0x5c879356795cc563440408404a52eaf672d4547949e0a5920fb17642303d9e1b", + "license": "MIT", + "urls": [ + "bzz-raw://fb210cdef017f9813af368e17ea1573bc26094dd8dba8b5db8bec4cc90883d0a", + "dweb:/ipfs/QmdixQwckiNVVWHaJD9ps5ALWsHkZGRAePkuUPw1ZhhJhM" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "keccak256": "0x6392f2cfe3a5ee802227fe7a2dfd47096d881aec89bddd214b35c5b46d3cd941", + "license": "MIT", + "urls": [ + "bzz-raw://bd9c47a375639888e726a99da718890ba16d17d7ad9eacb0ccc892d46d1b3ee0", + "dweb:/ipfs/Qmb41W5RUjy2sWg49A2rMnxekSeEk6SvGyJL5tyCCSr7un" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "keccak256": "0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b", + "license": "MIT", + "urls": [ + "bzz-raw://0e28648f994abf1d6bc345644a361cc0b7efa544f8bc0c8ec26011fed85a91ec", + "dweb:/ipfs/QmVVE7AiRjKaQYYji7TkjmTeVzGpNmms5eoxqTCfvvpj6D" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "keccak256": "0x2e024ca51ce5abe16c0d34e6992a1104f356e2244eb4ccbec970435e8b3405e3", + "license": "MIT", + "urls": [ + "bzz-raw://a74009db3c6fc8db851ba69ddb6795b5c1ef1120c5a00fd1a8dc3a717dd9d519", + "dweb:/ipfs/QmZMk8Yh2X3gPS51ckUVLEXjZUhMSEeGApnA53WtjvLb9h" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "keccak256": "0x3dd5e1a66a56f30302108a1da97d677a42b1daa60e503696b2bcbbf3e4c95bcb", + "license": "MIT", + "urls": [ + "bzz-raw://0808de0ae4918c664643c885ca7fa6503e8ef2bd75609dfc85152c0128a3422d", + "dweb:/ipfs/QmNrhFC1XgBKuuxfahFeiwi1MCdu3FLNpHj2uStgmf4iJj" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "keccak256": "0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d", + "license": "MIT", + "urls": [ + "bzz-raw://15f52f51413a9de1ff191e2f6367c62178e1df7806d7880fe857a98b0b66253d", + "dweb:/ipfs/QmaQG1fwfgUt5E9nu2cccFiV47B2V78MM1tCy1qB7n4MsH" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "keccak256": "0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca", + "license": "MIT", + "urls": [ + "bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd", + "dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68", + "license": "MIT", + "urls": [ + "bzz-raw://daae589a9d6fa7e55f99f86c0a16796ca490f243fb3693632c3711c0646c1d56", + "dweb:/ipfs/QmR3zpd7wNw3rcUdekwiv6FYHJqksuTCXLVioTxu6Fbxk3" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "keccak256": "0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da", + "license": "MIT", + "urls": [ + "bzz-raw://6e75cf83beb757b8855791088546b8337e9d4684e169400c20d44a515353b708", + "dweb:/ipfs/QmYvPafLfoquiDMEj7CKHtvbgHu7TJNPSVPSCjrtjV8HjV" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "keccak256": "0x0108bf6a6ebd5f96678bed33a35947537263f96766131ee91461fb6485805028", + "license": "MIT", + "urls": [ + "bzz-raw://ae2d274bf3d56a6d49a9bbd0a4871c54997a82551eb3eb1c0c39dc98698ff8bf", + "dweb:/ipfs/QmTT7ty5DPGAmRnx94Xu3TUDYGSPDVLN2bppJAjjedrg1e" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1", + "license": "MIT", + "urls": [ + "bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269", + "dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", + "license": "MIT", + "urls": [ + "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", + "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "keccak256": "0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a", + "license": "MIT", + "urls": [ + "bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634", + "dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "keccak256": "0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b", + "license": "MIT", + "urls": [ + "bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d", + "dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "keccak256": "0x0812bc73d6e30558840122fa48d6f64ae978ccc1b1fc42e616bac190c6360f46", + "license": "MIT", + "urls": [ + "bzz-raw://3d95a53b7e19ca1d46043eaad8967b6e0b02aab2b5fefc2108bfa6d1ad425f5b", + "dweb:/ipfs/QmQq7AUGT9juE3hun2Wy7r2BDoDBFdBn43DVwhJpK2StLV" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "license": "MIT", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "keccak256": "0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6", + "license": "MIT", + "urls": [ + "bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b", + "dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "keccak256": "0x5094b17cb46143943f3206d0738b91a05a7005e979681af7210d534cd3e72f54", + "license": "MIT", + "urls": [ + "bzz-raw://a55fbc9ee8080ec3b397e8e32e5dafcff2c377ce44d553bfc93dfce1be2d5b12", + "dweb:/ipfs/QmYSk6bNHnpKRyNWXmEBKbkPxXi7Hco9JZHHyxMdrZGWpb" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0xc3ff3f5c4584e1d9a483ad7ced51ab64523201f4e3d3c65293e4ca8aeb77a961", + "license": "MIT", + "urls": [ + "bzz-raw://d7d3dd6067a994690471b5fc71b6f81fac3847798b37d404f74db00b4d3c3d0e", + "dweb:/ipfs/QmRHF1RarifjNi93RttouNPkYZGyu6CD926PgRDzD5iL35" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252", + "deployedBytecode": "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252", + "factoryDeps": [ + "0x00020000000000020010000000000002000000000e01034f00010000000e035500000000010e0019000000600110027000000632031001970000000100200190000000570000c13d0000008002000039000000400020043f000000040030008c00000dd20000413d00000000010e043b000000e0011002700000063b0010009c000001250000213d000006530010009c000001340000213d0000065f0010009c000001890000213d000006650010009c0000026b0000213d000006680010009c000003f90000613d000006690010009c00000dd20000c13d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000010001000039000000400010043f000000800000043f000000a00000043f000000c00000043f0000006001000039000000e00010043f0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c000006430000613d000000000001004b00000dd40000c13d000b00000001001d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b0000000b01000029000006430000c13d000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000006910000013d000000c002000039000000400020043f0000000001000416000000000001004b00000dd20000c13d0000001f013000390000063301100197000000c001100039000000400010043f0000001f0430018f0000063405300198000000c001500039000000690000613d00000000060e034f000000006706043c0000000002720436000000000012004b000000650000c13d000000000004004b000000760000613d00000000025e034f0000000304400210000000000501043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f0000000000210435000000400030008c00000dd20000413d000000c00400043d000006350040009c00000dd20000213d0000001f01400039000000000031004b000000000200001900000636020080410000063601100197000000000001004b00000000050000190000063605004041000006360010009c000000000502c019000000000005004b00000dd20000c13d000000c0014000390000000002010433000006350020009c000005930000213d0000001f01200039000006a8011001970000003f01100039000006a801100197000000400600043d0000000005160019000000000065004b00000000010000390000000101004039000006350050009c000005930000213d0000000100100190000005930000c13d000000c001300039000000400050043f000c00000006001d0000000005260436000b00000005001d000000e0044000390000000005420019000000000015004b00000dd20000213d000000000002004b0000000b08000029000000ac0000613d000000000500001900000000065800190000000007450019000000000707043300000000007604350000002005500039000000000025004b000000a50000413d0000000c0220002900000020022000390000000000020435000000e00400043d000006350040009c00000dd20000213d0000001f02400039000000000032004b000000000300001900000636030080410000063602200197000000000002004b00000000050000190000063605004041000006360020009c000000000503c019000000000005004b00000dd20000c13d000000c0024000390000000002020433000006350020009c000005930000213d0000001f03200039000006a8033001970000003f03300039000006a803300197000000400600043d0000000003360019000000000063004b00000000050000390000000105004039000006350030009c000005930000213d0000000100500190000005930000c13d000000400030043f000a00000006001d0000000003260436000900000003001d000000e0034000390000000004320019000000000014004b00000dd20000213d000000000002004b0000000906000029000000e20000613d000000000100001900000000041600190000000005310019000000000505043300000000005404350000002001100039000000000021004b000000db0000413d0000000a01200029000000200110003900000000000104350000000c010000290000000004010433000006350040009c000005930000213d0000000303000039000000000103041a000000010210019000000001051002700000007f0550618f0000001f0050008c00000000010000390000000101002039000000000012004b000005d50000c13d000700000005001d000000200050008c000800000004001d000001130000413d000000000030043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d00000008040000290000001f024000390000000502200270000000200040008c0000000002004019000000000301043b00000007010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b0000000303000039000001130000813d000000000002041b0000000102200039000000000012004b0000010f0000413d0000001f0040008c000007120000a13d000000000030043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000200200008a0000000802200180000000000101043b000007dc0000c13d0000002003000039000007e90000013d0000063c0010009c000001730000213d000006480010009c0000019c0000213d0000064e0010009c0000027e0000213d000006510010009c0000040a0000613d000006520010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000501000039000005df0000013d000006540010009c000001ad0000213d0000065a0010009c0000031c0000213d0000065d0010009c000004110000613d0000065e0010009c00000dd20000c13d000000640030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d0000066a0010009c00000dd20000213d0000004401e00370000000000101043b000a00000001001d0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b00000000020004110000066a02200197000900000002001d000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000006a90010009c000006890000c13d0000000c010000290000000b020000290000000a0300002918c317bf0000040f0000062b0000013d0000063d0010009c0000024d0000213d000006430010009c0000034d0000213d000006460010009c000004180000613d000006470010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000201043b0000066a0020009c00000dd20000213d0000002401e00370000000000301043b000000000100041118c317bf0000040f0000027c0000013d000006600010009c000003b80000213d000006630010009c000004570000613d000006640010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b18c3123d0000040f000005fa0000013d000006490010009c000003c10000213d0000064c0010009c0000046a0000613d0000064d0010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000001000412001000000001001d000f00200000003d000080050100003900000044030000390000000004000415000000100440008a000005570000013d000006550010009c000003cc0000213d000006580010009c000005040000613d000006590010009c00000dd20000c13d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000dd20000213d000000000005004b000001e00000613d000000800500003900000000062e034f000000000606043b0000066a0060009c00000dd20000213d000000200550003900000000006504350000002002200039000000000042004b000001d70000413d0000004402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000700000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000706000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000002130000613d000000070400002900000000062e034f000000000606043b000000200440003900000000006404350000002002200039000000000052004b0000020c0000413d0000006402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000400000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000406000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000002460000613d000000040300002900000000042e034f000000000404043b000000200330003900000000004304350000002002200039000000000052004b0000023f0000413d000000800200043d000000000002004b000800000000001d00000a310000c13d000000400100043d00000008020000290000062d0000013d0000063e0010009c000003df0000213d000006410010009c0000054d0000613d000006420010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d000000000010043f0000000a01000039000000200010043f00000040020000390000000001000019000c0000000e035318c3188b0000040f0000000c0200035f0000002402200370000000000202043b000000000020043f000000200010043f00000000010000190000004002000039000003dd0000013d000006660010009c0000055d0000613d000006670010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000201043b0000066a0020009c00000dd20000213d0000002401e00370000000000301043b000000000100041118c318330000040f0000000101000039000005fa0000013d0000064f0010009c0000057d0000613d000006500010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d000000010010008c00000dd20000213d0000004401e00370000000000101043b000a00000001001d0000066a0010009c00000dd20000213d0000006401e00370000000000101043b000900000001001d0000000a01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000002b90000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000002db0000613d0000000a01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000202100039000000000202041a000000ff002001900000070a0000c13d0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff001001900000070a0000c13d0000000b0000006b0000072b0000c13d0000067b0100004100000000001004430000000a0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400300043d00000044013000390000000902000029000000000021043500000024013000390000000c0200002900000000002104350000068001000041000000000013043500000000010004100000066a01100197000c00000003001d0000000402300039000000000012043500000000010004140000000a02000029000000040020008c000007860000613d0000000c02000029000006320020009c00000632020080410000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000a0200002918c318b90000040f00000000030100190000006003300270000006320030019d0000000100200190000007860000c13d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000003170000c13d000008ea0000013d0000065b0010009c000005990000613d0000065c0010009c00000dd20000c13d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a00000024020000390000000102200367000000000202043b000000000012001a00000de10000413d0000000003120019000006280000013d000006440010009c000005a00000613d000006450010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000004401e00370000000000101043b000006350010009c00000dd20000213d0000002304100039000000000034004b00000dd20000813d000000040410003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024011000390000000004140019000000000034004b00000dd20000213d000000000005004b0000037f0000613d00000000051e034f000000000505043b000000200220003900000000005204350000002001100039000000000041004b000003780000413d0000006401e00370000000000101043b000006350010009c00000dd20000213d0000002302100039000000000032004b000000000400001900000636040080410000063602200197000000000002004b00000000050000190000063605004041000006360020009c000000000504c019000000000005004b00000dd20000c13d000000040210003900000000022e034f000000000402043b000006350040009c000005930000213d00000005054002100000003f025000390000066f06200197000000400200043d0000000006620019000000000026004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f000000000042043500000024011000390000000005150019000000000035004b00000dd20000213d000000000004004b000003af0000613d00000000041e034f000000000404043b000000200220003900000000004204350000002001100039000000000051004b000003a80000413d0000008401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f0000067101000041000005fa0000013d000006610010009c000005b00000613d000006620010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d0000000201000039000005df0000013d0000064a0010009c000005c60000613d0000064b0010009c00000dd20000c13d0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ef70000040f18c30f9a0000040f000005fa0000013d000006560010009c000005db0000613d000006570010009c00000dd20000c13d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d000000000010043f000000200000043f0000004002000039000000000100001918c3188b0000040f000005df0000013d0000063f0010009c000005e30000613d000006400010009c00000dd20000c13d000000a40030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000008401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f0000066b01000041000005fa0000013d000000240030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000006a50010019800000dd20000c13d000006a60010009c00000000020000390000000102006039000006a70010009c00000001022061bf000000800020043f0000066d01000041000018c40001042e0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ee30000040f18c315a20000040f000005fa0000013d0000000001000416000000000001004b00000dd20000c13d000000000103001918c30ee30000040f18c313720000040f000005fa0000013d000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b000c00000001001d0000066a0010009c00000dd20000213d0000002401e00370000000000101043b000b00000001001d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0000000b0310006c000006280000813d000000400100043d00000064021000390000067303000041000000000032043500000044021000390000067403000041000000000032043500000024021000390000002503000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c500010430000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000302043b0000000002030019000000010030008c00000dd20000213d000c00000002001d18c310010000040f000000400100043d0000000c020000290000062d0000013d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000504043b000006350050009c000005930000213d00000005045002100000003f064000390000066f06600197000006700060009c000005930000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000dd20000213d000000000005004b000004970000613d000000800500003900000000062e034f000000000606043b0000066a0060009c00000dd20000213d000000200550003900000000006504350000002002200039000000000042004b0000048e0000413d0000004402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000600000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000606000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000004ca0000613d000000060400002900000000062e034f000000000606043b000000200440003900000000006404350000002002200039000000000052004b000004c30000413d0000006402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b000000000500001900000636050080410000063604400197000000000004004b00000000060000190000063606004041000006360040009c000000000605c019000000000006004b00000dd20000c13d000000040420003900000000044e034f000000000404043b000006350040009c000005930000213d00000005054002100000003f065000390000066f06600197000000400700043d0000000006670019000200000007001d000000000076004b00000000070000390000000107004039000006350060009c000005930000213d0000000100700190000005930000c13d000000400060043f0000000206000029000000000046043500000024022000390000000005250019000000000035004b00000dd20000213d000000000004004b000004fd0000613d000000020300002900000000042e034f000000000404043b000000200330003900000000004304350000002002200039000000000052004b000004f60000413d000000800200043d000000000002004b000700000000001d00000c1a0000c13d000000400100043d00000007020000290000062d0000013d0000000001000416000000000001004b00000dd20000c13d0000000601000039000000000101041a000006350010009c000005930000213d00000005041002100000003f024000390000066f02200197000006700020009c000005930000213d0000008002200039000000400020043f000000800010043f0000001f0240018f000000000004004b0000051d0000613d00000000033e034f000000a004400039000000a005000039000000003603043c0000000005650436000000000045004b000005190000c13d000000000002004b000000800400043d000000000004004b000005330000613d00000008020000390000000003000019000000000031004b00000dda0000a13d0000068d0530009a000000000505041a000000000050043f000000200020043f000000000034004b00000dda0000a13d0000066a045001970000000505300210000000a00550003900000000004504350000000103300039000000800400043d000000000043004b000005230000413d000000400100043d00000020020000390000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005440000613d00000080040000390000000005000019000000200440003900000000060404330000066a0660019700000000026204360000000105500039000000000035004b0000053d0000413d0000000002120049000006320020009c00000632020080410000006002200210000006320010009c00000632010080410000004001100210000000000112019f000018c40001042e0000000001000416000000000001004b00000dd20000c13d0000000001000412000e00000001001d000d00000000003d0000800501000039000000440300003900000000040004150000000e0440008a00000005044002100000066e0200004118c318a00000040f000000800010043f0000066d01000041000018c40001042e0000000001000416000000000001004b00000dd20000c13d0000000303000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f0000000100600190000005d50000c13d000000800010043f000000000005004b000006040000613d000000000030043f000000020020008c0000000002000019000006170000413d000006a3030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b000005750000413d000006170000013d000000240130008c00000dd20000413d0000000002000416000000000002004b00000dd20000c13d0000000402e00370000000000202043b000006350020009c00000dd20000213d0000002304200039000000000034004b00000dd20000813d000000040420003900000000044e034f000000000704043b000006350070009c000005930000213d00000005067002100000003f046000390000066f04400197000006700040009c000006330000a13d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000416000000000001004b00000dd20000c13d0000001201000039000000800010043f0000066d01000041000018c40001042e000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b18c311f30000040f000000000001004b0000000001000039000000010100c039000005fa0000013d000000840030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002401e00370000000000101043b0000066a0010009c00000dd20000213d0000006401e00370000000000101043b000006350010009c00000dd20000213d0000000401100039000000000203001918c30e9a0000040f000006a201000041000005fa0000013d0000000001000416000000000001004b00000dd20000c13d0000000403000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f0000000100600190000006010000613d0000069b01000041000000000010043f0000002201000039000000040010043f0000069601000041000018c5000104300000000001000416000000000001004b00000dd20000c13d0000000601000039000000000101041a000000800010043f0000066d01000041000018c40001042e000000440030008c00000dd20000413d0000000001000416000000000001004b00000dd20000c13d0000000401e00370000000000101043b0000066a0010009c00000dd20000213d0000002402e00370000000000202043b000c00000002001d0000066a0020009c00000dd20000213d000000000010043f0000000101000039000000200010043f0000004002000039000000000100001918c3188b0000040f0000000c0200002918c30f8a0000040f000000000101041a000000400200043d0000000000120435000006320020009c000006320200804100000040012002100000066c011001c7000018c40001042e000000800010043f000000000005004b0000060a0000c13d000006aa01200197000000a00010043f000000000004004b00000020020000390000000002006039000006170000013d000000000030043f000000020020008c0000000002000019000006170000413d00000677030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b000006100000413d0000002002200039000000800100003918c30e880000040f000000400100043d000c00000001001d000000800200003918c30e730000040f0000000c020000290000000001210049000006320010009c00000632010080410000006001100210000006320020009c00000632020080410000004002200210000000000121019f000018c40001042e00000000010004110000000c0200002918c318330000040f000000400100043d00000001020000390000000000210435000006320010009c000006320100804100000040011002100000066c011001c7000018c40001042e0000008004400039000000400040043f000000800070043f00000024052000390000000006560019000000000036004b00000dd20000213d000000000007004b0000069c0000c13d00000692010000410000000000140435000006320040009c000006320400804100000040014002100000067f011001c7000018c500010430000b00000001001d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000201100039000000000101041a000a00000001001d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000400400043d000006700040009c000005930000213d0000000a02000029000000ff00200190000000000101043b0000008002400039000000400020043f0000000002000039000000010200c0390000004003400039000000000023043500000020024000390000000b0300002900000000003204350000000c02000029000a00000004001d00000000002404350000000101100039000000000301041a000000400200043d000c00000002001d000b00000003001d0000000002320436000900000002001d000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d0000000b0000006b000007be0000c13d0000000904000029000007c80000013d0008000a00100074000006fe0000813d000000400100043d0000004402100039000006a103000041000000000032043500000024021000390000001d03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000008004000039000006a50000013d00000020044000390000006009700039000000000089043500000000007404350000002005500039000000000065004b0000083d0000813d00000000075e034f000000000707043b000006350070009c00000dd20000213d00000000082700190000000007810049000006880070009c00000dd20000213d000000800070008c00000dd20000413d000000400700043d000006700070009c000005930000213d0000008009700039000000400090043f0000002409800039000000000a9e034f000000000a0a043b0000066a00a0009c00000dd20000213d000000000aa704360000002009900039000000000b9e034f000000000b0b043b0000000100b0008c00000dd20000213d0000000000ba04350000002009900039000000000a9e034f000000000a0a043b00000000000a004b000000000b000039000000010b00c0390000000000ba004b00000dd20000c13d000000400b7000390000000000ab0435000000200990003900000000099e034f000000000909043b000006350090009c00000dd20000213d00000000098900190000004308900039000000000038004b000000000a000019000006360a0080410000063608800197000000000008004b000000000b000019000006360b004041000006360080009c000000000b0ac01900000000000b004b00000dd20000c13d000000240890003900000000088e034f000000000a08043b0000063500a0009c000005930000213d000000050ba002100000003f08b000390000066f0c800197000000400800043d000000000cc8001900000000008c004b000000000d000039000000010d0040390000063500c0009c000005930000213d0000000100d00190000005930000c13d0000004000c0043f0000000000a804350000004409900039000000000a9b001900000000003a004b00000dd20000213d0000000000a9004b0000069e0000813d000000000b080019000000000c9e034f000000000c0c043b000000200bb000390000000000cb043500000020099000390000000000a9004b000006f60000413d0000069e0000013d0000000c0000006b0000071f0000c13d000000400100043d00000064021000390000069f0300004100000000003204350000004402100039000006a0030000410000000000320435000000240210003900000024030000390000044c0000013d000000400100043d00000687020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c500010430000000080000006b0000000001000019000007170000613d0000000b01000029000000000101043300000008040000290000000302400210000006a90220027f000006a902200167000000000121016f0000000102400210000000000121019f000007f70000013d000000090000006b0000078d0000c13d000000400100043d00000064021000390000069d03000041000000000032043500000044021000390000069e030000410000000000320435000000240210003900000022030000390000044c0000013d000000400100043d000b00000001001d0000067a0010009c000005930000213d0000000b020000290000002001200039000800000001001d000000400010043f00000000000204350000067b0100004100000000001004430000000a0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400400043d0000067d01000041000000000014043500000084010000390000000101100367000000000101043b0000008402400039000000a00300003900000000003204350000006402400039000000000012043500000044014000390000000902000029000000000021043500000024014000390000000c02000029000000000021043500000000010004100000066a01100197000000040240003900000000001204350000000b010000290000000001010433000000a4024000390000000000120435000c00000004001d000000c402400039000000000001004b00000008060000290000076a0000613d000000000300001900000000042300190000000005630019000000000505043300000000005404350000002003300039000000000013004b000007630000413d0000000002210019000000000002043500000000020004140000000a03000029000000040030008c000007860000613d0000001f01100039000006a801100197000000c401100039000006320010009c000006320100804100000060011002100000000c03000029000006320030009c00000632030080410000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000112019f0000000a0200002918c318b90000040f00000000030100190000006003300270000006320030019d0000000100200190000008de0000613d0000000c01000029000006350010009c000005930000213d0000000c01000029000000400010043f0000000001000019000018c40001042e0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000802000029000000000021041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d0200003900000003030000390000069c040000410000000c05000029000000090600002918c318b90000040f00000001002001900000016e0000c13d00000dd20000013d000000000101043b000000000200001900000009040000290000000b05000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000007c20000413d0000000c0140006a0000001f01100039000006a8021001970000000c01200029000000000021004b00000000030000390000000103004039000006350010009c0000000a02000029000005930000213d0000000100300190000005930000c13d000000400010043f00000060012000390000000c030000290000000000310435000000400100043d000c00000001001d18c30e490000040f0000061e0000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000c0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000007e20000c13d000000080020006c000007f40000813d00000008020000290000000302200210000000f80220018f000006a90220027f000006a9022001670000000c033000290000000003030433000000000223016f000000000021041b0000000801000029000000010110021000000001011001bf0000000302000039000000000012041b0000000a010000290000000001010433000c00000001001d000006350010009c000005930000213d0000000401000039000000000101041a000000010010019000000001021002700000007f0220618f000b00000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000005d50000c13d0000000b01000029000000200010008c000008290000413d0000000401000039000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d0000000c030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b0000000b010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b000008290000813d000000000002041b0000000102200039000000000012004b000008250000413d0000000c010000290000001f0010008c000008780000a13d0000000401000039000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000200200008a0000000c02200180000000000101043b000008860000c13d0000002003000039000008930000013d000000400400043d000000800100043d000000000001004b0000063c0000613d0000000601000039000000000101041a000000000001004b000008840000c13d0000002001400039000000200200003900000000002104350000004002400039000000800300043d0000000000320435000000600540003900000005023002100000000002520019000000000003004b000008b20000c13d0000000002420049000000200320008a00000000003404350000001f02200039000006a8032001970000000002430019000000000032004b00000000030000390000000103004039000006350020009c000005930000213d0000000100300190000005930000c13d000000400020043f000006320010009c000006320100804100000040011002100000000002040433000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000502000039000000000012041b000000800100043d000000000001004b000008fd0000c13d0000000001000019000018c40001042e0000000c0000006b00000000010000190000087d0000613d000000090100002900000000010104330000000c040000290000000302400210000006a90220027f000006a902200167000000000221016f0000000101400210000008a10000013d00000689010000410000063d0000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000a0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b0000088c0000c13d0000000c0020006c0000089e0000813d0000000c020000290000000302200210000000f80220018f000006a90220027f000006a9022001670000000a033000290000000003030433000000000223016f000000000021041b00000001010000390000000c020000290000000102200210000000000112019f0000000402000039000000000012041b0000063801000041000000800010043f0000063902000041000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a0002004430000010000100443000000020100003900000120001004430000063a01000041000018c40001042e000000800600003900000000070000190000000008060019000008b90000013d0000000107700039000000000037004b000008500000813d0000000009420049000000600990008a00000000059504360000002008800039000000000908043300000000ba0904340000066a0aa00197000000000aa20436000000000b0b04330000000100b0008c00000dd40000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b2000390000000000ab043500000060099000390000000009090433000000600a20003900000000006a0435000000800b200039000000000a0904330000000000ab0435000000a00220003900000000000a004b000008b60000613d000000000b0000190000002009900039000000000c0904330000000002c20436000000010bb000390000000000ab004b000008d70000413d000008b60000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000008e60000c13d000000000005004b000008f70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300000000002000019000009040000013d00000006020000290000000102200039000000800100043d000000000012004b000008760000813d0000000501200210000000a00110003900000000030104330000004001300039000c00000001001d0000000001010433000000000001004b0000006004300039000009110000613d00000000010404330000000001010433000000000001004b00000e370000c13d000800000004001d000600000002001d0000002001300039000700000001001d0000000002010433000000010020008c00000dd40000213d00000000010304330000066a01100197000900000002001d000b00000003001d18c310010000040f0000000b0100002900000000010104330000066a01100197000a00000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000021041b0000000a01000029000000000010043f0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000e0e0000c13d0000000601000039000000000101041a000006350010009c0000801002000039000005930000213d00000001041000390000000603000039000000000043041b0000068d0110009a0000000a04000029000000000041041b000000000103041a000900000001001d000000000040043f0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000021041b0000000c010000290000000001010433000a00000001001d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000201100039000000000201041a000006aa022001970000000a0000006b000000010220c1bf000000000021041b000000400100043d000000200200003900000000022104360000000b0300002900000000030304330000066a03300197000000000032043500000007020000290000000002020433000000010020008c00000dd40000213d000000400310003900000000002304350000000c020000290000000002020433000000000002004b0000000002000039000000010200c0390000006003100039000000000023043500000008020000290000000002020433000000800310003900000080040000390000000000430435000000a00310003900000000040204330000000000430435000000c003100039000000000004004b0000099b0000613d00000000050000190000002002200039000000000602043300000000036304360000000105500039000000000045004b000009950000413d0000000002130049000006320020009c00000632020080410000006002200210000006320010009c00000632010080410000004001100210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000121019f0000068a011001c70000800d0200003900000001030000390000068e0400004118c318b90000040f0000000100200190000080100200003900000dd20000613d0000000c010000290000000001010433000000000001004b000008ff0000c13d000000080100002900000000010104330000000003010433000000000003004b00000e3a0000613d00000000030000190000000004000019000a00000003001d0000000503300210000000000131001900000020011000390000000001010433000c00000001001d000000000041004b00000de70000413d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff0010019000000dea0000c13d0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a000006aa0220019700000001022001bf000000000021041b0000000b0100002900000000010104330000066a01100197000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000101100039000000000301041a000006350030009c0000801002000039000005930000213d000900000003001d0000000103300039000000000031041b000000000010043f0000000001000414000006320010009c0000063201008041000000c00110021000000637011001c718c318be0000040f000000010020019000000dd20000613d000000000101043b00000009011000290000000c04000029000000000041041b0000000a030000290000000103300039000000080100002900000000010104330000000002010433000000000023004b0000801002000039000009bb0000413d000008ff0000013d0009066a0010019b00000000010004100003066a0010019b0000000002000019000800000000001d00000007010000290000000001010433000000000021004b0000000003020019000000040200002900000dda0000a13d0000000001020433000000000031004b00000dda0000a13d000500000003001d000000050130021000000000030200190000002002100039000000a00110003900000000010104330000066a0410019700000007012000290000000001010433000b00000001001d00000000013200190000000001010433000a00000001001d000c00000004001d000000000040043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000a6c0000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b00000e080000613d0000000c01000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000202100039000000000202041a000000ff0020019000000a8e0000c13d0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000ff0010019000000e080000613d0000000c01000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000600000001001d0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c00000ae00000613d000000000001004b00000dd40000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000000500000613d000000060000006b00000000010000190000000a030000290000000c0200002900000b730000c13d000000400a00043d000006950100004100000000001a04350000000401a000390000000b0300002900000000003104350000000001000414000000040020008c00000b310000c13d0000000003000031000000200030008c0000002004000039000000000403401900000b5c0000013d000000400a00043d0000002401a000390000000b020000290000000000210435000006930100004100000000001a04350000000401a000390000000302000029000000000021043500000000010004140000000c02000029000000040020008c00000af20000c13d0000000003000031000000200030008c0000002004000039000000000403401900000b1d0000013d0000063200a0009c000006320300004100000000030a40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700020000000a001d18c318be0000040f000000020a000029000000000301001900000060033002700000063203300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000b0d0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000b090000c13d0000001f0740019000000b1a0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000000003001f000000010020019000000e110000613d0000001f01400039000000600210018f00000000040a00190000000001a20019000000000021004b00000000020000390000000102004039000006350010009c000005930000213d0000000100200190000005930000c13d000000400010043f000000200030008c00000dd20000413d0000000001040433000000060110006c0000000a0300002900000de10000413d0000000c0200002900000b740000013d0000063200a0009c000006320300004100000000030a40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700060000000a001d18c318be0000040f000000060a000029000000000301001900000060033002700000063203300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000b4c0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000b480000c13d0000001f0740019000000b590000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000000003001f000000010020019000000e3d0000613d0000001f01400039000000600210018f00000000040a00190000000001a20019000000000021004b00000000020000390000000102004039000006350010009c000005930000213d0000000100200190000005930000c13d000000400010043f000000200030008c00000dd20000413d00000000010404330000066a0010009c00000dd20000213d0000000002000410000000000021004b000000000100003900000001010060390000000a030000290000000c02000029000000010110018f000000010330008a000000000013004b00000ded0000813d000000000020043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000a03000029000000000032001a00000de10000413d0000000002320019000000000021041b000000400100043d000000200210003900000000003204350000000b020000290000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d020000390000000303000039000006980400004100000009050000290000000c0600002918c318b90000040f000000010020019000000dd20000613d0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000401043b0000000a0200002900000000032400a9000000000004004b00000bc30000613d00000000014300d9000000000021004b00000de10000c13d0000000201000039000000000101041a000000000001004b00000be20000613d000a00000001001d000b00000004001d000c00000003001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000101043b0000000b0110006b0000000c0300002900000de10000413d0000000a0010006b0000000a0100002900000be20000213d000000000313004b00000de10000413d000000090000006b00000df00000613d0000000201000039000000000101041a000000000031001a00000de10000413d000c00000003001d00000000013100190000000202000039000000000012041b0000000901000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000c030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000005000019000000090600002918c318b90000040f000000010020019000000dd20000613d0000000c02000029000000080020002a00000de10000413d000800080020002d00000005020000290000000102200039000000800100043d000000000012004b00000a360000413d0000024a0000013d0005066a0010019b00000000010004100008066a0010019b0000000002000019000700000000001d00000006010000290000000001010433000000000021004b000000020300002900000dda0000a13d0000000001030433000000000021004b00000dda0000a13d000400000002001d0000000502200210000000200120003900000000033100190000000003030433000c00000003001d000000000003004b00000ded0000613d000000a00220003900000000020204330000066a0320019700000006011000290000000001010433000900000001001d000b00000003001d000000000030043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0000000c0010006c00000ded0000413d0000000b01000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000201041a0000000c0220006c00000de10000413d000000000021041b0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000401043b0000000c034000b9000000000004004b00000c870000613d00000000014300d90000000c0010006c00000de10000c13d0000000201000039000000000101041a000000000031004b00000cc50000c13d000300000004001d000a00000003001d0000000801000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b00000003030000290000000a0230006b00000de10000413d000300000002001d000000000101041a000100000001001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f000000010020019000000de00000613d000000000101043b0000000302000029000000000021001a0000000a0300002900000de10000413d0000000001210019000000010010006b000000080100002900000cc60000413d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000301041a0000000801000029000a00000003001d000000000001004b00000df70000613d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a0003000a0010007400000e010000413d0000000801000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b0000000302000029000000000021041b0000000202000039000000000102041a0000000a030000290000000001310049000000000012041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000805000029000000000600001918c318b90000040f000000010020019000000dd20000613d0000000b01000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000010010008c00000d570000613d000000000001004b00000dd40000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000dd20000613d000000000101043b000000000101041a000000000001004b000000500000613d0000000c01000029000000010010008c00000e0b0000c13d0000067b0100004100000000001004430000000b0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400600043d0000004401600039000000090200002900000000002104350000002401600039000000050200002900000000002104350000068001000041000000000016043500000004016000390000000802000029000000000021043500000000010004140000000b02000029000000040020008c00000daf0000613d000006320060009c000006320200004100000000020640190000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000b02000029000300000006001d18c318b90000040f000000030600002900000000030100190000006003300270000006320030019d000000010020019000000daf0000c13d00000e1d0000013d000000400200043d0000067a0020009c000005930000213d0000002001200039000300000001001d000000400010043f000100000002001d00000000000204350000067b0100004100000000001004430000000b0100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f000000010020019000000de00000613d000000000101043b000000000001004b00000dd20000613d000000400600043d0000008401600039000000a002000039000000000021043500000064016000390000000c0200002900000000002104350000004401600039000000090200002900000000002104350000002401600039000000050200002900000000002104350000067d01000041000000000016043500000004016000390000000802000029000000000021043500000001010000290000000001010433000000a4026000390000000000120435000000c402600039000000000001004b000000030700002900000d910000613d000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00000d8a0000413d0000000002210019000000000002043500000000020004140000000b03000029000000040030008c00000daf0000613d0000001f01100039000006a801100197000000c401100039000006320010009c00000632010080410000006001100210000006320060009c000006320300004100000000030640190000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000112019f0000000b02000029000300000006001d18c318b90000040f000000030600002900000000030100190000006003300270000006320030019d000000010020019000000e2a0000613d000006350060009c000005930000213d000000400060043f0000000901000029000000000016043500000020016000390000000c020000290000000000210435000006320060009c000006320600804100000040016002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d020000390000000303000039000006820400004100000005050000290000000b0600002918c318b90000040f000000010020019000000dd20000613d0000000a02000029000000070020002a00000de10000413d000700070020002d00000004020000290000000102200039000000800100043d000000000012004b00000c1f0000413d000005010000013d0000000001000019000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000003201000039000000040010043f0000069601000041000018c500010430000000000001042f0000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000400100043d00000690020000410000070c0000013d000000400100043d0000068f020000410000070c0000013d000000400100043d00000697020000410000070c0000013d000000400100043d00000044021000390000069903000041000000000032043500000024021000390000001f03000039000006910000013d000000400100043d000000640210003900000685030000410000000000320435000000440210003900000686030000410000000000320435000000240210003900000021030000390000044c0000013d000000400100043d00000064021000390000068303000041000000000032043500000044021000390000068403000041000007270000013d000000400100043d0000069a020000410000070c0000013d000000400100043d0000067e020000410000070c0000013d000000400100043d0000068c020000410000070c0000013d0000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e180000c13d000008ea0000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e250000c13d000008ea0000013d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e320000c13d000008ea0000013d000000400100043d0000068b020000410000070c0000013d000000400100043d00000691020000410000070c0000013d0000001f0530018f0000063406300198000000400200043d0000000004620019000008ea0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e440000c13d000008ea0000013d0000002003000039000000000331043600000000540204340000066a0440019700000000004304350000000003050433000000020030008c00000e6d0000813d0000004004100039000000000034043500000040032000390000000003030433000000000003004b0000000003000039000000010300c0390000006004100039000000000034043500000060022000390000000002020433000000800310003900000080040000390000000000430435000000a00410003900000000030204330000000000340435000000c001100039000000000003004b00000e6c0000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b00000e660000413d000000000001042d0000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c50001043000000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000e820000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000e7b0000413d000000000321001900000000000304350000001f02200039000006a8022001970000000001210019000000000001042d0000001f02200039000006a8022001970000000001120019000000000021004b00000000020000390000000102004039000006350010009c00000e940000213d000000010020019000000e940000c13d000000400010043f000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000001f03100039000000000023004b0000000004000019000006360400404100000636052001970000063603300197000000000653013f000000000053004b00000000030000190000063603002041000006360060009c000000000304c019000000000003004b00000ee10000613d0000000105000367000000000315034f000000000303043b000006ab0030009c00000edb0000813d0000001f04300039000006a8044001970000003f04400039000006a807400197000000400400043d0000000007740019000000000047004b00000000080000390000000108004039000006350070009c00000edb0000213d000000010080019000000edb0000c13d000000400070043f000000000434043600000020011000390000000007310019000000000027004b00000ee10000213d000000000215034f000006a8053001980000001f0630018f000000000154001900000ecb0000613d000000000702034f0000000008040019000000007907043c0000000008980436000000000018004b00000ec70000c13d000000000006004b00000ed80000613d000000000252034f0000000305600210000000000601043300000000065601cf000000000656022f000000000202043b0000010005500089000000000252022f00000000025201cf000000000262019f000000000021043500000000013400190000000000010435000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000019000018c500010430000006880010009c00000ef50000213d000000830010008c00000ef50000a13d00000001040003670000000401400370000000000101043b0000066a0010009c00000ef50000213d0000002402400370000000000202043b0000066a0020009c00000ef50000213d0000004403400370000000000303043b0000006404400370000000000404043b000000000001042d0000000001000019000018c500010430000006880010009c00000f820000213d000000240310008c00000f820000413d00000001040003670000000402400370000000000502043b000006350050009c00000f820000213d0000002302500039000000000012004b00000f820000813d0000000402500039000000000224034f000000000802043b000006ab0080009c00000f840000813d00000005078002100000003f027000390000066f06200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000006350060009c00000f840000213d000000010090019000000f840000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b00000f820000213d000000000008004b00000f800000613d000000000802001900000f250000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b00000f800000813d000000000964034f000000000909043b000006350090009c00000f820000213d000000000a5900190000000009a30049000006880090009c00000f820000213d000000800090008c00000f820000413d000000400900043d000006700090009c00000f840000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b0000066a00c0009c00000f820000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c00000f820000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b00000f820000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b0000063500b0009c00000f820000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000006360c008041000006360aa00197000006360d100197000000000eda013f0000000000da004b000000000a000019000006360a0040410000063600e0009c000000000a0cc01900000000000a004b00000f820000c13d000000240ab00039000000000aa4034f000000000c0a043b0000063500c0009c00000f840000213d000000050dc002100000003f0ad000390000066f0ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f0040390000063500e0009c00000f840000213d0000000100f0019000000f840000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cbd001900000000001c004b00000f820000213d0000000000cb004b00000f1e0000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b00000f780000413d00000f1e0000013d0000000001020019000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000066a02200197000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000f980000613d000000000101043b000000000001042d0000000001000019000018c500010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004460019000000000005004b00000fd10000613d0000008007000039000000000800001900000fac0000013d0000000108800039000000000058004b00000fd10000813d0000000009240049000000600990008a00000000069604360000002001100039000000000901043300000000ba0904340000066a0aa00197000000000aa40436000000000b0b04330000000200b0008c00000ff30000813d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b4000390000000000ab043500000060099000390000000009090433000000600a40003900000000007a0435000000800b400039000000000a0904330000000000ab0435000000a00440003900000000000a004b00000fa90000613d000000000b0000190000002009900039000000000c0904330000000004c40436000000010bb000390000000000ab004b00000fca0000413d00000fa90000013d0000000001240049000000200410008a00000000004204350000001f01100039000006a8041001970000000001240019000000000041004b00000000040000390000000104004039000006350010009c00000ff90000213d000000010040019000000ff90000c13d000000400010043f000006320030009c000006320300804100000040013002100000000002020433000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f000000010020019000000fff0000613d000000000101043b000000000001042d0000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000000001000019000018c5000104300006000000000002000200000002001d0000000006010019000000400100043d0000002002100039000006a60300004100000000003204350000002404100039000000000034043500000024070000390000000000710435000006ac0010009c000011e70000813d0000006003100039000000400030043f000000040060008c000300000006001d000010190000c13d0000000001020433000000000010043f0000000003000031000000200030008c000010480000813d0000105c0000013d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010330000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000102f0000c13d000000000005004b000010400000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f000000010020019000000024070000390000105b0000613d000000000100043d0000000306000029000000200030008c0000105c0000413d000000000001004b0000105c0000613d000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006ae0500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000010610000c13d0000000001020433000000000010043f000010920000013d00000003060000290000000008000415000000060880008a0000000508800210000600000000003d000010ec0000013d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000107b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010770000c13d000000000005004b000010880000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000001f0030008c00000000010000390000000101002039000000000112016f000000010010019000000024070000390000109a0000613d000000000100043d00000003060000290000000008000415000000040880008a0000000508800210000000000001004b000400000000003d000400010000603d000010ec0000c13d0000109f0000013d0000000008000415000000050880008a0000000508800210000500010000003d0000000306000029000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006b00500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000010b50000c13d0000000001020433000000000010043f000000200030008c000010e60000413d000000000001004b0000000001000039000000010100c039000010ea0000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010d00000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010cc0000c13d000000000005004b0000000108000029000010de0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f00000001002001900000002407000039000010e80000613d000000000100043d0000000306000029000000200030008c000010b10000813d0000000001000019000010ea0000013d0000000001000019000000030600002900000005028002700000000102100195000000400100043d0000002002100039000006a6040000410000000000420435000000240510003900000000004504350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011140000c13d0000000001020433000000000010043f000000200030008c000011460000413d000000000001004b0000000001000019000011c80000613d000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006ae0500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011480000c13d0000000001020433000000000010043f000000000001004b0000000001000019000011c80000c13d000011800000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000112f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000112b0000c13d000000000005004b00000024070000390000113d0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000000100200190000000000100001900000003060000290000000108000029000011c80000613d000000000100043d000000200030008c000010fd0000813d0000000001000019000011c80000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011630000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000115f0000c13d000000000005004b0000000108000029000011710000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f0000001f0030008c00000000010000390000000101002039000000000112016f000000010010008c00000024070000390000117f0000c13d000000000100043d0000000306000029000000000001004b0000000001000019000011c80000c13d000011800000013d0000000306000029000000400100043d0000002002100039000006a60400004100000000004204350000002404100039000006b10500004100000000005404350000000000710435000006af0010009c000011e70000213d0000006004100039000000400040043f000000040060008c000011940000c13d0000000002020433000000000020043f000000200030008c0000000001000019000011c50000813d000011c80000013d000100000008001d000006320020009c000006320200804100000040022002100000000001010433000006320010009c00000632010080410000006001100210000000000121019f000006ad011001c7000000000206001918c318be0000040f000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000011af0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000011ab0000c13d000000000005004b000011bc0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000003001f000000010020019000000000010000190000000108000029000011c80000613d000000000200043d000000200030008c0000000001000019000011c80000413d000000000002004b0000000001000039000000010100c03900000005028002700000000000020032000011d50000613d0000000100100190000011e30000c13d0000000201000029000000020010008c000011ed0000813d000000000001004b000011e60000613d000000400100043d000006b202000041000011dd0000013d0000000100100190000011e30000613d0000000201000029000000010010008c000011ed0000213d000011e60000613d000000400100043d000006b3020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c5000104300000000201000029000000010010008c000011ed0000213d000000000001042d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c5000104300002000000000002000100000002001d0000066a01100197000200000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000000001004b000012160000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000000001004b000012390000613d0000000201000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000201043b0000000201200039000000000101041a000000ff01100190000012290000613d000000000001042d0000000101000029000000000010043f000000200020043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f00000001002001900000123b0000613d000000000101043b000000000101041a000000ff0110018f000000000001042d0000000001000019000000000001042d0000000001000019000018c5000104300003000000000002000200000002001d0000066a01100197000300000001001d000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b0000000202000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000100000001001d0000000301000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000000010010008c000012910000613d000000000001004b0000132b0000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000013230000613d000000000101043b000000000101041a000000000001004b000013310000613d000000010000006b00000000010000190000000302000029000013210000c13d000000400b00043d000006950100004100000000001b04350000000401b00039000000020300002900000000003104350000000001000414000000040020008c000012e10000c13d0000000003000031000000200030008c000000200400003900000000040340190000130d0000013d000000400b00043d0000002401b0003900000002020000290000000000210435000006930100004100000000001b043500000000010004100000066a011001970000000402b00039000000000012043500000000010004140000000302000029000000040020008c000012a40000c13d0000000003000031000000200030008c00000020040000390000000004034019000012d00000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700030000000b001d18c318be0000040f000000030b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000012c00000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000012bc0000c13d000000000006004b000012cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000013480000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c000013250000213d0000000100200190000013250000c13d000000400010043f000000200030008c000013230000413d00000000010b0433000000010110006c000013420000413d000000000001042d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700030000000b001d18c318be0000040f000000030b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000012fd0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000012f90000c13d000000000006004b0000130a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000013540000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c000013250000213d0000000100200190000013250000c13d000000400010043f000000200030008c000013230000413d00000000010b04330000066a0010009c000013230000213d0000000002000410000000000021004b00000000010000390000000101006039000000010110018f000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c5000104300000001f0530018f0000063406300198000000400200043d00000000046200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000134f0000c13d0000135f0000013d0000001f0530018f0000063406300198000000400200043d00000000046200190000135f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000135b0000c13d000000000005004b0000136c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300006000000000002000400000004001d000500000003001d000300000001001d0000066a01200197000600000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000013970000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000015530000613d0000000601000029000000000010043f0000000901000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000202100039000000000202041a000000ff00200190000013b90000c13d0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000ff00100190000015530000613d0000000601000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000200000001001d0000000601000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000010010008c0000140b0000613d000000000001004b000015610000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000101041a000000000001004b000015670000613d000000020000006b0000000001000019000000040300002900000006020000290000149f0000c13d000000400b00043d000006950100004100000000001b04350000000401b00039000000050300002900000000003104350000000001000414000000040020008c0000145d0000c13d0000000003000031000000200030008c00000020040000390000000004034019000014890000013d000000400b00043d0000002401b0003900000005020000290000000000210435000006930100004100000000001b043500000000010004100000066a011001970000000402b00039000000000012043500000000010004140000000602000029000000040020008c0000141e0000c13d0000000003000031000000200030008c000000200400003900000000040340190000144a0000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000694011001c700010000000b001d18c318be0000040f000000010b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000143a0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000014360000c13d000000000006004b000014470000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000015780000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c0000155b0000213d00000001002001900000155b0000c13d000000400010043f000000200030008c000015400000413d00000000010b0433000000020110006c0000000403000029000015420000413d0000000602000029000014a00000013d0000063200b0009c000006320300004100000000030b40190000004003300210000006320010009c0000063201008041000000c001100210000000000131019f00000696011001c700020000000b001d18c318be0000040f000000020b000029000000000301001900000060033002700000063203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000014790000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000014750000c13d000000000006004b000014860000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f0000000100200190000015840000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006350010009c0000155b0000213d00000001002001900000155b0000c13d000000400010043f000000200030008c000015400000413d00000000010b04330000066a0010009c000015400000213d0000000002000410000000000021004b0000000001000039000000010100603900000004030000290000000602000029000000010110018f000000010330008a000000000013004b000015490000813d000000000020043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000015400000613d000000000101043b000000000201041a0000000403000029000000000032001a000015420000413d0000000002320019000000000021041b000000400100043d0000002002100039000000000032043500000005020000290000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000003020000290000066a0520019700000672011001c70000800d0200003900000003030000390000069804000041000500000005001d000000060600002918c318b90000040f0000000100200190000015400000613d0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000015480000613d000000000501043b000000040200002900000000042500a9000000000005004b0000000503000029000014f20000613d00000000015400d9000000000021004b000015420000c13d0000000202000039000000000102041a000000000001004b000015130000613d000300000001001d000400000005001d000600000004001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000015480000613d000000000101043b000000040110006b000000050300002900000006040000290000000202000039000015420000413d000000030010006b0000000301000029000015130000213d000000000414004b000015420000413d000000000003004b0000154c0000613d000000000102041a000000000041001a000015420000413d0000000001410019000000000012041b000000000030043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c70000801002000039000600000004001d18c318be0000040f0000000100200190000015400000613d000000000101043b000000000201041a00000006030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000005000019000000050600002918c318b90000040f0000000100200190000015400000613d0000000601000029000000000001042d0000000001000019000018c5000104300000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000000001042f000000400100043d0000069702000041000015550000013d000000400100043d00000044021000390000069903000041000000000032043500000024021000390000001f030000390000156d0000013d000000400100043d0000069a020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c5000104300000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c5000104300000001f0530018f0000063406300198000000400200043d00000000046200190000158f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000157f0000c13d0000158f0000013d0000001f0530018f0000063406300198000000400200043d00000000046200190000158f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000158b0000c13d000000000005004b0000159c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300008000000000002000500000003001d000300000001001d000800000004001d000000000004004b0000175a0000613d0000066a01200197000700000001001d000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000080010006c0000175a0000413d0000000701000029000000000010043f0000000a01000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000201041a000000080220006c000017540000413d000000000021041b0000066e0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000017530000613d000000000401043b00000008034000b9000000000004004b000015fb0000613d00000000014300d9000000080010006c000017540000c13d00000000010004100000066a021001970000000201000039000000000101041a000000000031004b000400000002001d0000163c0000c13d000200000004001d000600000003001d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000203000029000000060230006b000017540000413d000200000002001d000000000101041a000100000001001d0000066e01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006320010009c0000063201008041000000c00110021000000678011001c7000080050200003918c318be0000040f0000000100200190000017530000613d000000000101043b0000000202000029000000000021001a0000000603000029000017540000413d0000000001210019000000010010006b00000004020000290000163c0000413d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000301041a0000000402000029000600000003001d000000000002004b000017630000613d000000000020043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a00020006001000740000176d0000413d0000000401000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b0000000202000029000000000021041b0000000203000039000000000103041a00000006020000290000000001210049000000000013041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000405000029000000000600001918c318b90000040f0000000100200190000017510000613d0000000701000029000000000010043f0000000801000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000010010008c000016dc0000613d000000000001004b000017810000c13d0000000701000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000017510000613d000000000101043b000000000101041a000000000001004b000017870000613d0000000801000029000000010010008c000017980000c13d0000067b010000410000000000100443000000070100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f0000000100200190000017530000613d000000000101043b000000000001004b000017510000613d000000400600043d0000004401600039000000050200002900000000002104350000068001000041000000000016043500000004016000390000000402000029000000000021043500000003010000290000066a051001970000002401600039000000000051043500000000010004140000000702000029000000040020008c000017370000613d000006320060009c000006320200004100000000020640190000004002200210000006320010009c0000063201008041000000c001100210000000000121019f00000681011001c70000000702000029000400000006001d000300000005001d18c318b90000040f0000000305000029000000040600002900000000030100190000006003300270000006320030019d0000000100200190000017370000c13d00000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000017ac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016d70000c13d000017ac0000013d000000400200043d000006b40020009c0000175d0000813d0000002001200039000200000001001d000000400010043f000100000002001d00000000000204350000067b010000410000000000100443000000070100002900000004001004430000000001000414000006320010009c0000063201008041000000c0011002100000067c011001c7000080020200003918c318be0000040f0000000100200190000017530000613d000000000101043b000000000001004b000017510000613d000000400600043d0000008401600039000000a00200003900000000002104350000006401600039000000080200002900000000002104350000004401600039000000050200002900000000002104350000067d01000041000000000016043500000004016000390000000402000029000000000021043500000003010000290000066a051001970000002401600039000000000051043500000001010000290000000001010433000000a4026000390000000000120435000000c402600039000000000001004b0000000208000029000017170000613d000000000300001900000000042300190000000007830019000000000707043300000000007404350000002003300039000000000013004b000017100000413d0000000002120019000000000002043500000000020004140000000703000029000000040030008c000017370000613d0000001f01100039000006a801100197000000c401100039000006320010009c00000632010080410000006001100210000006320060009c000006320300004100000000030640190000004003300210000000000131019f000006320020009c0000063202008041000000c002200210000000000121019f0000000702000029000400000006001d000300000005001d18c318b90000040f0000000305000029000000040600002900000000030100190000006003300270000006320030019d0000000100200190000017a00000613d000006350060009c0000175d0000213d000000400060043f00000005010000290000000000160435000000200160003900000008020000290000000000210435000006320060009c000006320600804100000040016002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000672011001c70000800d0200003900000003030000390000068204000041000000070600002918c318b90000040f0000000100200190000017510000613d0000000601000029000000000001042d0000000001000019000018c500010430000000000001042f0000069b01000041000000000010043f0000001101000039000000040010043f0000069601000041000018c500010430000000400100043d00000697020000410000179a0000013d0000069b01000041000000000010043f0000004101000039000000040010043f0000069601000041000018c500010430000000400100043d00000064021000390000068503000041000000000032043500000044021000390000068603000041000000000032043500000024021000390000002103000039000017760000013d000000400100043d00000064021000390000068303000041000000000032043500000044021000390000068403000041000000000032043500000024021000390000002203000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c5000104300000069b01000041000000000010043f0000002101000039000000040010043f0000069601000041000018c500010430000000400100043d0000004402100039000006a403000041000000000032043500000024021000390000001e03000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000681011001c7000018c500010430000000400100043d0000067e020000410000000000210435000006320010009c000006320100804100000040011002100000067f011001c7000018c50001043000000632033001970000001f0530018f0000063406300198000000400200043d0000000004620019000017ac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000017a80000c13d000000000005004b000017b90000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006320020009c00000632020080410000004002200210000000000112019f000018c5000104300004000000000002000400000003001d0000066a011001980000180b0000613d0002066a0020019c000018150000613d000300000001001d000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b000000000101041a00010004001000740000181f0000413d0000000301000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b0000000102000029000000000021041b0000000201000029000000000010043f000000200000043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f0000000100200190000018090000613d000000000101043b000000000201041a00000004030000290000000002320019000000000021041b000000400100043d0000000000310435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d02000039000000030300003900000679040000410000000305000029000000020600002918c318b90000040f0000000100200190000018090000613d000000000001042d0000000001000019000018c500010430000000400100043d0000006402100039000006b90300004100000000003204350000004402100039000006ba03000041000000000032043500000024021000390000002503000039000018280000013d000000400100043d0000006402100039000006b70300004100000000003204350000004402100039000006b803000041000000000032043500000024021000390000002303000039000018280000013d000000400100043d0000006402100039000006b50300004100000000003204350000004402100039000006b603000041000000000032043500000024021000390000002603000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c50001043000030000000000020000066a011001980000186c0000613d000200000003001d0003066a0020019c000018760000613d000100000001001d000000000010043f0000000101000039000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000010020019000000003030000290000186a0000613d000000000101043b000000000030043f000000200010043f0000000001000414000006320010009c0000063201008041000000c00110021000000672011001c7000080100200003918c318be0000040f000000030600002900000001002001900000186a0000613d000000000101043b0000000202000029000000000021041b000000400100043d0000000000210435000006320010009c000006320100804100000040011002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f00000637011001c70000800d0200003900000003030000390000069c04000041000000010500002918c318b90000040f00000001002001900000186a0000613d000000000001042d0000000001000019000018c500010430000000400100043d00000064021000390000069f0300004100000000003204350000004402100039000006a0030000410000000000320435000000240210003900000024030000390000187f0000013d000000400100043d00000064021000390000069d03000041000000000032043500000044021000390000069e03000041000000000032043500000024021000390000002203000039000000000032043500000675020000410000000000210435000000040210003900000020030000390000000000320435000006320010009c0000063201008041000000400110021000000676011001c7000018c500010430000000000001042f000006320010009c00000632010080410000004001100210000006320020009c00000632020080410000006002200210000000000112019f0000000002000414000006320020009c0000063202008041000000c002200210000000000112019f0000068a011001c7000080100200003918c318be0000040f00000001002001900000189e0000613d000000000101043b000000000001042d0000000001000019000018c50001043000000000050100190000000000200443000000040100003900000005024002700000000002020031000000000121043a0000002004400039000000000031004b000018a30000413d000006320030009c000006320300804100000060013002100000000002000414000006320020009c0000063202008041000000c002200210000000000112019f000006bb011001c7000000000205001918c318be0000040f0000000100200190000018b80000613d000000000101043b000000000001042d000000000001042f000018bc002104210000000102000039000000000001042d0000000002000019000000000001042d000018c1002104230000000102000039000000000001042d0000000002000019000000000001042d000018c300000432000018c40001042e000018c5000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000ddd2935029d800000000002000000000000000000000000000000c0000001000000000000000000000000000000000000000000000000000000000000000000000000007bfe950b00000000000000000000000000000000000000000000000000000000a457c2d600000000000000000000000000000000000000000000000000000000c2ee3a0700000000000000000000000000000000000000000000000000000000dd62ed3d00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000f23a6e6100000000000000000000000000000000000000000000000000000000c2ee3a0800000000000000000000000000000000000000000000000000000000cbf1304d00000000000000000000000000000000000000000000000000000000b58d774f00000000000000000000000000000000000000000000000000000000b58d775000000000000000000000000000000000000000000000000000000000bc197c8100000000000000000000000000000000000000000000000000000000a457c2d700000000000000000000000000000000000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000086937eb30000000000000000000000000000000000000000000000000000000095d89b400000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000086937eb4000000000000000000000000000000000000000000000000000000008b878cb2000000000000000000000000000000000000000000000000000000007ccc2ec1000000000000000000000000000000000000000000000000000000007ccc2ec2000000000000000000000000000000000000000000000000000000007ddc2cd1000000000000000000000000000000000000000000000000000000007bfe950c000000000000000000000000000000000000000000000000000000007cc253700000000000000000000000000000000000000000000000000000000020e8c564000000000000000000000000000000000000000000000000000000003a51f3820000000000000000000000000000000000000000000000000000000056359ba90000000000000000000000000000000000000000000000000000000056359baa0000000000000000000000000000000000000000000000000000000070a08231000000000000000000000000000000000000000000000000000000003a51f383000000000000000000000000000000000000000000000000000000004c4c45de00000000000000000000000000000000000000000000000000000000313ce56600000000000000000000000000000000000000000000000000000000313ce56700000000000000000000000000000000000000000000000000000000395093510000000000000000000000000000000000000000000000000000000020e8c5650000000000000000000000000000000000000000000000000000000023b872dd000000000000000000000000000000000000000000000000000000000c7056b700000000000000000000000000000000000000000000000000000000150b7a0100000000000000000000000000000000000000000000000000000000150b7a020000000000000000000000000000000000000000000000000000000018160ddd000000000000000000000000000000000000000000000000000000000c7056b800000000000000000000000000000000000000000000000000000000139f11440000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000095ea7b30000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000006d81bf4000000000000000000000000fffffffffffffffffffffffffffffffffffffffff23a6e610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000800000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7fbc197c81000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000207a65726f00000000000000000000000000000000000000000000000000000045524332303a2064656372656173656420616c6c6f77616e63652062656c6f7708c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000000000000000000000008a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0200000200000000000000000000000000000044000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000000000000000000000000000ffffffffffffffdf1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000545c577100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000f341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567636500000000000000000000000000000000000000000000000000000000000045524332303a206275726e20616d6f756e7420657863656564732062616c616e730000000000000000000000000000000000000000000000000000000000000045524332303a206275726e2066726f6d20746865207a65726f20616464726573af1ad76e000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5daa87a000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000099b777de0000000000000000000000000000000000000000000000000000000033195adc0000000000000000000000000000000000000000000000000000000009addddcec1d7ba6ad726df49aeea3e93fb0c1037d551236841a60c0c883f2c12ebca503d1d899889b8a6d039632aa576bbff8cb8233491fbaece7f7773c3417403b2b67000000000000000000000000000000000000000000000000000000007c4ef3dc0000000000000000000000000000000000000000000000000000000090f22bf1000000000000000000000000000000000000000000000000000000008004ef9a0000000000000000000000000000000000000000000000000000000000fdd58e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000006352211e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000049986e7300000000000000000000000000000000000000000000000000000000dcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d745524332303a206d696e7420746f20746865207a65726f206164647265737300edcb51b1000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925737300000000000000000000000000000000000000000000000000000000000045524332303a20617070726f766520746f20746865207a65726f206164647265726573730000000000000000000000000000000000000000000000000000000045524332303a20617070726f76652066726f6d20746865207a65726f2061646445524332303a20696e73756666696369656e7420616c6c6f77616e6365000000150b7a0200000000000000000000000000000000000000000000000000000000c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000004e2312e000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa00000000000007530000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f80ac58cd00000000000000000000000000000000000000000000000000000000d9b67a2600000000000000000000000000000000000000000000000000000000185e917c00000000000000000000000000000000000000000000000000000000520b404e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffe0616c616e6365000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062657373000000000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220746f20746865207a65726f2061646472647265737300000000000000000000000000000000000000000000000000000045524332303a207472616e736665722066726f6d20746865207a65726f206164020000020000000000000000000000000000000000000000000000000000000021075256c6208e4b0222227178cfff61ecbe7936dc58d50674e8b5266c15b4f4", + "0x0004000000000002000800000000000200000000030100190000006004300270000001a40340019700030000003103550002000000010355000001a40040019d0000008004000039000000400040043f0000000100200190000000210000c13d000000040030008c0000012c0000413d000000000201043b000000e002200270000001a60020009c000000290000213d000001ad0020009c000000420000a13d000001ae0020009c0000006d0000613d000001af0020009c000000fe0000613d000001b00020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d000000000100041a000000800010043f000001be010000410000068b0001042e0000000001000416000000000001004b0000012c0000c13d000000200100003900000100001004430000012000000443000001a5010000410000068b0001042e000001a70020009c0000005c0000a13d000001a80020009c0000007b0000613d000001a90020009c0000010f0000613d000001aa0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000001b3001001980000000001000039000000010100c039000000660000013d000001b10020009c0000008e0000613d000001b20020009c0000012c0000c13d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000000001004b0000000001000039000000010100c039000000800010043f000001be010000410000068b0001042e000001ab0020009c000000f20000613d000001ac0020009c0000012c0000c13d0000000001000416000000000001004b0000012c0000c13d0000000001030019068a05700000040f068a06030000040f000000400200043d0000000000120435000001a40020009c000001a4020080410000004001200210000001b4011001c70000068b0001042e000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f00000040020000390000000001000019068a066b0000040f0000010a0000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000001b30010009c0000012c0000213d000000000010043f0000000301000039000000200010043f00000040020000390000000001000019068a066b0000040f000000000101041a000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000004000416000000000004004b0000012c0000c13d0000000404100370000000000404043b000001b50040009c0000012c0000213d0000002305400039000000000035004b0000012c0000813d0000000405400039000000000551034f000000000805043b000001c30080009c0000013c0000813d00000005068002100000003f05600039000001b605500197000001b70050009c0000013c0000213d0000008007500039000000400070043f000000800080043f00000024054000390000000006560019000000000036004b0000012c0000213d000000000008004b000002090000c13d0000002001700039000000200200003900000000002104350000004002700039000000800300043d0000000000320435000000600470003900000005023002100000000002420019000000000003004b0000026b0000c13d0000000002720049000000200320008a00000000003704350000001f02200039000001d9032001970000000002730019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002070433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000800000001001d000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000001b300100198000002c70000c13d000000000100041a000700000001001d000001c50010009c000002d20000413d00000040020000390000000701000029000001c50110012a000002db0000013d0000000001000416000000000001004b0000012c0000c13d0000002002000039000000000100041a000000800010043f000000000000043f000000000001004b0000012e0000c13d000000a0010000390000000004020019000001490000013d000000240030008c0000012c0000413d0000000002000416000000000002004b0000012c0000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001420000813d000000000000043f000001c20110009a000000000101041a000001b301100197000000800010043f000001be010000410000068b0001042e000000240230008c0000012c0000413d0000000005000416000000000005004b0000012c0000c13d0000000405100370000000000505043b000001b50050009c0000012c0000213d0000002306500039000000000036004b0000012c0000813d0000000406500039000000000661034f000000000906043b000001b50090009c0000013c0000213d00000005079002100000003f06700039000001b606600197000001b70060009c0000013c0000213d0000008008600039000000400080043f000000800090043f00000024065000390000000007670019000000000037004b000001620000a13d00000000010000190000068c00010430000000a005000039000001bf0300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000001310000413d000000410160008a000001d904100197000001b70040009c000001480000a13d000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000003201000039000000040010043f000001c1010000410000068c000104300000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000001590000613d000000a00400003900000000050000190000000046040434000001b30660019700000000026204360000000105500039000000000035004b000001530000413d0000000002120049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000068b0001042e000000000009004b000001b00000c13d0000002001800039000000200200003900000000002104350000004002800039000000800300043d0000000000320435000000600480003900000005023002100000000002420019000000000003004b000002970000c13d0000000002820049000000200320008a00000000003804350000001f02200039000001d9032001970000000002830019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f000001a40010009c000001a40100804100000040011002100000000002080433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000400200043d000001a40020009c000001a40300004100000000030240190000004003300210000000000101043b000000000101041a000001b301100198000002cf0000c13d000001bc010000410000000000120435000001bd013001c70000068c000104300000002004400039000000600a80003900000000009a043500000000008404350000002006600039000000000076004b000002c30000813d000000000861034f000000000808043b000001b50080009c0000012c0000213d00000000095800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b000001a90000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002010000413d000001a90000013d0000008007000039000002120000013d0000002007700039000000600a80003900000000009a043500000000008704350000002005500039000000000065004b000002c50000813d000000000851034f000000000808043b000001b50080009c0000012c0000213d00000000094800190000000008920049000001b80080009c0000012c0000213d000000800080008c0000012c0000413d000000400800043d000001b70080009c0000013c0000213d000000800a8000390000004000a0043f000000240a900039000000000ba1034f000000000b0b043b000001b300b0009c0000012c0000213d000000000bb80436000000200aa00039000000000ca1034f000000000c0c043b0000000100c0008c0000012c0000213d0000000000cb0435000000200aa00039000000000ba1034f000000000b0b043b00000000000b004b000000000c000039000000010c00c0390000000000cb004b0000012c0000c13d000000400c8000390000000000bc0435000000200aa00039000000000aa1034f000000000a0a043b000001b500a0009c0000012c0000213d000000000a9a00190000004309a00039000000000039004b000000000b000019000001b90b008041000001b909900197000000000009004b000000000c000019000001b90c004041000001b90090009c000000000c0bc01900000000000c004b0000012c0000c13d0000002409a00039000000000991034f000000000b09043b000001b500b0009c0000013c0000213d000000050cb002100000003f09c00039000001b60d900197000000400900043d000000000dd9001900000000009d004b000000000e000039000000010e004039000001b500d0009c0000013c0000213d0000000100e001900000013c0000c13d0000004000d0043f0000000000b90435000000440aa00039000000000bac001900000000003b004b0000012c0000213d0000000000ba004b0000020b0000813d000000000c090019000000000da1034f000000000d0d043b000000200cc000390000000000dc0435000000200aa000390000000000ba004b000002630000413d0000020b0000013d0000008005000039000000000605001900000000080000190000000009040019000002730000013d0000000108800039000000000038004b000000b80000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000200c0008c0000056a0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b000002700000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002900000413d000002700000013d00000080050000390000000006050019000000000700001900000000090400190000029f0000013d0000000107700039000000000037004b0000016f0000813d000000000a4200490000000009a904360000002006600039000000000a06043300000000cb0a0434000001b30bb00197000000000bb20436000000000c0c04330000000100c0008c0000056a0000213d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c2000390000000000bc0435000000600aa00039000000000a0a0433000000600b20003900000000005b0435000000800c200039000000000b0a04330000000000bc0435000000a00220003900000000000b004b0000029c0000613d000000000c000019000000200aa00039000000000d0a04330000000002d20436000000010cc000390000000000bc004b000002bc0000413d0000029c0000013d000000400800043d000001640000013d000000400700043d000000ad0000013d000000400100043d000001c4020000410000000000210435000001a40010009c000001a4010080410000004001100210000001bd011001c70000068c000104300000000000120435000001b4013001c70000068b0001042e0000000701000029000001c70010009c000001c60110212a00000000020000390000002002002039000001c80010009c00000010022081bf000001c901108197000001c80110812a000001ca0010009c0000000802208039000001b501108197000001ca0110812a000027100010008c0000000402208039000001a401108197000027100110811a000000640010008c00000002022080390000ffff0110818f000000640110811a000000090010008c0000000102202039000001d9012001970000005f03100039000001d905300197000000400400043d0000000003450019000000000053004b00000000050000390000000105004039000001b50030009c0000013c0000213d00000001005001900000013c0000c13d000000400030043f000000010320003900000000033404360000002001100039000001d9061001980000001f0510018f00000000010000310000000201100367000003050000613d0000000006630019000000000701034f0000000008030019000000007907043c0000000008980436000000000068004b000003010000c13d000000000005004b000000000224001900000021022000390000000705000029000000090050008c0000000a6550011a0000000306600210000000010220008a0000000007020433000001cb07700197000001cc0660021f000001cd06600197000000000676019f0000000000620435000003090000213d000000400600043d0000002005600039000001ce02000041000500000005001d0000000000250435000600000006001d0000002c056000390000000002040433000000000002004b000003260000613d000000000400001900000000065400190000000007340019000000000707043300000000007604350000002004400039000000000024004b0000031f0000413d000000000352001900000000000304350000000c03200039000000060400002900000000003404350000004b02200039000001d9032001970000000002430019000000000032004b00000000030000390000000103004039000001b50020009c0000013c0000213d00000001003001900000013c0000c13d000000400020043f0000000703000029000001c50030009c0000033d0000413d00000040030000390000000704000029000001c50440012a000003460000013d0000000704000029000001c70040009c000001c60440212a00000000030000390000002003002039000001c80040009c00000010033081bf000001c904408197000001c80440812a000001ca0040009c0000000803308039000001b504408197000001ca0440812a000027100040008c0000000403308039000001a404408197000027100440811a000000640040008c00000002033080390000ffff0440818f000000640440811a000000090040008c0000000103302039000001d9053001970000005f04500039000001d9044001970000000004240019000001b50040009c0000013c0000213d000000400040043f000000010430003900000000044204360000002005500039000001d9065001980000001f0550018f000003670000613d00000000066400190000000007040019000000001801043c0000000007870436000000000067004b000003630000c13d000000000005004b000000000132001900000021011000390000000703000029000000090030008c0000000a5330011a0000000305500210000000010110008a0000000006010433000001cb06600197000001cc0550021f000001cd05500197000000000565019f00000000005104350000036b0000213d000000400500043d0000002003500039000001cf01000041000300000003001d0000000000130435000400000005001d0000002a035000390000000001020433000000000001004b000003880000613d000000000200001900000000053200190000000006420019000000000606043300000000006504350000002002200039000000000012004b000003810000413d000000000231001900000000000204350000000a02100039000000040300002900000000002304350000004901100039000001d9021001970000000001320019000000000021004b00000000020000390000000102004039000001b50010009c0000013c0000213d00000001002001900000013c0000c13d000000400010043f000001d00010009c0000013c0000213d00000084021000390000002403100039000001d10400004100000000004304350000004003000039000000000032043500000006030000290000000003030433000000c4041000390000000000340435000000e404100039000000000003004b0000000508000029000003b00000613d000000000500001900000000064500190000000007850019000000000707043300000000007604350000002005500039000000000035004b000003a90000413d000000000543001900000000000504350000001f03300039000001d90330019700000000044300190000000002240049000000a4031000390000000000230435000000040200002900000000030204330000000002340436000000000003004b0000000307000029000003c60000613d000000000400001900000000052400190000000006740019000000000606043300000000006504350000002004400039000000000034004b000003bf0000413d0000000004230019000000000004043500000044041000390000000005000414000000600600003900000000006404350000001f03300039000001d90330019700000000021200490000000002230019000000840320008a00000064041000390000000000340435000001d203000041000000000031043500000004031000390000000000030435000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f000001a40050009c000001a405008041000000c002500210000000000112019f000001ba011001c70000800602000039068a06800000040f0000000100200190000003ed0000613d000000000101043b000000000001004b000004120000c13d00000003010003670000000102000031000003f20000013d000300000001035500000000020100190000006002200270000101a40020019d000001a402200197000001d9052001980000001f0620018f000000400300043d0000000004530019000003fd0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003f90000c13d000000000006004b0000040a0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001a40020009c000001a4020080410000006001200210000001a40030009c000001a4030080410000004002300210000000000112019f0000068c00010430000001d3020000410000000000200443000001b301100197000200000001001d00000004001004430000000001000414000001a40010009c000001a401008041000000c001100210000001d4011001c70000800202000039068a06850000040f0000000100200190000004f30000613d000000000101043b000000000001004b0000012c0000613d000000400300043d000001d50100004100000000001304350000000401300039000000200200003900000000002104350000002401300039000000800200043d0000000000210435000100000003001d000000440330003900000005012002100000000001310019000000000002004b000004f40000c13d00000000020004140000000203000029000000040030008c0000044b0000613d00000001030000290000000001310049000001a40010009c000001a4010080410000006001100210000001a40030009c000001a4030080410000004003300210000000000131019f000001a40020009c000001a402008041000000c002200210000000000121019f0000000202000029068a06800000040f00000000030100190000006003300270000101a40030019d00030000000103550000000100200190000005200000613d0000000101000029000001b50010009c0000013c0000213d0000000101000029000000400010043f0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000101041a000000000001004b0000047a0000c13d000000000100041a000001b50010009c0000013c0000213d0000000102100039000000000020041b000001c20110009a0000000202000029000000000021041b000000000100041a000100000001001d000000000020043f0000000101000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000102000029000000000021041b0000000801000029000000000010043f0000000201000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b000000000201041a000001d7022001970000000203000029000000000232019f000000000021041b000000000030043f0000000301000039000000200010043f0000000001000414000001a40010009c000001a401008041000000c001100210000001bb011001c70000801002000039068a06850000040f00000001002001900000012c0000613d000000000101043b0000000702000029000000000021041b0000008002000039000000400100043d00000000032104360000000604000029000000000404043300000080051000390000000000450435000000a005100039000000000004004b0000000509000029000004af0000613d000000000600001900000000075600190000000008960019000000000808043300000000008704350000002006600039000000000046004b000004a80000413d000000000654001900000000000604350000001f04400039000001d904400197000000000554001900000000041500490000000000430435000000040300002900000000040304330000000003450436000000000004004b0000000308000029000004c40000613d000000000500001900000000063500190000000007850019000000000707043300000000007604350000002005500039000000000045004b000004bd0000413d000000000534001900000000000504350000001f04400039000001d9044001970000000003340019000000000413004900000040051000390000000000450435000000800400043d000000000543043600000005034002100000000003530019000000000004004b0000053f0000c13d0000006002100039000000000400041100000000004204350000000002130049000001a40020009c000001a4020080410000006002200210000001a40010009c000001a4010080410000004001100210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000800d020000390000000303000039000001d80400004100000002050000290000000706000029068a06800000040f00000001002001900000012c0000613d000000400100043d00000002020000290000000000210435000001a40010009c000001a4010080410000004001100210000001b4011001c70000068b0001042e000000000001042f0000008004000039000000000504001900000000060000190000000007030019000004fc0000013d0000000106600039000000000026004b000004320000813d000000000831004900000000078704360000002005500039000000000805043300000000a9080434000001b3099001970000000009910436000000000a0a04330000000100a0008c0000056a0000213d0000000000a9043500000040098000390000000009090433000000000009004b0000000009000039000000010900c039000000400a10003900000000009a04350000006008800039000000000808043300000060091000390000000000490435000000800a100039000000000908043300000000009a0435000000a001100039000000000009004b000004f90000613d000000000a0000190000002008800039000000000b0804330000000001b10436000000010aa0003900000000009a004b000005190000413d000004f90000013d000001a4033001970000001f0530018f000001d606300198000000400200043d00000000046200190000052c0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005280000c13d000000000005004b000005390000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001a40020009c000001a4020080410000004002200210000000000112019f0000068c00010430000000000602001900000000070000190000000008050019000005460000013d0000000107700039000000000047004b000004d20000813d000000000953004900000000089804360000002006600039000000000906043300000000ba090434000001b30aa00197000000000aa30436000000000b0b04330000000100b0008c0000056a0000213d0000000000ba0435000000400a900039000000000a0a043300000000000a004b000000000a000039000000010a00c039000000400b3000390000000000ab043500000060099000390000000009090433000000600a30003900000000002a0435000000800b300039000000000a0904330000000000ab0435000000a00330003900000000000a004b000005430000613d000000000b0000190000002009900039000000000c0904330000000003c30436000000010bb000390000000000ab004b000005630000413d000005430000013d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001b80010009c000005fb0000213d000000240310008c000005fb0000413d00000002040003670000000402400370000000000502043b000001b50050009c000005fb0000213d0000002302500039000000000012004b000005fb0000813d0000000402500039000000000224034f000000000802043b000001c30080009c000005fd0000813d00000005078002100000003f02700039000001b606200197000000400200043d0000000006620019000000000026004b00000000090000390000000109004039000001b50060009c000005fd0000213d0000000100900190000005fd0000c13d000000400060043f000000000082043500000024065000390000000007760019000000000017004b000005fb0000213d000000000008004b000005f90000613d00000000080200190000059e0000013d0000002008800039000000600b9000390000000000ab043500000000009804350000002006600039000000000076004b000005f90000813d000000000964034f000000000909043b000001b50090009c000005fb0000213d000000000a5900190000000009a30049000001b80090009c000005fb0000213d000000800090008c000005fb0000413d000000400900043d000001b70090009c000005fd0000213d000000800b9000390000004000b0043f000000240ba00039000000000cb4034f000000000c0c043b000001b300c0009c000005fb0000213d000000000cc90436000000200bb00039000000000db4034f000000000d0d043b0000000100d0008c000005fb0000213d0000000000dc0435000000200bb00039000000000cb4034f000000000c0c043b00000000000c004b000000000d000039000000010d00c0390000000000dc004b000005fb0000c13d000000400d9000390000000000cd0435000000200bb00039000000000bb4034f000000000b0b043b000001b500b0009c000005fb0000213d000000000bab0019000000430ab0003900000000001a004b000000000c000019000001b90c008041000001b90aa00197000001b90d100197000000000eda013f0000000000da004b000000000a000019000001b90a004041000001b900e0009c000000000a0cc01900000000000a004b000005fb0000c13d000000240ab00039000000000aa4034f000000000c0a043b000001b500c0009c000005fd0000213d000000050dc002100000003f0ad00039000001b60ea00197000000400a00043d000000000eea00190000000000ae004b000000000f000039000000010f004039000001b500e0009c000005fd0000213d0000000100f00190000005fd0000c13d0000004000e0043f0000000000ca0435000000440bb00039000000000cdb001900000000001c004b000005fb0000213d0000000000cb004b000005970000813d000000000d0a0019000000000eb4034f000000000e0e043b000000200dd000390000000000ed0435000000200bb000390000000000cb004b000005f10000413d000005970000013d0000000001020019000000000001042d00000000010000190000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c00010430000000400200043d000000200320003900000020040000390000000000430435000000000501043300000040042000390000000000540435000000600620003900000005045002100000000004640019000000000005004b0000063a0000613d000000800700003900000000080000190000000009060019000006160000013d0000000108800039000000000058004b0000063a0000813d000000000a6400490000000009a904360000002001100039000000000a01043300000000cb0a0434000001b30bb00197000000000bb40436000000000c0c04330000000200c0008c0000065c0000813d0000000000cb0435000000400ba00039000000000b0b043300000000000b004b000000000b000039000000010b00c039000000400c4000390000000000bc0435000000600aa00039000000000a0a0433000000600b40003900000000007b0435000000800c400039000000000b0a04330000000000bc0435000000a00440003900000000000b004b000006130000613d000000000c000019000000200aa00039000000000d0a04330000000004d40436000000010cc000390000000000bc004b000006330000413d000006130000013d0000000001240049000000200410008a00000000004204350000001f01100039000001d9041001970000000001240019000000000041004b00000000040000390000000104004039000001b50010009c000006620000213d0000000100400190000006620000c13d000000400010043f000001a40030009c000001a40300804100000040013002100000000002020433000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f0000000100200190000006680000613d000000000101043b000000000001042d000001c001000041000000000010043f0000002101000039000000040010043f000001c1010000410000068c00010430000001c001000041000000000010043f0000004101000039000000040010043f000001c1010000410000068c0001043000000000010000190000068c00010430000000000001042f000001a40010009c000001a4010080410000004001100210000001a40020009c000001a4020080410000006002200210000000000112019f0000000002000414000001a40020009c000001a402008041000000c002200210000000000112019f000001ba011001c70000801002000039068a06850000040f00000001002001900000067e0000613d000000000101043b000000000001042d00000000010000190000068c0001043000000683002104210000000102000039000000000001042d0000000002000019000000000001042d00000688002104230000000102000039000000000001042d0000000002000019000000000001042d0000068a000004320000068b0001042e0000068c0001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000002000000000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000097331bf800000000000000000000000000000000000000000000000000000000d126fc1800000000000000000000000000000000000000000000000000000000d126fc1900000000000000000000000000000000000000000000000000000000f396455100000000000000000000000000000000000000000000000000000000f68790c70000000000000000000000000000000000000000000000000000000097331bf9000000000000000000000000000000000000000000000000000000009ac246870000000000000000000000000000000000000000000000000000000074449c5f0000000000000000000000000000000000000000000000000000000074449c60000000000000000000000000000000000000000000000000000000007a98742d00000000000000000000000000000000000000000000000000000000812617c70000000000000000000000000000000000000000000000000000000054af84a100000000000000000000000000000000000000000000000000000000652b9b41000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000004d827f170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5634e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d0000000000000000000000000000000000000000000000010000000000000000ce992a36000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004d61676963205661756c742000000000000000000000000000000000000000004d616769635661756c7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b010006bd265cfb8414cd1a78014372734283c20cac8d9c94c32661a6876ae1b79c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007ccc2ec20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0ffffffffffffffffffffffff0000000000000000000000000000000000000000cb0452bbe0e1599038236fd7a1588dd53cef35a83f2c1a6aeb71f42c3160b982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe053b071427d6e39e69bd15cc8fbbfbc18da99e794edeb23979325c516c8771252" + ] +} \ No newline at end of file diff --git a/deployments/zkSyncSepolia/StakingContractMainnet.json b/deployments/zkSyncSepolia/StakingContractMainnet.json new file mode 100644 index 0000000..34798f6 --- /dev/null +++ b/deployments/zkSyncSepolia/StakingContractMainnet.json @@ -0,0 +1,1690 @@ +{ + "address": "0x7273fF33d2916e371D8E8584Cd03Ef414c6Ecffc", + "abi": [ + { + "inputs": [], + "name": "AlreadySubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyUnsubscribed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "innerErorr", + "type": "bytes" + } + ], + "name": "BatchError", + "type": "error" + }, + { + "inputs": [], + "name": "FullyPacked", + "type": "error" + }, + { + "inputs": [], + "name": "IncentiveOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientStakedAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIndex", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimeFrame", + "type": "error" + }, + { + "inputs": [], + "name": "NoToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonZero", + "type": "error" + }, + { + "inputs": [], + "name": "NotStaked", + "type": "error" + }, + { + "inputs": [], + "name": "NotSubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyCreator", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + } + ], + "name": "IncentiveCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "changeAmount", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newStartTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEndTime", + "type": "uint256" + } + ], + "name": "IncentiveUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Subscribe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Unsubscribe", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "accrueRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "datas", + "type": "bytes[]" + } + ], + "name": "batch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint112", + "name": "rewardAmount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "startTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + } + ], + "name": "createIncentive", + "outputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "incentiveCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "incentives", + "outputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "rewardPerLiquidity", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "lastRewardTime", + "type": "uint32" + }, + { + "internalType": "uint112", + "name": "rewardRemaining", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "liquidityStaked", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardPerLiquidityLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeAndSubscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "subscribeToIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "unstakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "incentiveIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "ignoreRewards", + "type": "bool" + } + ], + "name": "unsubscribeFromIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + }, + { + "internalType": "int112", + "name": "changeAmount", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "newStartTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "newEndTime", + "type": "uint32" + } + ], + "name": "updateIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userStakes", + "outputs": [ + { + "internalType": "uint112", + "name": "liquidity", + "type": "uint112" + }, + { + "internalType": "uint144", + "name": "subscribedIncentiveIds", + "type": "uint144" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0x7273fF33d2916e371D8E8584Cd03Ef414c6Ecffc", + "transactionIndex": 0, + "gasUsed": "24799071", + "logsBloom": "0x00000000000400080008010000000000000000000000400000000000000000000000000000000000000000000001000000200000000000000000000000000000000100000000040000000028000040000c00000000000000000000000000080400000000020100000000000000000800000000000000400000000010000000000000001000000000000004000100100000000100000000000000000000000080800000200000100000000000800102000000000000000080002000010000000000000002108000010000000000000000000010000100000000000000000020000200000000010000000000000000000000000040000000000000000080000000", + "blockHash": "0xd6aea37fbd0bde1ffe6602151bf36e7a97a1abb3b8c00f9d2b556bed06c09492", + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 3909481, + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x00000000000000000000000000000000000000000000000000063fbb358aff80", + "logIndex": 0, + "blockHash": "0xd6aea37fbd0bde1ffe6602151bf36e7a97a1abb3b8c00f9d2b556bed06c09492" + }, + { + "transactionIndex": 0, + "blockNumber": 3909481, + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ef07c4aaa836cdf5830159d9416a5c55917ecfb4a2738804f2fe8c651dbdba39f", + "logIndex": 1, + "blockHash": "0xd6aea37fbd0bde1ffe6602151bf36e7a97a1abb3b8c00f9d2b556bed06c09492" + }, + { + "transactionIndex": 0, + "blockNumber": 3909481, + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0xf07c4aaa836cdf5830159d9416a5c55917ecfb4a2738804f2fe8c651dbdba39f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004ec2051f00000000000000000000044e0010009c0000044e010080410000000100200190000000000101043b000000c00110021000000000010004141134112a0000040f000000200010043f0000081a0000613d00000467011001c70000801002000039000000000010043f000000000101041affffffffffffffff000000400100043d000000000020043f0000081a0000213d000000000112019f00000000010004110000081a0000c13d0000000e02000029000000000001004b000000400110021000000003010000390000000000210435000000000202041a0000000000320435113411250000040f0000113600010430000000000223019f00000001020000390000000d020000290000000201000039000000000003004b0000046302200197000000010010008c000000000002004b0000044e03300197000000000021041b0000081a0000413d000004641010012a0000000002230049000000000113019f0000000c020000290000800d020000390000044e020080410000044e0020009c000000000012041b00000000010004160000000004000039000000000034004b00000003030000390000800b0200003900000471011001c700000000001004430000047001000041000b00000001001d000000c002200210000000000200041400000f510000613d000000000121019f000007bf0000013d000000000010041b000d00000001001d000000000001042d00000000030100190000044e030080410000044e0030009c00000000004304350000000005000039000000000454019f000000800440021000000000030000390000000a0300002900000004010000390000000401c003700000000d0300002900000001030060390000001f0030008c000000000100043d000100000003001f0000000000140435000000000161019f00000000015101cf000000000151022f0000010005500089000000000656022f00000000065601cf00000000060404330000000305500210000000000141034f000000000047004b0000000007870436000000006806043c0000000007000019000000000601034f000000200030008c00000060033002700000000103000031000000000201041a000000040020008c000001440000613d000008b60000213d000004640020009c000011350001042e000000000201043b0000000002240049000000090200002900000d410000613d000004642020012a0000047302200197000000200220021000000000056500d900000464052000d100000000022500d900000000055700a900000000060004110000000e01000029000000000032004b0000047f011001c7000000000521004b000000a003300270000a00000001001d000000000202043b0000045f0000c13d000004630010009c000e00000001001d0000000001120049000000000012043500000007010000290000047b011001c7000000000400041100000f520000613d000000000200001900000090022002100000000d010000290000000a02000029000000040120003900000002012000390000000102200039000000000023041b000000000232019f000000000005004b000c00000001001d000000000301043b0000000001000039000000000343019f0000008003300210000300000001001d00000024021000390000000001010433000000000031043500000024031000390000047602600197000004750060009c000800000001001d00000004021000390000000e050000290000047501100197000000000045004b000000000042004b000000000303041a113411180000040f000000000100041a000c00000002001d0000002401c003700200000000000000000010850000613d0000047e011001c70000000b0200002900000000020204330000000a0100002900000020044001900000001f0540018f0000000004034019000000200400003900000000004204350000000c0100002900000044021000390000048004000041000000000254016f00000001050020390000000104006039000000c003300210000000000300041400000004031000390000047a0300004100000479011000d1000004780040009c000000000454004b0000000105004039000000000434004b00000000044300190000047704600197000000010660208a00000477056000d1000004774640012a000004770530019700000080053002700000000003006019000004720060009c0000000b030000290000044e0260019700000000050000190000009002100270000000070200002900000006020000290000000001000019000000240030008c0000049f01000041000000040010043f0000049e01000041000000000043004b000000010200002900000001010000390000004401c00370ffffffff0000000000000000ffffffff000000000001042f000000400130021000000464023000d1000004b30010009c000200000001001d000000020200002900000000001304350000000100100190000000000141016f00000d400000613d00000001040020390000000101006039000008b60000c13d0000046e0010009c000000400300043d0000047403300197000000000056041b0000000005570019000000000706041a00000003066000390000046407400197000000200430027000000020030000390000001f0550019000000020045001900000000005034019000000200500003900000008010000290000000003020019000004b30020009c000000000013041b0000047403400197000000000556001900000464073001970000002003400270000000900640027200000000010440190000000001030019000000000401043b000900000002001d000000000224019f0000000c0500002900000473033001970000002003300210000004320000213d000000800010043f000b00000002001d000000000404041a000000000020041b0000009006300272000000000103401900000000010400190000044e04300197000900000001001d000700000002001d0000046403100197000700000001001d000004640010009c000000000012004b000000000000ffff0000047d0200004100000dba0000413d000008b60000413d000c0000002100530000081a0000013d0000000c04000029000004780030009c0000000002210049000004640120012a000000000343004b0000000104004039000000000323004b00000000033200190000047703500197000000010550208a00000477045000d1000004773530012a00000477042001970000008004200270000000000200601900000000020100190000000b060000290000046f01100197000000000112022f000000700220027000000018012000c900000005010040390000000601000039000100000002001d00000afb0000413d0000048c011001c70000000e040000290000046d0010009c0000000001030433000004640030009c000009080000413d0000046c0010009c0000046b0010009c0000000000230435000000000058041b000000000608041a000000020110036700000006030000290000000d050000290000000004e4016f0000044e040080410000044e0040009c000000000054004b00000464011001970000000203000039000e00000003001d00000485011001c700000464033001970000007002200210000000000301041a000000000021004b000000800100043d0000000703000029000200000002001d0000000502200210000004870020009c0000081a0000813d1134109f0000040f0000000c0000006b000004720050009c00000008030000290000044e0250019700000000020004110000000402c003700000046402100197000500000002001d000100000001001d0000046a0010009c000000010100c039000000640030008c00000024000000007fffffffffffffff00000020000000005452414e53464552ffffffffffff00000000000400000000020000020000000000000000000100000000ffffffffffff000011060000613d0000108f0000613d000000040200002900000004080000290004000000000002000004ae02000041000400000001001d000008150000013d0000000f030000390000047c0300004100000014030000390000049903000041000000c00340021000000464032000d1000000000018041b0000047602200197000004750040009c0000000b04000029000000030020006c000000060220002900000000023200d9000004640330019800000000033200d900000479032000d100000002022000b900000002011000b9000004640330012a00000004032000b900000004433000b900000004021000b900000004322000b9000000050000006b000c00000008001d00000003085000390000000401000029000300040000003d0000049a0030009c000000040110003900000000030304330000000302000029000000000403041a00000009010000290000004002300039000400000002001d00000004030000390000000d0600002900000009030000290000000b05000029000004630210019700000000040004140000000402300039000000240230003900000497022001970000002003200270000004640430019700000d460000013d000300020000003d000300010000003d0000047a020000410000078a0000413d0000000d040000290000000001130049000004640130012a00000060022002100000004002100039000000a0040000390000000105500039000004fa0000613d0000000002000410000000000006004b0000049a05002041000000200e00008a0000044e011001970000000303100039000004870040009c000002220000013d00000486040000410000000002320019000004840440019700000058043002700000046f0220019800000008020000290000000c03000029000000000334004900000003011000390000044e042001970000046400100198000005010000c13d0000081c0000813d000000a0011000390000081f0000a13d0000000004000019000004690020009c000600000002001d00000000044c034f000000040420003900000023042000390000000e0220002900000000022c034f00000000020004160000048104000041000004690010009c000004680110019700000006023000290000074a0000813d0000000b0010006b0000044e02100197000000200020043f000004690000813d0000000202000039000000010020008c000000000200041a0000001201000039000800000002001d00000004013000390000046301100197000000000103041a0000006401c00370000000840030008c000000a00010043f000e00000002001d000400000003001d000600000001001d000000440030008c00000020010000390000078a0000013d0000000103000039000000000102041a000000040030008c000000800d00003911dfc52958a1290c2baf2e14b443d9c563485b42b77d74f5ce932d6d97084c2179d93f4900000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf265d9354485000000000000000000000001d06ff88e000000006df327edd2cc811c3d7b930eb066a0e6e5d66ab10df69b6f390b1276974b9463237e6c280000000000000064000000800000000400000080ea4a6a6b00000000462da02177f2a1beb90a9288dd10822f7bfa1bc6b35c8ed88eabfc2cee883d310000008000000000fffffffffffffeff0000000001000000085712170000000063df817100000000172f94ce000000001d0cfdb14dff0228b14c56f887b41ad734cb422145b37c590caf3cdf1c8646c04e487b7100000000b4fa3fb3000000007cb22efb552b712a18b4318cf9a79082053748381ba1d4e551703ddde1b61a1d00000060000000008000000000000000494c4544000000005f46524f4d5f464123b872dd0000000047bc7cc80000000000007fffffffffffffff8000000000000000800000000000039f2e1800000000dfa8318d00000000bbfd9e31000000005fd8a1320000000043590000000000005245454e5452414effffffffffffff7fffffffffffffffe0947bd79cdc4695c1a8f85ca3be88f5cd89d22fc98f1c6c671dd3c6bbd98f0e82ffffffffff000000000000ffffffffff0000004000000080289ea4db381f85f7a971babf0b519848616c5196ee8b2ecf99039fcf0a98f484c522be0bc544f303e13656b9ed16526007c1bf935e34a6673ed1528b0fdc7c52000000640000000008c379a0000000005f4641494c4544000000004400000000a9059cbb00000000fffefffffffffffffffffffefffffffffffffffffffffffe08cc6b5d955391325d622183e25ac5afcd93958e4c903827796b89b91644bc980000000000ffffff00000100000000000100000000000000000000010000000000000000000001000001000000000000ffff0000000000000000004000000000000000200000008000000100000000800000000022e0772c000000001e897afb00000000069def880000000058ff9fe50000000045a2cab10000000064721191000000005eac6239000000005eac62380000000045a2cab000000000862d2d7c0000000073455b9f00000000711c316b00000000cc4010580000000093d1692f00000000e1a472b900000000e121c10200000000e121c1010000000093d1692e00000000711c316a00000040000001000000000200000000000011340000043200001132002104250000112d002104230000112800210421000011230000613d000004b601000041000010ec0000613d000010db0000c13d000010df0000613d000000000131019f0000004003300210000010ee0000013d000010c70000c13d000004980100004100000024013000390000004401300039000010ff0000613d000010fe0000613d0000800202000039000004b5011001c700000004001004430000000000200443000004b402000041000200000000000200000004050000290000105f0000613d0000104e0000c13d000010520000613d000010610000013d0000103a0000c13d00000002040000290000000201100039000000030100002900000000012100a9000010850000213d000010070000013d00000fff0000c13d00000000032100a900000000432300a900000464022001970000000302200039000010870000613d000200000003001d00000fb60000813d00000fb60000213d00000fb50000013d000000010600002900000fb80000613d000000000308041a00000fae0000a13d00000fae0000413d0000000203000029000000030600002900000fb70000613d00000002021000390000048d0200004100000f5b0000a13d000004830030009c0000028d0000013d00000dbe0000413d000000040020006c00000f1e0000613d00000003022000b900000f410000c13d00000eeb0000613d00000eda0000c13d00000ede0000613d00000eed0000013d00000ec70000c13d00000003011000b900000f1e0000013d00000f1b0000c13d00000f110000c13d00000005032000b900000005433000b900000e950000013d00000e8e0000c13d00000005021000b900000005322000b900000e530000613d0000000302000039000000640100003900000e130000813d00000e130000213d00000e110000013d00000e0b0000a13d00000e0b0000413d0000000501000029000400040000003d0000046d0020009c000004a0040000410000001802200270000000000242016f0000001804400210000000000332016f000004750330027f0000047404006041000000000445019f000004740530027f00000000045401cf000001000530008900000018033000ca0000000603300089000000000400c019000000010400008a0000049a0300004100000da50000213d000000050030008c00000070021002700000009003100270000000000001041b11340fbe0000040f00000d630000c13d00000d5b0000813d00000d5b0000213d000008170000013d0000049c040000410000049b011001c7000000a001100270000000000024043500000020043000390000044e0220019700000d130000613d00000d020000c13d00000d060000613d00000d240000c13d00000ce70000613d00000cd60000613d00000cc50000c13d00000cc90000613d00000d150000013d00000cee0000c13d0000000003430049000000000405801900000464053001970000000003300089000006ac0000013d00000aff0000413d000000000014041b000000060220006a000000000104041a0000000b023000fa00000000022300d900000c630000613d00000479022000d100000c630000013d00000c600000c13d000004640230012a00000c560000c13d00000b580000613d000004640110019800000c830000c13d00000bef0000613d00000bde0000c13d00000be20000613d00000bf10000013d00000bcb0000c13d00000b990000013d00000b920000c13d00000c150000613d000c00000009001d00000b550000813d00000b550000213d00000b550000013d000000000059041b000000000609041a000000000408041a0000000d0800002900000b4d0000a13d00000b4d0000413d000000030950003900000db90000013d00000db30000813d0000046c0020009c000400020000003d0000046b0020009c0000046a0020009c000400010000003d0000048e0200004100000f550000c13d00000aa60000813d00000aa60000213d000001ef0000013d0000090c0000413d00000a690000613d00000a8c0000c13d00000a360000613d00000a250000c13d00000a290000613d00000a380000013d00000a120000c13d00000a690000013d00000a660000c13d00000a5c0000c13d000009e00000013d000009d90000c13d0000099e0000613d000009610000813d000009610000213d0000095f0000013d000009590000a13d000009590000413d00000d590000013d000000070600002900000d510000a13d00000d510000413d000000110100003900000c920000c13d000004910030009c00000d240000413d000004aa011001c70000000007000411000004a904000041000004a8011001c7000000200210003900000060021000390000000502000029000000000242019f0000049404400197000000a00440021000000000040404330000000404000029000004a7044001970000000203100039000004a6044001970000000103100039000004a6033001970000000000010435000000e00130003900000020023000390000006002300039000004960100004100000080023000390000000b01000029000000a002300039000000c002300039000000400010043f0000010001300039000004a50010009c00000032010000390000049d02000041000001630000c13d000004af04000041000007f50000613d000007e40000c13d000007e80000613d00000afa0000013d00000af40000813d000004a202000041000004a102000041000008bc0000c13d0000000003002019000000ff0040008c0000046f033001970000000b0340024f000000180010008c0000000d012000fa000007960000613d000e0018001000cd000a00000002001d000b00000004001d000007bd0000813d0000000d0030006b0000000503004039000000060300003900000aa40000013d00000a9c0000a13d00000a9c0000413d000004a30200004100000cd80000013d00000cb10000c13d0000049802000041000000000400041000000044023000390000000003430019000008b00000613d0000000d0000006b000008b00000213d000004960030009c0000044e03200197000000a0021002700000049502200197000000000203041a0000049401100197000000a0011002100000000b010080290000071d0000013d000007080000c13d0000000b0000006b00000476011001970000000c020080290000000c0010006b000007030000613d000c044e0010019c00000006060000290000000a030000390000048a03000041000009070000013d000009010000813d000006ea0000013d000006ec0000813d000006ec0000213d000007f70000013d000007cf0000c13d000004630330019700000001030000290000000003000411000007c50000813d000008b60000813d000007840000813d0000004402400039000000000002043500000000022300190000001f04200039000006890000413d000000000025004b00000020055000390000000000760435000000000707043300000000075400190000000006350019000006900000613d00000044031000390000000002050433000004b202000041000005140000013d000005320000413d000000060020006c0000064b0000613d0000063a0000c13d0000063e0000613d0000064d0000013d000006270000c13d00000000011200a9000005f50000013d000005ed0000c13d00000000031200a900000000431300a9000c00000003001d0000058d0000813d0000058d0000213d0000058d0000013d000000000019041b000000000409041a0000000a09000029000005850000a13d000005850000413d000b00000008001d00000003087000390000000d070000290000000c06000029000d00000002001d000000010210008a000000050120002900000493020000410000000002120049000005200000413d000000000035004b00000000026204360000000046040434000005250000613d000000800300043d00000000022104360000002002000039000005310000c13d000000060000006b0000050d0000c13d000000000024004b0000000004540436000000001501043c000000a002200039000005110000613d0000001f0320018f000000800030043f000000400030043f00000080033000390000048b02000041000004700000413d0000000c0050006c0000067c0000613d0000000000670435000000000696019f00000000066801cf000000000868022f0000010006600089000000000808043b000000000969022f00000000096901cf00000000090704330000000306600210000000000881034f0000001f06600190000004e90000c13d00000000007a004b000000000aba0436000000009b09043c000000000a040019000000000901034f000004ed0000613d00000000078400190000000008e601700000000004650436000000400040043f000004320000c13d0000000100700190000000010700403900000000070000390000000004450019000000400500043d0000003f044000390000001f04600039000004320000813d000004b10060009c000000600500003900000000040d00190000044e064001970001044e0040019d00000060044002700000000004010019000000010220018f000000020c00036700000000030000310000000b0f0000291134112f0000040f000000c0035002100000044e050080410000044e0050009c00000040034002100000006001b002100000044e0b0080410000044e00b0009c000004cf0000013d0000000106000031000004b90000c13d000000000500041400000000000504350000000005b400190000000000650435000000000686019f00000000067601cf000000000676022f0000010007700089000000000606043b000000000878022f00000000087801cf00000000080504330000000307800210000000000676034f000004b00000613d0000001f08b001900000049f0000c13d000000000059004b0000000009a90436000000008a08043c0000000009040019000000000806034f000004a30000613d0000000005740019000000400400043d0000000007eb017000000000064c034f000000000605c0190000049a0080009c0000049a060040410000000006000019000000000067004b000000000867013f0000049a074001970000049a0650019700000020044000390000000005b300490000048700b0009c000000000b02043b00000000024c034f0000000e04200029000000000504c0190000049a0070009c0000049a04004041000000000056004b000000000756013f0000049a062001970000049a05400197000000430440008a0000000502500210000d00000005001d0000000004f30049000b0000000f001d000004ac010000410000049d01000041000004ad01000041000000c40010043f0000048a01000041000000a40010043f0000000a01000039000000840010043f0000047d010000410000046501000041000001600010043f0000009001200270000001400010043f0000002001200270000001200010043f0000044e01200197000001000030043f000000e00010043f000000a001400270000000c00010043f00000463014001970000046301500197000000000505041a000000010510003900000002041000390000004101000039000005040000a13d000004890030009c00000488033001970000003f03200039000000000030041b000000010030008c000000000300041a0000000504200029000500240020003d000600000004001d000000000404043b0000048f020000410000074d0000c13d000000010130008a000002a80000413d000000070040006c00000001044000390000000904000029000000000015041b000000000105041a00000f580000813d0000046e0030009c00000ae70000613d0000047603700197000003460000813d000000000053004b000003460000213d000004750070009c000003460000013d000000000029041b000000000334019f0000047404500197000000000061041b0000000006670019000000000701041a00000000067600d900000464063000d100000000033600d900000000066800a9000004640840019700000020045002700000009007500272000000000509041a0000000c090000290000033e0000a13d000000000632004b0000033e0000413d000004720070009c00000000020540190000000002040019000000000501043b000000a0022002700000044e037001970000000b070000290000040e0000613d0000000002030019000000010140008a000e00000004001d00000000040104330000000501400210000900000004001d0000801003000039000000000041004b000002220000613d000000020500002900000aea0000813d0000046803100197000500000003001d000006d10000c13d000000010300c0390000006402c003700000024d0000413d00000020022000390000000003530436000000000505043b00000000052c034f000000a003000039000002530000613d00000000042400190000002402200039000000800050043f000000400060043f0000008006600039000004890060009c00000488066001970000003f064000390000000504500210000004870050009c000000000504043b0000004402c003700000046d0000c13d000e002400f0003d0000000402f000390000002302f000390000048700f0009c000000000f02043b0000046601000041000008160000013d0000000105000029000006c70000813d0000000101000029000004ab02000041000008250000413d000004a40010009c00000001011000390000000a0020006c0000000b02008029000004690000613d0000008401c00370000000a40030008c11340f760000040f0000000104000039000000010310008a000004540020009c000004380000613d000004530020009c000006d80000c13d000006c00000a13d000006c00000413d000000000605001900000009050000290000000202300039000600000003001d0000052e0000c13d000000000013004b000d00000003001d00000492023001970000000001006019000004910100004100000490003001980000045d0020009c000004110000613d0000045c0020009c00000482010000410000007001100270000000800020043f000004630020009c0000002402c00370000004590020009c000003ad0000613d000004580020009c000002240000613d000004570020009c000004b002000041000006a40000813d000000060230006c000004620020009c000002080000613d000004610020009c000002000000613d000004600020009c000002040000013d00000024022003700000000e0200035f000e0000000c0353000004560020009c000001a80000613d000004550020009c0000014a0000213d000004520020009c000000c40000a13d000004510020009c0000044f01000041000001200000044300000100001004430000069d0000813d000007bd0000613d00000070041002720000045f0020009c000001670000613d0000045e0020009c000000e70000213d0000045b0020009c0000007e0000a13d0000045a0020009c00000000013c034f000000610000213d000004500020009c000000e00210027000000000010c043b0000044e03100197000000570000c13d0000004000d0043f0000044e0010019d000000600110027000000000010c001900020000000c0355000000000c01034f000e0000000000020003000000000002051e051d051c051b051a0519051801ec051700030516051501eb002805140513051205110510050f050e050d050c050b050a0509001401610028003100160014004c0004007f007e001100a60004004000d8006a00250092016000a50115001400a40024007d0021003f0013000c004b00080006000100020005000a000b00070003000900040015001000080006000100020005000a000b000700030009006a01ea05080507015f050601e901e800310016001400d7003f01e7050505040503006905020501050004ff04fe04fd04fc001401e60028003100160014004c0004007e0011000c0018000804fb00a304fa04f9007c0010000800a304f804f704f604f504f404f3001401610028003100160014004c0004015e007e001100a6000401e50114001100d8006a002500920160015d0115001400a40024007d0021003f0013000c004b00080006000100020005000a000b000700030009000400d6001000080006000100020005000a000b00070003000900040113000d011201e404f204f1000f04f0003e04ef04ee04ed04ec04eb001401e60028003100160014004c0004007e001104ea007c01e304e90011000c004b000800a300150010000800a3000d015c04e804e701e204e6006904e504e404e3001401e1002800310016001400a6009104e204e104e004df003d015b007c01e304de04dd001400d8000400900001001101e0000400390001001100a40024007d0021003f0015001000080006000100020005000a000b000700030009009101df01de015a011504dc01dd04db04da0111001a01dc007b000d01100038003700060001000200050036003500070003003c04d901590158007a010f009100d5010e010d04d8015704d7007904d6004a00a2010c04d500d4000c01db00d300d2001d04d404d304d2001400d10028003100160014004c000401da01d9007d01d8010b04d104d0010a00d501d7000c01d600a304cf00d7003f00d0006904ce0028003100160014004c0004007f007e001100a600040040007e001100d8000400900114001101e0000400390001001104cd0004007b0001001100a40024007d0021003f015604cc0038003700060001000200050036003500070003003c000401d501d404cb010904ca01d3001f01ea04c90030011004c804c7000f04c6003e01610028003100160014004c0004015e007e001100a6000401e50114001100d8006a002500920160015d0115001400a40024007d0021003f04c500cf01550013000c004b00080006000100020005000a000b000700030009000400d6001000080006000100020005000a000b00070003000900040113000d011201e401d20068006701d1001200ce003001d004c4000f00cf0019000100020017003b002f002e003a00120078002d003401cf04c304c200310016001400d7000d010804c1006900d1002801ce00250014015b04c004bf001104be0077015404bd01cd007c00a50153001104bc002c015201cc00770011015604bb00d0006901e10028003100160014004c0004007f007e001100a600040114001104ba007c0153001101cb0033015401ca01c904b904b8010704b704b604b504b4010704b304b204b104b004af00330011008f04ae04ad04ac04ab04aa04a900a104a804a7007c0025004904a60077001401da01d904a501d8010b015c007601c801550013000c004b00080006000100020005000a000b0007000300090004001500230151001000080006000100020005000a000b00070003000900040113000d011204a401d20068006704a3008e0150008d01c704a2000f00cf0019000100020017003b002f002e003a00120078002d003401cf04a10075001c00030009001f010b014f0113001604a001c6014f049f049e01c5049d049c01c4049b0021003f049a0499001a014e01c30013000c001800080006000100020005000a049800070003000900040015001000080006000100020005000a000b0007000300090004000d001601c20076000c002100080006000100020005000a000b000700030009000400400013000c004b00080006000100020005000a000b00070003000900040020008c01dc001a0023001000080006000100020005000a000b0007000300090004000d01c104970020008b000d007b008a0090000d00390038003700060001000200050036003500070003003c049604950089049401c0049300a0049204910490008801bf048f048e048d048c048b048a006601be04890488048704860485048404830482048101be010601050480047f001e047e047d047c047b047a04790478008e01bd008d000d00400013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b0007000300090004002000270013000c004b00080006000100020005000a000b000700030009000401bc001a0023001000080006000100020005000a000b0007000300090004001501bb0477014d04760104047501ba01b90103014c014b008e0027047400cd01b800680067009f0087001204730006000100020005014a002d003401b7009e0075001c00030009001f010b047204710470046f01b600d10028003100160014004c009100a40024007d0021003f046e001f001a014e01d701490013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b0007000300090004000d001601c20076000c002100080006000100020005000a000b000700030009000400400013000c004b00080006000100020005000a000b00070003000900040020008c00a5001a0023001000080006000100020005000a000b0007000300090004000d01c1046d000f046c003e00d1002801ce00250014015b007c0153001101cb0033015401ca01c9046b046a01b50011046900cf015204680033001104670466007d01480465046404630462046100d4000c046000d300d2001d00d10028003100160014004c0004000c0021000800a3009d001a01b400a2045f010a045e045d000d01de0108045c01e2045b045a045901b304580457045604550454014704530452045104500069044f010801e7044e044d044c044b044a0449001d044801080447001d01b200cc044604450444044301cc01cd007c044204410440043f043e00cc01b100a101c6043d043c043b008f0009043a04390438043700110436043504340433043204310430042f014600cc01b1042e042d01b00014042c042b042a0429042804270426042504240423042204210420041f041e041d041c041b041a0419041804170416041504140413041201af006504110410001f040f040e040d040c01450144040b002b040a04090408002b0407040601b201ec04050404040304020401040003ff01b003fe03fd01ae03fc03fb03fa014303f9014303f803f7014603f603f501b5010703f403f303f203f103f003ef03ee03ed03ec03eb03ea03e903e803e701ae03e603e503e403e303e203e103e003df03de03dd03dc002503db014201ad03da03d901b6000f03d8003e03d703d6014103d503d4002503d303d201ac03d103d003cf03ce002203cd03cc00d7003f03cb000f03ca03c9001b01ab002203c801ac00cc03c703c601ad03c503c403c3002f002e01aa00010002001700120069000f03c2003e008601020152011103c1007f0140000403c001e900a2007701c3000c002100080006000100020005000a000b000700030009006a008b009c000d003903bf008a007b000d00900038003700060001000200050036003500070003003c03be00cb00ca007a002601010033010000ff00c903bd03bc03bb03ba007903b903b803b700fe0066002a00fd00fc0074007300720071013f00fb013e002a0070006f00fa001e001203b603b5009b004a03b400a103b3009a003d00f9007601400004007f0013000c004b00080006000100020005000a000b00070003000900040020008c001a0023001000080006000100020005000a000b0007000300090004000d00400013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b00070003000900040064002500850088014700ca00a203b2002a00f800f700c803b100c70048004700c600c50048004700c400a000c300c200c103b000c0004600bf00be03af01a903ae00bd00110029006e03ad002901a800bc00400013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b0007000300090004002c002700f60064000f009901a7004500bb009800ba0084004500b90023006503ac0097000c0063001f03ab0001000200170044004300b8002b0083001c004200620026006100f500f400f303aa0060005f005e005d005c03a900f203a8005b005a005900580057000400560055005400530052005100500024003200b7004f004600b600220049004e000f0003006d00b5001e0003006d00200019000100020017003b002f002e003a00120078002d003400b4009e0075001c00030009014f006c014e01c5008201c4004d0098008c03a703a603a5000f03a40019009d00f1001b03a30099013d03a2002503a100cc03a0039f039e039d039c039b039a03990143039803970396002f002e01aa0001000200170012001d013c014801a6013b0395003401e801c7039401d1001200ce003001d00393000f00960141001b01a50019009d0392001b003b03910390014901eb038f001f0097000c0063038e009b038d0077038c009a003d038b01a4015f013a013c01a3013a013b038a00180389000f00b30388001b0096038701a2006b00f000ef0074007300720071038600ee00ed00ec00eb006b0070006f00ea001e00120089003000b2038503840038003700060001000200050036003500070003003c000401d503830382004a01df0381003d00f90380037f0082000d037e0038003700060001000200050036003500070003003c000401d4037d037c037b0150037a0379003d00f9037803770089001a01c0003301d3004d0376037503740373004d01a101a0014b037201390067019f01060105001e004a008d00e9037100b1019e037000b1036f013d019d008400b1019c019b0065036e001f0138000c0063036d000f036c003e0020008b000d0110008a007b000d00390038003700060001000200050036003500070003003c019a01590199007a010f009100d5010e010d0157036b0079036a004a00a2010c0066006b00f000ef0074007300720071019800ee00ed00ec00eb006b0070006f00ea001e001203690137019701a600e8036803670366036503640363008803620016036100150360035f00e70013000c001800080006000100020005000a000b00070136035e035d035c035b01490003000900040015001000080006000100020005000a000b0007000300090004000d0016035a000f0359003e000f035800190001000200170135001d01a4015f0134013c01a30134013b035700180356000100020017002f002e003a001200830015001c004200620026006100b000af00ae00ad03550060005f005e005d005c0354008f0353005b005a005900580057000400560055005400530052005100500024009200e6004f003200e500220049004e000300e400e3002b00e200e4000f00cf0019000100020017003b002f002e003a00120078002d00340352009e0075001c0003035100d0001d000f0350003e00d4000c034f00d300d2001d0088002c0155000f009c034e01070158034d034c034b00b201c80081034a03490111008103480347015d0081034600ac0196008101950088015100810345007601330081001300e10344009503430194000c002100080006000100020005000a000b00070003000901bc00ab00230004014d0342001e002700d600ab00230341019303400103008d00e000ab0023033f0193033e0103033d033c033b033a0339008d033800ab01b4008d019200ab00870141019101060105008e015001910026008e01900027000f0337004a001b01ab00ca001b033601bd001b006c0019000100020017003b002f002e003a00120335002d01970334009e01980333001c0003000900d7003f000f006c001900010002001703320069004d018f0331004d0330032f00d4000c032e00d300d2001d0076000c002100080006000100020005000a000b000700030009006a008b000d009c0111008a0110000d00390038003700060001000200050036003500070003003c019a01590158007a010f009100d5010e010d0157032d0079032c019900a2010c0066006b00f000ef0074007300720071032b00ee00ed00ec00eb006b0070006f00ea001e0012032a0137018e013a00e8013201310095018d002900df00860102013000ce001a012f012e012d0040000c002100080006000100020005000a000b000700030009006a008b009c000d007b00a5008a007f000d00390038003700060001000200050036003500070003003c012c00cb004a007a002601010033010000ff00c90104018c0329007903280136010a00fe0066002a00fd00fc0074007300720071013f00fb013e002a0070006f00fa001e00120327009b032600a10325009a003d00150030018b0013000c00180008018a03240006000100020005000a000b00070003000900040020001000080006000100020005000a000b0007000300090004000d00160085002c001a0109008000de012b012a0189012900940093012801270094009301260033012501240123018801220032012101200323011f03220082000d00390006000100020005000a000b00070003000900040020001000080006000100020005000a000b000700030009000400640025008500b2000d011e00f800f700c8018700c70048004700c600c50048004700c400a000c300c200c1018600c0004600bf00be0321018500dd00220320031f011d0011002901840029008000bc00900013000c001800080006000100020005000a000b00070003000900040020001000080006000100020005000a000b000700030009000400aa002700f60064000f0099011c004500bb009800ba0084004500b900230065031e0097000c0063001f031d0001000200170044004300b8002b0083001c004200620026006100f500f400f3031c0060005f005e005d005c031b00f2031a005b005a005900580057000400560055005400530052005100500024003200b7004f004600b600220049004e000f0003006d00b5001e0003006d002c0019000100020017003b002f002e003a00120078002d003400b401420075001c00030319011b00bd0011006e0183006e002a018200dd002203180181013900e700ca01800066017f011a01190013000c001800080006000100020005000a000b00070003000900040020001000080006000100020005000a000b0007000300090004002c00270076000d00cd017e00680067009f0087001200150030006c008c017d03170316017c017b03150077031400aa017a003d00890030008801bf000d00400013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b0007000300090004002000270013000c004b00080006000100020005000a000b0007000300090004002c001a0023001000080006000100020005000a000b0007000300090004001501bb0313000f0312003e031103100118030f030e0118030d030c0018030b0137018e013400e8013201310095018d002900df00860102013000ce001a012f012e012d007f000c002100080006000100020005000a000b000700030009006a008b009c000d007b00a5008a0040000d00390038003700060001000200050036003500070003003c012c00cb004a007a002601010033010000ff00c90104030a0309007903080307030600fe0066002a00fd00fc0074007300720071030500fb0304002a0070006f00fa001e001201790303009b004d030200a10301009a003d00f90300018a02ff0013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b0007000300090004000d00160085002c001a0109008000de012b012a01890129009400930128012700940093012600330125012401230188012200320121012002fe011f02fd011d0011002901840029008000bc00900013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b000700030009000400aa002700f60064000f0099011c004500bb009800ba0084004500b90023006502fc0097000c0063001f02fb0001000200170044004300b8002b0083001c004200620026006100f500f400f302fa0060005f005e005d005c02f900f202f8005b005a005900580057000400560055005400530052005100500024003200b7004f004600b600220049004e000f0003006d00b5001e0003006d002c0019000100020017003b002f002e003a00120078002d003400b4009e0075001c000302f7011b0082000d02f602f500390013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b000700030009000400640025008500b2000d011e00f800f700c8018700c70048004700c600c50048004700c400a000c300c200c1018600c0004600bf00be02f402f30178002502f202f100bd0011006e0183006e002a02f00178002502ef02ee006800e702ed011a01190013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b0007000300090004002c002701a702ec00cd02eb00680067009f0087001202ea006c008c017d02e902e8004d02e701a101a002e6014602e502e401060105019f001e004a008d00e9019e00b101a5013d019d008400b1019c019b006502e3001f0138000c006302e20044004300dc014501440177002b00a9001c004200620026006100b000af00ae00ad02e10060005f005e005d005c02e0008f02df005b005a005900580057000400560055005400530052005100500024009200e6004f003200e500220049004e000302de00e3002b00e202dd000f00b30176001b0096017501a20044004300dc014501440177002b0083001c004200620026006100b000af00ae00ad02dc0060005f005e005d005c02db008f02da005b005a005900580057000400560055005400530052005100500024009200e6004f003200e500220049004e000300e400e3002b00e200e40082000d0089001a02d900e902d802d702d601b301950081008800e10044004300dc003b002f002e003a001202d5002d014802d4009e02d3000f00b30174001b00960173001b01170019009d00f1001b00010002001700a9001d017c017b02d2007702d100aa017a003d006c0030015602d000ac000d01120082001502cf0013000c001800080006000100020005000a000b00070003000900040015001000080006000100020005000a000b000700030009000402ce00ac000d015c0194000d02cd002a00680067009f00870012006c003000ac000d02cc004d02cb02ca02c902c8018f02c7004d02c602c502c402c302c202c102c002bf02be02bd02bc02bb008e0147014c0012008900300006000100020005014a002d003402ba017202b902b8011800e801320131017102b70029009500860102013000ce001a012f012e012d0040000c002100080006000100020005000a000b000700030009006a008b009c000d007b00a5008a007f000d00390038003700060001000200050036003500070003003c012c00cb004a007a002601010033010000ff00c90104018c02b6007902b50136010a00fe0066002a00fd00fc0074007300720071013f00fb013e002a0070006f00fa001e001202b4009b02b300a102b2009a003d00150030018b02b101400004015a001002b001d6001602af0006000100020005000a000b00070003000900040020001000080006000100020005000a000b0007000300090004000d00160085002c001a0109008000de012b012a02ae01290094009301280127009400930126003301250124012302ad012200320121012002ac011f02ab0082000d00390006000100020005000a000b00070003000900040020001000080006000100020005000a000b000700030009000400640025008500b2000d011e00f800f700c802aa00c70048004700c600c50048004700c400a000c300c200c102a900c0004600bf00be02a8018500dd002202a702a6011d0011002902a50029008000bc00900013000c001800080006000100020005000a000b00070003000900040020001000080006000100020005000a000b000700030009000400aa002700f60064000f0099011c004500bb009800ba0084004500b90023006502a40097000c0063001f02a30001000200170044004300b8002b0083001c004200620026006100f500f400f302a20060005f005e005d005c02a100f202a0005b005a005900580057000400560055005400530052005100500024003200b7004f004600b600220049004e000f0003006d00b5001e0003006d002c0019000100020017003b002f002e003a00120078002d003400b401420075001c0003029f011b00bd0011006e029e006e002a018200dd0022029d0181013900e700ca01800066017f011a01190013000c001800080006000100020005000a000b00070003000900040020001000080006000100020005000a000b0007000300090004002c00270076000d00cd017e00680067009f0087001200150030006c008c029c029b029a00db000f0170003e014d02990298000f0297003e01ba01b90103014c014b008e002700ac000d00cd01b800680067009f00870012008900300006000100020005014a002d003401b70172016f0296001a0151015e01900171000d009500380037000600010002000500360035000700030295029400cb0293007a010f009100d5010e010d00c9029200790291016e0290010c028f006b00f000ef0074007300720071028e00ee00ed00ec00eb006b0070006f00ea001e0012028d009b016e028c0077028b009a003d0179004100db00d4000c01db00d300d2001d016f028a019600950013000c001800080006000100020005000a000b0007000300a80004016d001000080006000100020005000a000b0007000300a80004000d0016028901920288001a0133008000de004200c800e00287028600c70048004700c600c50048004700c400a000c300c200c1028500c0004600bf00be028401a9028300bd0282006e00290281002901a800bc00df0013000c001800080006000100020005000a000b0007000300a80004016d001000080006000100020005000a000b0007000300a8000400d600270280027f0064000f0099027e004500bb009800ba0084004500b900230065027d001f0097000c0063027c0001000200170044004300b8002b0083001c004200620026006100b000af00ae00ad027b0060005f005e005d005c027a008f0279005b005a005900580057000400560055005400530052005100500024003200b7004f004600b600220049004e000f0003016c00b5001e0003016c00e00019000100020017003b002f002e003a00120078002d003400b402780075001c000300a8004100d0001d000f017000190001000200170135001d00b30174001b00960173001b01170019009d00f1001b00010002001700a9001d027701330276027500df027400060001000200050273027200070003027100e9000400160270026f00d60019026e01af0019026d00e101dd015a0019000600e000230065026c001f0138000c0063026b00440043026a000100020005026900a9001c004200620026006100b000af00ae00ad02680060005f005e005d005c0267008f0266005b005a005900580057000400560055005400530052005100500024009200e6004f003200e500220049004e0003016b00e3002b00e2016b004100db026500e10044004300dc0135001d000f00b30176001b00960175001b01170019009d00f1001b00010002001700a9001d00db0006000100020005000a000b0007000302640004004100d0001d0263001f0041008600410262001f0041008600410261001f00410086004102600069001d000000000000000000da025f0000025e0000000000000000025d000000000000025c000000000000025b000000000000025a0000000000000259000000000000025800000000000002570000000000000256000000000000025500000000000002540000000000000253000000000000025200000000000002510000000000000250000000000000024f000000000000024e000000000000024d000000000000024c000000000000024b000000da000e000e00000000016a000e00000000024a0000000000000249000000a7000002480000000e000e0247000000000000024600000000024500000000000002440000000000000243000000000169000000000000024200000000000000000000000002410240023f023e023d0168000001670000000001690000000000000116000e00d9000e01660000000000000116000e000e000e000e000e00d900000000000e000e00000000016a023c023b000e023a000e0239000000000000000000000238000001650237000000000236000000000000000000000235000000a700000164000002340233023202310230022f022e022d00000000022c0000022b000e000e000e00000116000e022a00a70000000000000229022802270226000000000000000e0163000e000e022500000000000002240223022200000000022100000000000000000000016700000220000000000000021f000000000000021e00000000000000000000021d0000000e000e021c000000000000021b000e021a000000000000000000d900000000000e00da000e000e0163000e000e000e000e0166000000da02190000000000000165021802170000021600000000000000a700000215000002140213021202110210000000000000020f0000000000000000000001620000020e020d020c020b020a0000000000000209000000000000020800000000000000000000000002070000000000000206000e00d900000000000e00000000000000a70000020500000204020302020201000000000164000002000000000000000000000001ff00000000000001fe000001fd00000000000001fc01fb01fa01f901f80000000000000000000001f7000001f6000000000000000e000e000e000e01f501f401f301f2016800000162000001f1000000000000000000000000000001f001ef01ee01ed000000000000000000000000000000000000000000000000000000000000", + "logIndex": 2, + "blockHash": "0xd6aea37fbd0bde1ffe6602151bf36e7a97a1abb3b8c00f9d2b556bed06c09492" + }, + { + "transactionIndex": 0, + "blockNumber": 3909481, + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x010004b9dd2b924a8be23e34ac58a1d026f893da4fc4d9bafa98daa6311a0473", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0xd6aea37fbd0bde1ffe6602151bf36e7a97a1abb3b8c00f9d2b556bed06c09492" + }, + { + "transactionIndex": 0, + "blockNumber": 3909481, + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x010004b9dd2b924a8be23e34ac58a1d026f893da4fc4d9bafa98daa6311a0473", + "0x0000000000000000000000007273ff33d2916e371d8e8584cd03ef414c6ecffc" + ], + "data": "0x", + "logIndex": 4, + "blockHash": "0xd6aea37fbd0bde1ffe6602151bf36e7a97a1abb3b8c00f9d2b556bed06c09492" + }, + { + "transactionIndex": 0, + "blockNumber": 3909481, + "transactionHash": "0x58339f98b4d7024050538ffb11cd7c20e7bc3ce28e8fdc103c1413426079a4a9", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x00000000000000000000000000000000000000000000000000040bdd9e199fc0", + "logIndex": 5, + "blockHash": "0xd6aea37fbd0bde1ffe6602151bf36e7a97a1abb3b8c00f9d2b556bed06c09492" + } + ], + "blockNumber": 3909481, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "29575f9c42d79da7d15102bbf5192733", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "name": "AlreadySubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyUnsubscribed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "innerErorr", + "type": "bytes" + } + ], + "name": "BatchError", + "type": "error" + }, + { + "inputs": [], + "name": "FullyPacked", + "type": "error" + }, + { + "inputs": [], + "name": "IncentiveOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientStakedAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIndex", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimeFrame", + "type": "error" + }, + { + "inputs": [], + "name": "NoToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonZero", + "type": "error" + }, + { + "inputs": [], + "name": "NotStaked", + "type": "error" + }, + { + "inputs": [], + "name": "NotSubscribed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyCreator", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + } + ], + "name": "IncentiveCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "changeAmount", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newStartTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEndTime", + "type": "uint256" + } + ], + "name": "IncentiveUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Subscribe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "Unsubscribe", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "accrueRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "datas", + "type": "bytes[]" + } + ], + "name": "batch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + } + ], + "name": "claimRewards", + "outputs": [ + { + "internalType": "uint256[]", + "name": "rewards", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint112", + "name": "rewardAmount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "startTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + } + ], + "name": "createIncentive", + "outputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "incentiveCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "incentives", + "outputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint32", + "name": "endTime", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "rewardPerLiquidity", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "lastRewardTime", + "type": "uint32" + }, + { + "internalType": "uint112", + "name": "rewardRemaining", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "liquidityStaked", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardPerLiquidityLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint256[]", + "name": "incentiveIds", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeAndSubscribeToIncentives", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "stakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + } + ], + "name": "subscribeToIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "transferExistingRewards", + "type": "bool" + } + ], + "name": "unstakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "incentiveIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "ignoreRewards", + "type": "bool" + } + ], + "name": "unsubscribeFromIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "incentiveId", + "type": "uint256" + }, + { + "internalType": "int112", + "name": "changeAmount", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "newStartTime", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "newEndTime", + "type": "uint32" + } + ], + "name": "updateIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userStakes", + "outputs": [ + { + "internalType": "uint112", + "name": "liquidity", + "type": "uint112" + }, + { + "internalType": "uint144", + "name": "subscribedIncentiveIds", + "type": "uint144" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "unsubscribeFromIncentive(address,uint256,bool)": { + "params": { + "incentiveIndex": "∈ [0,5]" + } + } + }, + "stateVariables": { + "rewardPerLiquidityLast": { + "details": "rewardPerLiquidityLast[user][incentiveId]Semantic overload: if value is zero user isn't subscribed to the incentive." + }, + "userStakes": { + "details": "userStakes[user][stakedToken]" + } + }, + "title": "Fork of https://github.com/sushiswap/StakingContract", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Permissionless staking contract that allows any number of incentives to be running for any token (erc20). Incentives can be created by anyone, the total reward amount must be sent at creation. Incentives can be updated (change reward rate / duration). Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.", + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/Rewards/StakingContractMainnet.sol": "StakingContractMainnet" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/Rewards/StakingContractMainnet.sol": { + "keccak256": "0x946dc24d08f781be4b0315986f13b390e79cac563074458fdf3a5dc2b76cce04", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://430b6f68a3993dc68ddf28d1f3f21e3a206eb32481dfac29f77ed3614ecc96b2", + "dweb:/ipfs/QmebFypNY7hea9nMuwG9ANPQCwktH5Sc13VtSanNWCuUJ8" + ] + }, + "contracts/Rewards/libraries/FullMath.sol": { + "keccak256": "0x9dd1081af9b9bf8d535e524847985fc4255d44e243e3b5afe770c9ee0557d032", + "license": "MIT", + "urls": [ + "bzz-raw://5976d20e5ee4054b47fdfbf561f8df7ae74e06046d06ce52ca47c536af7a06a1", + "dweb:/ipfs/QmSw2SkeE56p7u28N38aRynWy4ZoxNsXTk4eNrkGMmoyC7" + ] + }, + "contracts/Rewards/libraries/PackedUint144.sol": { + "keccak256": "0x71a853b74959948bbf3ba496130ce4b34e6047f35567651c846d8c7454f0efec", + "license": "GPL-3.0-or-later", + "urls": [ + "bzz-raw://6771a5f0e7c12d87d17abe9234737e7bc8636256f28114d1c19d2f93139ffd58", + "dweb:/ipfs/QmU2GQm7X5zAat3XkS3i8kLSNWAagME1VoRGBeAVrR4Do3" + ] + }, + "lib/solmate/src/tokens/ERC20.sol": { + "keccak256": "0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35", + "dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97" + ] + }, + "lib/solmate/src/utils/ReentrancyGuard.sol": { + "keccak256": "0xb282dd78aa7375d6b200b9a5d8dd214b2e5df1004f8217a4b4c2b07f0c5bfd01", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://5fca62eb8d3dbd2b3b7e4bb051f6da16f4d0ff9cee61c39cebb80f031f6a8800", + "dweb:/ipfs/QmbrsXPK91iBFwHKwJs2HLRud2KzMoBDRiWYMUtyV5H57j" + ] + }, + "lib/solmate/src/utils/SafeTransferLib.sol": { + "keccak256": "0xbadf3d708cf532b12f75f78a1d423135954b63774a6d4ba15914a551d348db8a", + "license": "AGPL-3.0-only", + "urls": [ + "bzz-raw://88ac8256bd520d1b8e6f9c4ac9e8777bffdc4a6c8afb1a848f596665779a55b4", + "dweb:/ipfs/QmXx7X1dxe6f5VM91vgQ5BA4r2eF97GWDcQDrgHytcvfjU" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x0003000000000002000e000000000002000000000c01034f00020000000c035500000000010c001900000060011002700000044e0010019d000000800d0000390000004000d0043f0000000100200190000000570000c13d0000044e03100197000000040030008c0000081a0000413d00000000010c043b000000e002100270000004500020009c000000610000213d00000000013c034f0000045a0020009c0000007e0000a13d0000045b0020009c000000e70000213d0000045e0020009c000001670000613d0000045f0020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b000000000102041a0000007004100272000007bd0000613d0000046a0010009c0000069d0000813d00000001030000390000078a0000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000010041b0000002001000039000001000010044300000120000004430000044f01000041000011350001042e000004510020009c000000c40000a13d000004520020009c0000014a0000213d000004550020009c000001a80000613d000004560020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d000000000010043f0000000301000039000000200010043f000e0000000c0353113411180000040f0000000e0200035f0000002402200370000000000202043b000000000020043f000000200010043f113411180000040f000002040000013d000004600020009c000002000000613d000004610020009c000002080000613d000004620020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d000000060230006c000006a40000813d000000400100043d000004b002000041000007bf0000013d000004570020009c000002240000613d000004580020009c000003ad0000613d000004590020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d0000002402c00370000000000202043b000e00000002001d000004630020009c0000081a0000213d000000000010043f0000000401000039000000200010043f113411180000040f0000000e02000029000000000020043f000000200010043f113411180000040f000000000101041a0000046402100197000000800020043f0000007001100270000000a00010043f0000048201000041000011350001042e0000045c0020009c000004110000613d0000045d0020009c0000081a0000c13d000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000002401c00370000000000301043b0000049000300198000004910100004100000000010060190000049202300197000000000121019f0000000402c00370000000000202043b000e00000002001d000d00000003001d000000000013004b0000081a0000c13d0000004401c00370000000000101043b000c00000001001d0000044e0010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000301043b000000000103041a00000463011001970000000002000411000000000012004b0000052e0000c13d0000000401300039000600000003001d0000000202300039000700000002001d000000000202041a000800000002001d000a00000001001d000000000101041a000900000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d00000009050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000004720050009c000006c00000413d000000000521004b000006c00000a13d0000000a03000029000000000303041a0000009006300272000006d80000c13d0000049e01000041000000000010043f0000001201000039000000040010043f0000049f010000410000113600010430000004530020009c000004380000613d000004540020009c0000081a0000c13d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000200041a000000010020008c0000045f0000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b000004690000813d000000000010043f000000200020043f113411180000040f11340f760000040f0000000101000039000000000010041b0000000001000019000011350001042e000000a40030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d000004630010009c0000081a0000213d0000004401c00370000000000101043b000c00000001001d000004640010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d0000008401c00370000000000101043b000a00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000c0000006b000004690000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000b0010006b0000000b02008029000b00000002001d0000000a0020006c0000074a0000813d0000000102000039000000000102041a0000000101100039000000000012041b000900000001001d000004a40010009c000008250000413d000000400100043d000004ab02000041000007bf0000013d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010100002900000006020000291134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d0000000602300029000004640020009c000008b60000213d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000006c70000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000481040000410000000105000029000008160000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000101041a000000800010043f0000046601000041000011350001042e000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000f02043b0000048700f0009c0000081a0000213d0000002302f00039000000000032004b0000081a0000813d0000000402f0003900000000022c034f000000000202043b000c00000002001d000004870020009c0000081a0000213d000e002400f0003d0000000c0200002900000005022002100000000e02200029000000000032004b0000081a0000213d0000000c0000006b0000046d0000c13d0000000001000019000011350001042e000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000004640010009c0000081a0000213d0000004402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000504043b000004870050009c000004320000213d00000005045002100000003f064000390000048806600197000004890060009c000004320000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b0000081a0000213d000000000005004b000002530000613d000000a00300003900000000052c034f000000000505043b00000000035304360000002002200039000000000042004b0000024d0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b0000081a0000c13d000000000200041a000000010020008c000006d10000c13d0000000202000039000000000020041b00000464021001970000000e01000029000600000002001d1134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046302200197000200000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000500000003001d0000000602300029000004640020009c000008b60000213d0000046803100197000000000232019f0000000703000029000000000023041b000004690020009c00000aea0000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004810400004100000002050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b000000800100043d000700000001001d000000000001004b000002220000613d0000000004000019000000800100043d000000000041004b00008010030000390000081f0000a13d000900000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b000e00000004001d000000010140008a000000000202041a000000000021004b0000081c0000813d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700000000020300191134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000800000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000040e0000613d0000000d020000290000000201200039000000000101041a000a00000001001d0000000401200039000c00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b070000290000044e037001970000000a02000029000000a0022002700000044e04200197000000000501043b000000000045004b00000000020400190000000002054019000004720070009c0000000d0100002900000003011000390000033e0000413d000000000632004b0000033e0000a13d0000000c09000029000000000509041a0000009007500272000001440000613d00000000033400490000002004500270000004640840019700000000066800a900000000033600d900000464063000d100000000067600d9000000000701041a0000000006670019000000000061041b0000000003340049000000200330021000000473033001970000047404500197000000000334019f000000000223019f000000000029041b000003460000013d000004750070009c000003460000213d000000000053004b000003460000813d0000047603700197000000000232019f0000000c03000029000000000023041b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000802000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000ae70000613d000000000301041a0000046e0030009c0000000c0500002900000f580000813d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000015041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d02000039000000030300003900000486040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b00000009040000290000000104400039000000070040006c000002a80000413d000002220000013d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000301043b000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b000004690000813d000e00000003001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000c00000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000074d0000c13d000000400100043d0000048f02000041000007bf0000013d000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000404043b000600000004001d000004870040009c0000081a0000213d000500240020003d000000060200002900000005022002100000000504200029000000000034004b0000081a0000213d000000000300041a000000010030008c0000045f0000c13d0000000203000039000000000030041b0000003f032000390000048803300197000004890030009c000005040000a13d0000049e01000041000000000010043f0000004101000039000000040010043f0000049f010000410000113600010430000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f113411180000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a0000046301100197000000800010043f0000046301500197000000a00010043f0000046301400197000000c00010043f000000a0014002700000044e01100197000000e00010043f000001000030043f0000044e01200197000001200010043f00000020012002700000046401100197000001400010043f0000009001200270000001600010043f0000046501000041000011350001042e0000047d01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000048a01000041000000c40010043f000004ad0100004100001136000104300000049d01000041000000800010043f000004ac010000410000113600010430000000200e00008a0000000005000019000b0000000f001d0000000004f30049000d00000005001d00000005025002100000000e0220002900000000022c034f000000000202043b000000430440008a0000049a054001970000049a06200197000000000756013f000000000056004b00000000050000190000049a05002041000000000042004b00000000040000190000049a040040410000049a0070009c000000000504c019000000000005004b0000081a0000613d0000000e0420002900000000024c034f000000000b02043b0000048700b0009c0000081a0000213d0000000005b3004900000020044000390000049a065001970000049a07400197000000000867013f000000000067004b00000000060000190000049a06004041000000000054004b00000000050000190000049a050020410000049a0080009c000000000605c019000000000006004b0000081a0000c13d00000000064c034f0000000007eb0170000000400400043d0000000005740019000004a30000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b0000049f0000c13d0000001f08b00190000004b00000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000004b90000c13d00000001060000310000000102000039000004cf0000013d0000044e00b0009c0000044e0b0080410000006001b002100000044e0040009c0000044e040080410000004003400210000000000113019f0000044e0050009c0000044e05008041000000c003500210000000000113019f1134112f0000040f0000000b0f000029000000200e00008a000000800d0000390000000003000031000000020c000367000000010220018f000000000401001900000060044002700001044e0040019d0000044e06400197000000000006004b00000000040d00190000006005000039000004fa0000613d000004b10060009c000004320000813d0000001f046000390000000004e4016f0000003f044000390000000004e4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000004870040009c000004320000213d0000000100700190000004320000c13d000000400040043f00000000046504360000000008e601700000000007840019000004ed0000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000004e90000c13d0000001f06600190000004fa0000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b0000067c0000613d0000000d0500002900000001055000390000000c0050006c000004700000413d000002220000013d000000400100043d0000048b02000041000007bf0000013d0000008003300039000000400030043f0000000603000029000000800030043f0000001f0320018f000000000002004b000005110000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000050d0000c13d000000000003004b000000060000006b000005310000c13d0000000101000039000000000010041b0000002002000039000000400100043d0000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005250000613d000000a0040000390000000005000019000000004604043400000000026204360000000105500039000000000035004b000005200000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e000000400100043d0000049302000041000007bf0000013d0000000002000019000900000002001d0000000502200210000700000002001d0000000501200029000e00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b0000081c0000813d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000b00000001001d000d00000002001d0000000401200039000a00000001001d000000000101041a000c00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000c060000290000044e026001970000000b03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000d070000290000000308700039000b00000008001d000005850000413d000000000521004b000005850000a13d0000000a09000029000000000409041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000019041b0000058d0000013d000004750060009c0000000a030000290000058d0000213d000000000042004b0000058d0000813d0000047602600197000000000121019f000000000013041b0000000e010000290000000201100367000000000101043b000e00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000d0100002900000464011001970000000b03000029000000000303041a000c00000003001d0000000002230049000004b30020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000005ed0000c13d000004640130012a000005f50000013d000004780040009c0000081a0000213d000004641010012a000004642020012a00000000011200a9000004641010012a000000000113004900000479011000d1000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000d0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c000006270000c13d0000000001010433000000000010043f000000010300003100000001020000390000064d0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c0000002005000039000000000503401900000020045001900000063e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000063a0000c13d0000001f055001900000064b0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000d0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d000000800100043d0000000902000029000000000021004b0000081f0000a13d0000000701000029000000a0011000390000000d0300002900000000003104350000000102200039000000060020006c000005320000413d000005140000013d000000400100043d000004b20200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000006900000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000006890000413d0000001f042000390000000004e4016f0000000002230019000000000002043500000044024000390000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f00001136000104300000046b0010009c00000002030000390000078a0000413d0000046c0010009c000007840000813d00000003030000390000078a0000013d000004690020009c000008b60000813d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000007c50000813d000000400100043d0000002402100039000000060300002900000000003204350000047a020000410000000000210435000000040210003900000000030004110000000000320435000000000200041400000001030000290000046303300197000e00000003001d000000040030008c000007cf0000c13d00000001020000390000000001010433000000000010043f0000000103000031000007f70000013d000004750060009c000006ec0000213d000000000032004b000006ec0000813d0000047602600197000000000121019f000006ea0000013d000300010000003d0000046a0010009c000009080000413d0000046b0010009c000300020000003d000009080000413d0000046c0010009c000009010000813d0000000301000039000009070000013d000000400100043d00000044021000390000048a03000041000000000032043500000024021000390000000a0300003900000d460000013d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000006060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f0000000a02000029000000000012041b0000000c01000029000c044e0010019c000007030000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000c0010006b0000000c020080290000000a03000029000000000103041a0000047601100197000000000121019f000000000013041b0000000b0000006b000007080000c13d0000000701000029000000000101041a0000071d0000013d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000000b0010006b0000000b01008029000000a00110021000000494011001970000000703000029000000000203041a0000049502200197000000000121019f000000000013041b000000a0021002700000044e032001970000000a02000029000000000202041a0000044e04200197000000000034004b0000074a0000813d0000000d03000029000004960030009c000008b00000213d0000000d0000006b000008b00000613d0000000d030000290000046404300197000000200320027000000464033001970000000003430019000004640030009c000008b60000213d000004970220019700000020033002100000047303300197000000000223019f0000000a03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000049802000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cb10000c13d00000001020000390000000001030433000000000010043f000000010300003100000cd80000013d000000400100043d000004a302000041000007bf0000013d0000000d020000290000000201200039000000000101041a000900000001001d0000000401200039000a00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000903000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000a9c0000413d000000000521004b00000a9c0000a13d0000000a03000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d90000000d060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000aa40000013d0000046d0010009c00000004030000390000078a0000413d0000046e0010009c000000060300003900000005030040390000000d0030006b000007bd0000813d000b00000004001d000a00000002001d0000000d01000029000e0018001000cd000000000001004b000007960000613d0000000e020000290000000d012000fa000000180010008c000008b60000c13d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000e040000290000000b0340024f0000046f03300197000000ff0040008c0000000003002019000e00000003001d00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000008bc0000c13d000000400100043d000004a102000041000007bf0000013d000000400100043d000004a20200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c70000113600010430000300010000003d0000046a0010009c00000afb0000413d0000046b0010009c000300020000003d00000afb0000413d0000046c0010009c00000af40000813d000000030100003900000afa0000013d0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000047b011001c70000000e02000029113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007e40000c13d000000000005004b000007f50000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004af040000410000000e050000290000000006000411113411250000040f0000000100200190000001630000c13d00000000010000190000113600010430000000400100043d0000049d02000041000007bf0000013d0000049e01000041000000000010043f0000003201000039000000040010043f0000049f0100004100001136000104300000000d010000290000000c020000291134109f0000040f000000400100043d000800000001001d000004a50010009c000004320000213d00000008030000290000010001300039000000400010043f000000c0023000390000000c01000029000600000002001d0000000000120435000000a0023000390000000b01000029000700000002001d000000000012043500000080023000390000049601000041000500000002001d000000000012043500000060023000390000000a01000029000400000002001d000000000012043500000040023000390000000d01000029000200000002001d000000000012043500000020023000390000000e01000029000100000002001d000000000012043500000000010004110000000000130435000000e001300039000300000001001d00000000000104350000000901000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000080200002900000000020204330000046302200197000000000101043b000000000301041a000004a603300197000000000223019f000000000021041b0000000102000029000000000202043300000463022001970000000103100039000000000403041a000004a604400197000000000224019f000000000023041b0000000202000029000000000202043300000463022001970000000203100039000000000403041a000004a704400197000000000224019f00000004040000290000000004040433000000a0044002100000049404400197000000000242019f000000000023041b000000050200002900000000020204330000000303100039000000000023041b0000000302000029000000000202043300000090022002100000000603000029000000000303043300000020033002100000047303300197000000000232019f000000070300002900000000030304330000044e03300197000000000232019f0000000401100039000000000021041b000000400100043d00000060021000390000000a03000029000000000032043500000040021000390000000b03000029000000000032043500000020021000390000000c030000290000000000320435000000090200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a8011001c70000800d020000390000000403000039000004a9040000410000000e050000290000000d060000290000000007000411113411250000040f00000001002001900000081a0000613d0000000101000039000000000010041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e010080410000004001100210000004aa011001c7000011350001042e0000000d030000290000049a0030009c00000d240000413d0000000d03000029000004910030009c00000c920000c13d0000049e01000041000000000010043f0000001101000039000000040010043f0000049f0100004100001136000104300000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000000000101041a000800000001001d000700000002001d0000000401200039000900000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000d510000413d000000000521004b00000d510000a13d0000000903000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000007060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000d590000013d0000046d0010009c000300040000003d000009080000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c050000290000000308500039000009590000413d000000000521004b000009590000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f0000095f0000013d000004750060009c000009610000213d000000000042004b000009610000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d0000000001000411000000000010043f0000000301000039000000200010043f000000050000006b0000099e0000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b000009d90000c13d000004640120012a000009e00000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000a5c0000c13d000004640330012a00000464023000d1000000000003004b00000a660000c13d00000a690000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000a120000c13d0000000001010433000000000010043f0000000103000031000000010200003900000a380000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000a290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000a250000c13d0000001f0550019000000a360000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000a8c0000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000a690000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000030020006c0000090c0000413d000001ef0000013d0000000b04000029000004750040009c00000aa60000213d000000000032004b00000aa60000813d0000000b020000290000047602200197000000000121019f0000000a02000029000000000012041b0000000d010000290000000301100039000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000f550000c13d000000400100043d0000048e02000041000007bf0000013d000400010000003d0000046a0020009c00000dba0000413d0000046b0020009c000400020000003d00000dba0000413d0000046c0020009c00000db30000813d000000030100003900000db90000013d0000046d0010009c000300040000003d00000afb0000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000e00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000d00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030950003900000b4d0000413d000000000521004b00000b4d0000a13d0000000d08000029000000000408041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000609041a0000000005560019000000000059041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000018041b00000b550000013d000004750060009c0000000d0300002900000b550000213d000000000042004b00000b550000813d0000047602600197000000000121019f000000000013041b000c00000009001d000000050000006b00000c150000613d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b00000b920000c13d000004640120012a00000b990000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000bcb0000c13d0000000001010433000000000010043f0000000103000031000000010200003900000bf10000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000be20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000bde0000c13d0000001f0550019000000bef0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f000000010020019000000c830000c13d0000081a0000013d0000000701000029000000000101041a000004640110019800000b580000613d000b00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000c560000c13d000004640230012a00000464032000d1000000000002004b00000c600000c13d00000c630000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479022000d100000464032000d1000000000002004b00000c630000613d00000000022300d9000004640020009c000008b60000c13d0000000b023000fa000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000d04000029000000000104041a0000009002100270000000060220006a000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000014041b00000009020000290000000102200039000000030020006c00000aff0000413d000006ac0000013d0000000d030000290000000003300089000004640430019700000020032002700000046405300197000000000054004b00000000040580190000000003430049000000200330021000000473033001970000049702200197000000000223019f0000000a03000029000000000023041b000000400300043d000000240230003900000000004204350000047a02000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cee0000c13d00000001020000390000000001030433000000000010043f000000010300003100000d150000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000cc90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000cc50000c13d000000000005004b00000cd60000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000ce70000613d000000000141016f000000000113019f000000010010019000000d240000c13d000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000d460000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000d060000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d020000c13d000000000005004b00000d130000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d0000000701000029000000000101041a0000000a02000029000000000202041a0000044e02200197000000400300043d00000020043000390000000000240435000000a0011002700000044e01100197000000400230003900000000001204350000000d0100002900000000001304350000044e0030009c0000044e03008041000000400130021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000049b011001c70000800d0200003900000002030000390000049c040000410000000e05000029000008170000013d000000400100043d00000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300000000b04000029000004750040009c00000d5b0000213d000000000032004b00000d5b0000813d0000000b020000290000047602200197000000000121019f0000000902000029000000000012041b0000000c0000006b00000d630000c13d0000000a01000029000000000101041a000004640310019700000007010000290000000e0200002911340fbe0000040f0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000001041b0000000a01000029000000000101041a00000464021001970000000901000029000000000101041a00000090031002700000000002230049000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000902000029000000000012041b0000000a01000029000000000101041a00000070021002700000000d03000029000000050030008c00000da50000213d0000049a03000041000000010400008a0000049a0030009c000000000400c0190000000d03000029000000060330008900000018033000ca000001000530008900000000045401cf000004740530027f000000000445019f0000047404006041000004750330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f00000464011001970000007002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d020000390000000303000039000004a004000041000008150000013d0000046d0020009c000400040000003d00000dba0000413d0000046e0010009c00000006010000390000000501004039000400000001001d0000000501000029000004641010012a000300000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030850003900000e0b0000413d000000000521004b00000e0b0000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f00000e110000013d000004750060009c00000e130000213d000000000042004b00000e130000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b00000e530000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000005322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000005021000b9000000000323004b00000000040000390000000104004039000000000343004b00000e8e0000c13d000004640120012a00000e950000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000005433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000005032000b9000000000434004b00000000050000390000000105004039000000000454004b00000f110000c13d000004640330012a00000464023000d1000000000003004b00000f1b0000c13d00000f1e0000013d000004780030009c0000081a0000213d000004641010012a00000003011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000ec70000c13d0000000001010433000000000010043f0000000103000031000000010200003900000eed0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000ede0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000eda0000c13d0000001f0550019000000eeb0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000f410000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000003022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000f1e0000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000040020006c00000dbe0000413d0000028d0000013d000000000001042f000000400100043d000004ae02000041000007bf0000013d000000000301041a000004830030009c00000f5b0000a13d000000400100043d0000048d02000041000007bf0000013d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b0000000a01000029000000000101041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d0200003900000003030000390000048604000041000008150000013d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000fb70000613d00000003060000290000044e026001970000000203000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720060009c00000fae0000413d000000000521004b00000fae0000a13d0000000408000029000000000308041a000000900630027200000fb80000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000fb50000013d000004750060009c000000040800002900000fb60000213d000000000032004b00000fb60000813d0000047602600197000000000121019f000000000018041b000000000001042d000000000001042f0000049e01000041000000000010043f0000001201000039000000040010043f0000049f0100004100001136000104300004000000000002000200000003001d000400000002001d000300000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b000000000101041a000000000001004b000010870000613d00000003020000290000000302200039000000000202041a000100000002001d0000000001120049000004b30010009c000000000301001900000000030060190000000202000029000004640220019700000000432300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000032100a9000000000434004b00000000050000390000000105004039000000000454004b00000fff0000c13d000004640130012a000010070000013d000004780040009c000010850000213d000004642020012a000004641010012a00000000012100a9000004641010012a000000000113004900000479011000d1000200000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000102000029000000000021041b00000003010000290000000201100039000000000201041a000000400100043d0000002403100039000000020400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c0000103a0000c13d00000001020000390000000001010433000000000010043f0000000103000031000010610000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010520000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000104e0000c13d000000000005004b0000105f0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d00000001002001900000108f0000613d000000000254016f000000000223019f00000001002001900000108f0000613d000000020200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004800400004100000004050000290000000006000411113411250000040f0000000100200190000010850000613d000000000001042d00000000010000190000113600010430000000400100043d000004ae0200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c7000011360001043000000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300002000000000002000100000002001d000004b4020000410000000000200443000200000001001d000000040010044300000000010004140000044e0010009c0000044e01008041000000c001100210000004b5011001c700008002020000391134112a0000040f0000000100200190000010fe0000613d000000400300043d000000000101043b000000000001004b000010ff0000613d00000044013000390000000102000029000000000021043500000024013000390000000002000410000000000021043500000498010000410000000000130435000000040130003900000000020004110000000000210435000000000100041400000002020000290000046302200197000000040020008c000010c70000c13d00000001020000390000000001030433000000000010043f0000000103000031000010ee0000013d0000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010df0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010db0000c13d000000000005004b000010ec0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011060000613d000000000141016f000000000113019f0000000100100190000011060000613d000000000001042d000000000001042f000004b60100004100000000001304350000044e0030009c0000044e0300804100000040013002100000048c011001c70000113600010430000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c70000113600010430000000000001042f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000011230000613d000000000101043b000000000001042d0000000001000019000011360001043000001128002104210000000102000039000000000001042d0000000002000019000000000001042d0000112d002104230000000102000039000000000001042d0000000002000019000000000001042d00001132002104250000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000711c316a0000000000000000000000000000000000000000000000000000000093d1692e00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b90000000000000000000000000000000000000000000000000000000093d1692f00000000000000000000000000000000000000000000000000000000cc40105800000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000045a2cab0000000000000000000000000000000000000000000000000000000005eac6238000000000000000000000000000000000000000000000000000000005eac623900000000000000000000000000000000000000000000000000000000647211910000000000000000000000000000000000000000000000000000000045a2cab10000000000000000000000000000000000000000000000000000000058ff9fe500000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb0000000000000000000000000000000000000000000000000000000022e0772c000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff000000000000000000000000000000000000010000000080000000000000000000000000000000000000000000000000000000200000008000000000000000000200000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000005452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30399039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000040000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c1000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f5245454e5452414e4359000000000000000000000000000000000000000000005fd8a132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc8000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712ab4fa3fb3000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df81710000000000000000000000000000000000000000000000000000000008571217000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffeffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000000000000002000000000000000000000000000000000000800000000000000000000000008eabfc2cee883d317bfa1bc6b35c8ed8b90a9288dd10822f462da02177f2a1be0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce932d6d97084c2163485b42b77d74f52baf2e14b443d9c511dfc52958a1290c", + "deployedBytecode": "0x0003000000000002000e000000000002000000000c01034f00020000000c035500000000010c001900000060011002700000044e0010019d000000800d0000390000004000d0043f0000000100200190000000570000c13d0000044e03100197000000040030008c0000081a0000413d00000000010c043b000000e002100270000004500020009c000000610000213d00000000013c034f0000045a0020009c0000007e0000a13d0000045b0020009c000000e70000213d0000045e0020009c000001670000613d0000045f0020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b000000000102041a0000007004100272000007bd0000613d0000046a0010009c0000069d0000813d00000001030000390000078a0000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000010041b0000002001000039000001000010044300000120000004430000044f01000041000011350001042e000004510020009c000000c40000a13d000004520020009c0000014a0000213d000004550020009c000001a80000613d000004560020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d000000000010043f0000000301000039000000200010043f000e0000000c0353113411180000040f0000000e0200035f0000002402200370000000000202043b000000000020043f000000200010043f113411180000040f000002040000013d000004600020009c000002000000613d000004610020009c000002080000613d000004620020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d000000060230006c000006a40000813d000000400100043d000004b002000041000007bf0000013d000004570020009c000002240000613d000004580020009c000003ad0000613d000004590020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d0000002402c00370000000000202043b000e00000002001d000004630020009c0000081a0000213d000000000010043f0000000401000039000000200010043f113411180000040f0000000e02000029000000000020043f000000200010043f113411180000040f000000000101041a0000046402100197000000800020043f0000007001100270000000a00010043f0000048201000041000011350001042e0000045c0020009c000004110000613d0000045d0020009c0000081a0000c13d000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000002401c00370000000000301043b0000049000300198000004910100004100000000010060190000049202300197000000000121019f0000000402c00370000000000202043b000e00000002001d000d00000003001d000000000013004b0000081a0000c13d0000004401c00370000000000101043b000c00000001001d0000044e0010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000301043b000000000103041a00000463011001970000000002000411000000000012004b0000052e0000c13d0000000401300039000600000003001d0000000202300039000700000002001d000000000202041a000800000002001d000a00000001001d000000000101041a000900000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d00000009050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000004720050009c000006c00000413d000000000521004b000006c00000a13d0000000a03000029000000000303041a0000009006300272000006d80000c13d0000049e01000041000000000010043f0000001201000039000000040010043f0000049f010000410000113600010430000004530020009c000004380000613d000004540020009c0000081a0000c13d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000200041a000000010020008c0000045f0000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b000004690000813d000000000010043f000000200020043f113411180000040f11340f760000040f0000000101000039000000000010041b0000000001000019000011350001042e000000a40030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d000004630010009c0000081a0000213d0000004401c00370000000000101043b000c00000001001d000004640010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d0000008401c00370000000000101043b000a00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000c0000006b000004690000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000b0010006b0000000b02008029000b00000002001d0000000a0020006c0000074a0000813d0000000102000039000000000102041a0000000101100039000000000012041b000900000001001d000004a40010009c000008250000413d000000400100043d000004ab02000041000007bf0000013d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010100002900000006020000291134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d0000000602300029000004640020009c000008b60000213d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000006c70000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000481040000410000000105000029000008160000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000101041a000000800010043f0000046601000041000011350001042e000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000f02043b0000048700f0009c0000081a0000213d0000002302f00039000000000032004b0000081a0000813d0000000402f0003900000000022c034f000000000202043b000c00000002001d000004870020009c0000081a0000213d000e002400f0003d0000000c0200002900000005022002100000000e02200029000000000032004b0000081a0000213d0000000c0000006b0000046d0000c13d0000000001000019000011350001042e000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000004640010009c0000081a0000213d0000004402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000504043b000004870050009c000004320000213d00000005045002100000003f064000390000048806600197000004890060009c000004320000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b0000081a0000213d000000000005004b000002530000613d000000a00300003900000000052c034f000000000505043b00000000035304360000002002200039000000000042004b0000024d0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b0000081a0000c13d000000000200041a000000010020008c000006d10000c13d0000000202000039000000000020041b00000464021001970000000e01000029000600000002001d1134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046302200197000200000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000500000003001d0000000602300029000004640020009c000008b60000213d0000046803100197000000000232019f0000000703000029000000000023041b000004690020009c00000aea0000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004810400004100000002050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b000000800100043d000700000001001d000000000001004b000002220000613d0000000004000019000000800100043d000000000041004b00008010030000390000081f0000a13d000900000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b000e00000004001d000000010140008a000000000202041a000000000021004b0000081c0000813d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700000000020300191134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000800000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000040e0000613d0000000d020000290000000201200039000000000101041a000a00000001001d0000000401200039000c00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b070000290000044e037001970000000a02000029000000a0022002700000044e04200197000000000501043b000000000045004b00000000020400190000000002054019000004720070009c0000000d0100002900000003011000390000033e0000413d000000000632004b0000033e0000a13d0000000c09000029000000000509041a0000009007500272000001440000613d00000000033400490000002004500270000004640840019700000000066800a900000000033600d900000464063000d100000000067600d9000000000701041a0000000006670019000000000061041b0000000003340049000000200330021000000473033001970000047404500197000000000334019f000000000223019f000000000029041b000003460000013d000004750070009c000003460000213d000000000053004b000003460000813d0000047603700197000000000232019f0000000c03000029000000000023041b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000802000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000ae70000613d000000000301041a0000046e0030009c0000000c0500002900000f580000813d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000015041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d02000039000000030300003900000486040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b00000009040000290000000104400039000000070040006c000002a80000413d000002220000013d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000301043b000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b000004690000813d000e00000003001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000c00000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000074d0000c13d000000400100043d0000048f02000041000007bf0000013d000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000404043b000600000004001d000004870040009c0000081a0000213d000500240020003d000000060200002900000005022002100000000504200029000000000034004b0000081a0000213d000000000300041a000000010030008c0000045f0000c13d0000000203000039000000000030041b0000003f032000390000048803300197000004890030009c000005040000a13d0000049e01000041000000000010043f0000004101000039000000040010043f0000049f010000410000113600010430000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f113411180000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a0000046301100197000000800010043f0000046301500197000000a00010043f0000046301400197000000c00010043f000000a0014002700000044e01100197000000e00010043f000001000030043f0000044e01200197000001200010043f00000020012002700000046401100197000001400010043f0000009001200270000001600010043f0000046501000041000011350001042e0000047d01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000048a01000041000000c40010043f000004ad0100004100001136000104300000049d01000041000000800010043f000004ac010000410000113600010430000000200e00008a0000000005000019000b0000000f001d0000000004f30049000d00000005001d00000005025002100000000e0220002900000000022c034f000000000202043b000000430440008a0000049a054001970000049a06200197000000000756013f000000000056004b00000000050000190000049a05002041000000000042004b00000000040000190000049a040040410000049a0070009c000000000504c019000000000005004b0000081a0000613d0000000e0420002900000000024c034f000000000b02043b0000048700b0009c0000081a0000213d0000000005b3004900000020044000390000049a065001970000049a07400197000000000867013f000000000067004b00000000060000190000049a06004041000000000054004b00000000050000190000049a050020410000049a0080009c000000000605c019000000000006004b0000081a0000c13d00000000064c034f0000000007eb0170000000400400043d0000000005740019000004a30000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b0000049f0000c13d0000001f08b00190000004b00000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000004b90000c13d00000001060000310000000102000039000004cf0000013d0000044e00b0009c0000044e0b0080410000006001b002100000044e0040009c0000044e040080410000004003400210000000000113019f0000044e0050009c0000044e05008041000000c003500210000000000113019f1134112f0000040f0000000b0f000029000000200e00008a000000800d0000390000000003000031000000020c000367000000010220018f000000000401001900000060044002700001044e0040019d0000044e06400197000000000006004b00000000040d00190000006005000039000004fa0000613d000004b10060009c000004320000813d0000001f046000390000000004e4016f0000003f044000390000000004e4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000004870040009c000004320000213d0000000100700190000004320000c13d000000400040043f00000000046504360000000008e601700000000007840019000004ed0000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000004e90000c13d0000001f06600190000004fa0000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b0000067c0000613d0000000d0500002900000001055000390000000c0050006c000004700000413d000002220000013d000000400100043d0000048b02000041000007bf0000013d0000008003300039000000400030043f0000000603000029000000800030043f0000001f0320018f000000000002004b000005110000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000050d0000c13d000000000003004b000000060000006b000005310000c13d0000000101000039000000000010041b0000002002000039000000400100043d0000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005250000613d000000a0040000390000000005000019000000004604043400000000026204360000000105500039000000000035004b000005200000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e000000400100043d0000049302000041000007bf0000013d0000000002000019000900000002001d0000000502200210000700000002001d0000000501200029000e00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b0000081c0000813d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000b00000001001d000d00000002001d0000000401200039000a00000001001d000000000101041a000c00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000c060000290000044e026001970000000b03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000d070000290000000308700039000b00000008001d000005850000413d000000000521004b000005850000a13d0000000a09000029000000000409041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000019041b0000058d0000013d000004750060009c0000000a030000290000058d0000213d000000000042004b0000058d0000813d0000047602600197000000000121019f000000000013041b0000000e010000290000000201100367000000000101043b000e00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000d0100002900000464011001970000000b03000029000000000303041a000c00000003001d0000000002230049000004b30020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000005ed0000c13d000004640130012a000005f50000013d000004780040009c0000081a0000213d000004641010012a000004642020012a00000000011200a9000004641010012a000000000113004900000479011000d1000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000d0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c000006270000c13d0000000001010433000000000010043f000000010300003100000001020000390000064d0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c0000002005000039000000000503401900000020045001900000063e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000063a0000c13d0000001f055001900000064b0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000d0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d000000800100043d0000000902000029000000000021004b0000081f0000a13d0000000701000029000000a0011000390000000d0300002900000000003104350000000102200039000000060020006c000005320000413d000005140000013d000000400100043d000004b20200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000006900000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000006890000413d0000001f042000390000000004e4016f0000000002230019000000000002043500000044024000390000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f00001136000104300000046b0010009c00000002030000390000078a0000413d0000046c0010009c000007840000813d00000003030000390000078a0000013d000004690020009c000008b60000813d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000007c50000813d000000400100043d0000002402100039000000060300002900000000003204350000047a020000410000000000210435000000040210003900000000030004110000000000320435000000000200041400000001030000290000046303300197000e00000003001d000000040030008c000007cf0000c13d00000001020000390000000001010433000000000010043f0000000103000031000007f70000013d000004750060009c000006ec0000213d000000000032004b000006ec0000813d0000047602600197000000000121019f000006ea0000013d000300010000003d0000046a0010009c000009080000413d0000046b0010009c000300020000003d000009080000413d0000046c0010009c000009010000813d0000000301000039000009070000013d000000400100043d00000044021000390000048a03000041000000000032043500000024021000390000000a0300003900000d460000013d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000006060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f0000000a02000029000000000012041b0000000c01000029000c044e0010019c000007030000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000c0010006b0000000c020080290000000a03000029000000000103041a0000047601100197000000000121019f000000000013041b0000000b0000006b000007080000c13d0000000701000029000000000101041a0000071d0000013d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000000b0010006b0000000b01008029000000a00110021000000494011001970000000703000029000000000203041a0000049502200197000000000121019f000000000013041b000000a0021002700000044e032001970000000a02000029000000000202041a0000044e04200197000000000034004b0000074a0000813d0000000d03000029000004960030009c000008b00000213d0000000d0000006b000008b00000613d0000000d030000290000046404300197000000200320027000000464033001970000000003430019000004640030009c000008b60000213d000004970220019700000020033002100000047303300197000000000223019f0000000a03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000049802000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cb10000c13d00000001020000390000000001030433000000000010043f000000010300003100000cd80000013d000000400100043d000004a302000041000007bf0000013d0000000d020000290000000201200039000000000101041a000900000001001d0000000401200039000a00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000903000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000a9c0000413d000000000521004b00000a9c0000a13d0000000a03000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d90000000d060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000aa40000013d0000046d0010009c00000004030000390000078a0000413d0000046e0010009c000000060300003900000005030040390000000d0030006b000007bd0000813d000b00000004001d000a00000002001d0000000d01000029000e0018001000cd000000000001004b000007960000613d0000000e020000290000000d012000fa000000180010008c000008b60000c13d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000e040000290000000b0340024f0000046f03300197000000ff0040008c0000000003002019000e00000003001d00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000008bc0000c13d000000400100043d000004a102000041000007bf0000013d000000400100043d000004a20200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c70000113600010430000300010000003d0000046a0010009c00000afb0000413d0000046b0010009c000300020000003d00000afb0000413d0000046c0010009c00000af40000813d000000030100003900000afa0000013d0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000047b011001c70000000e02000029113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007e40000c13d000000000005004b000007f50000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004af040000410000000e050000290000000006000411113411250000040f0000000100200190000001630000c13d00000000010000190000113600010430000000400100043d0000049d02000041000007bf0000013d0000049e01000041000000000010043f0000003201000039000000040010043f0000049f0100004100001136000104300000000d010000290000000c020000291134109f0000040f000000400100043d000800000001001d000004a50010009c000004320000213d00000008030000290000010001300039000000400010043f000000c0023000390000000c01000029000600000002001d0000000000120435000000a0023000390000000b01000029000700000002001d000000000012043500000080023000390000049601000041000500000002001d000000000012043500000060023000390000000a01000029000400000002001d000000000012043500000040023000390000000d01000029000200000002001d000000000012043500000020023000390000000e01000029000100000002001d000000000012043500000000010004110000000000130435000000e001300039000300000001001d00000000000104350000000901000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000080200002900000000020204330000046302200197000000000101043b000000000301041a000004a603300197000000000223019f000000000021041b0000000102000029000000000202043300000463022001970000000103100039000000000403041a000004a604400197000000000224019f000000000023041b0000000202000029000000000202043300000463022001970000000203100039000000000403041a000004a704400197000000000224019f00000004040000290000000004040433000000a0044002100000049404400197000000000242019f000000000023041b000000050200002900000000020204330000000303100039000000000023041b0000000302000029000000000202043300000090022002100000000603000029000000000303043300000020033002100000047303300197000000000232019f000000070300002900000000030304330000044e03300197000000000232019f0000000401100039000000000021041b000000400100043d00000060021000390000000a03000029000000000032043500000040021000390000000b03000029000000000032043500000020021000390000000c030000290000000000320435000000090200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a8011001c70000800d020000390000000403000039000004a9040000410000000e050000290000000d060000290000000007000411113411250000040f00000001002001900000081a0000613d0000000101000039000000000010041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e010080410000004001100210000004aa011001c7000011350001042e0000000d030000290000049a0030009c00000d240000413d0000000d03000029000004910030009c00000c920000c13d0000049e01000041000000000010043f0000001101000039000000040010043f0000049f0100004100001136000104300000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000000000101041a000800000001001d000700000002001d0000000401200039000900000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000d510000413d000000000521004b00000d510000a13d0000000903000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000007060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000d590000013d0000046d0010009c000300040000003d000009080000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c050000290000000308500039000009590000413d000000000521004b000009590000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f0000095f0000013d000004750060009c000009610000213d000000000042004b000009610000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d0000000001000411000000000010043f0000000301000039000000200010043f000000050000006b0000099e0000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b000009d90000c13d000004640120012a000009e00000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000a5c0000c13d000004640330012a00000464023000d1000000000003004b00000a660000c13d00000a690000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000a120000c13d0000000001010433000000000010043f0000000103000031000000010200003900000a380000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000a290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000a250000c13d0000001f0550019000000a360000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000a8c0000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000a690000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000030020006c0000090c0000413d000001ef0000013d0000000b04000029000004750040009c00000aa60000213d000000000032004b00000aa60000813d0000000b020000290000047602200197000000000121019f0000000a02000029000000000012041b0000000d010000290000000301100039000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000f550000c13d000000400100043d0000048e02000041000007bf0000013d000400010000003d0000046a0020009c00000dba0000413d0000046b0020009c000400020000003d00000dba0000413d0000046c0020009c00000db30000813d000000030100003900000db90000013d0000046d0010009c000300040000003d00000afb0000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000e00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000d00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030950003900000b4d0000413d000000000521004b00000b4d0000a13d0000000d08000029000000000408041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000609041a0000000005560019000000000059041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000018041b00000b550000013d000004750060009c0000000d0300002900000b550000213d000000000042004b00000b550000813d0000047602600197000000000121019f000000000013041b000c00000009001d000000050000006b00000c150000613d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b00000b920000c13d000004640120012a00000b990000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000bcb0000c13d0000000001010433000000000010043f0000000103000031000000010200003900000bf10000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000be20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000bde0000c13d0000001f0550019000000bef0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f000000010020019000000c830000c13d0000081a0000013d0000000701000029000000000101041a000004640110019800000b580000613d000b00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000c560000c13d000004640230012a00000464032000d1000000000002004b00000c600000c13d00000c630000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479022000d100000464032000d1000000000002004b00000c630000613d00000000022300d9000004640020009c000008b60000c13d0000000b023000fa000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000d04000029000000000104041a0000009002100270000000060220006a000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000014041b00000009020000290000000102200039000000030020006c00000aff0000413d000006ac0000013d0000000d030000290000000003300089000004640430019700000020032002700000046405300197000000000054004b00000000040580190000000003430049000000200330021000000473033001970000049702200197000000000223019f0000000a03000029000000000023041b000000400300043d000000240230003900000000004204350000047a02000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cee0000c13d00000001020000390000000001030433000000000010043f000000010300003100000d150000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000cc90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000cc50000c13d000000000005004b00000cd60000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000ce70000613d000000000141016f000000000113019f000000010010019000000d240000c13d000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000d460000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000d060000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d020000c13d000000000005004b00000d130000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d0000000701000029000000000101041a0000000a02000029000000000202041a0000044e02200197000000400300043d00000020043000390000000000240435000000a0011002700000044e01100197000000400230003900000000001204350000000d0100002900000000001304350000044e0030009c0000044e03008041000000400130021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000049b011001c70000800d0200003900000002030000390000049c040000410000000e05000029000008170000013d000000400100043d00000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300000000b04000029000004750040009c00000d5b0000213d000000000032004b00000d5b0000813d0000000b020000290000047602200197000000000121019f0000000902000029000000000012041b0000000c0000006b00000d630000c13d0000000a01000029000000000101041a000004640310019700000007010000290000000e0200002911340fbe0000040f0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000001041b0000000a01000029000000000101041a00000464021001970000000901000029000000000101041a00000090031002700000000002230049000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000902000029000000000012041b0000000a01000029000000000101041a00000070021002700000000d03000029000000050030008c00000da50000213d0000049a03000041000000010400008a0000049a0030009c000000000400c0190000000d03000029000000060330008900000018033000ca000001000530008900000000045401cf000004740530027f000000000445019f0000047404006041000004750330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f00000464011001970000007002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d020000390000000303000039000004a004000041000008150000013d0000046d0020009c000400040000003d00000dba0000413d0000046e0010009c00000006010000390000000501004039000400000001001d0000000501000029000004641010012a000300000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030850003900000e0b0000413d000000000521004b00000e0b0000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f00000e110000013d000004750060009c00000e130000213d000000000042004b00000e130000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b00000e530000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000005322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000005021000b9000000000323004b00000000040000390000000104004039000000000343004b00000e8e0000c13d000004640120012a00000e950000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000005433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000005032000b9000000000434004b00000000050000390000000105004039000000000454004b00000f110000c13d000004640330012a00000464023000d1000000000003004b00000f1b0000c13d00000f1e0000013d000004780030009c0000081a0000213d000004641010012a00000003011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000ec70000c13d0000000001010433000000000010043f0000000103000031000000010200003900000eed0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000ede0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000eda0000c13d0000001f0550019000000eeb0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000f410000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000003022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000f1e0000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000040020006c00000dbe0000413d0000028d0000013d000000000001042f000000400100043d000004ae02000041000007bf0000013d000000000301041a000004830030009c00000f5b0000a13d000000400100043d0000048d02000041000007bf0000013d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b0000000a01000029000000000101041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d0200003900000003030000390000048604000041000008150000013d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000fb70000613d00000003060000290000044e026001970000000203000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720060009c00000fae0000413d000000000521004b00000fae0000a13d0000000408000029000000000308041a000000900630027200000fb80000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000fb50000013d000004750060009c000000040800002900000fb60000213d000000000032004b00000fb60000813d0000047602600197000000000121019f000000000018041b000000000001042d000000000001042f0000049e01000041000000000010043f0000001201000039000000040010043f0000049f0100004100001136000104300004000000000002000200000003001d000400000002001d000300000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b000000000101041a000000000001004b000010870000613d00000003020000290000000302200039000000000202041a000100000002001d0000000001120049000004b30010009c000000000301001900000000030060190000000202000029000004640220019700000000432300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000032100a9000000000434004b00000000050000390000000105004039000000000454004b00000fff0000c13d000004640130012a000010070000013d000004780040009c000010850000213d000004642020012a000004641010012a00000000012100a9000004641010012a000000000113004900000479011000d1000200000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000102000029000000000021041b00000003010000290000000201100039000000000201041a000000400100043d0000002403100039000000020400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c0000103a0000c13d00000001020000390000000001010433000000000010043f0000000103000031000010610000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010520000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000104e0000c13d000000000005004b0000105f0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d00000001002001900000108f0000613d000000000254016f000000000223019f00000001002001900000108f0000613d000000020200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004800400004100000004050000290000000006000411113411250000040f0000000100200190000010850000613d000000000001042d00000000010000190000113600010430000000400100043d000004ae0200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c7000011360001043000000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300002000000000002000100000002001d000004b4020000410000000000200443000200000001001d000000040010044300000000010004140000044e0010009c0000044e01008041000000c001100210000004b5011001c700008002020000391134112a0000040f0000000100200190000010fe0000613d000000400300043d000000000101043b000000000001004b000010ff0000613d00000044013000390000000102000029000000000021043500000024013000390000000002000410000000000021043500000498010000410000000000130435000000040130003900000000020004110000000000210435000000000100041400000002020000290000046302200197000000040020008c000010c70000c13d00000001020000390000000001030433000000000010043f0000000103000031000010ee0000013d0000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010df0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010db0000c13d000000000005004b000010ec0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011060000613d000000000141016f000000000113019f0000000100100190000011060000613d000000000001042d000000000001042f000004b60100004100000000001304350000044e0030009c0000044e0300804100000040013002100000048c011001c70000113600010430000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c70000113600010430000000000001042f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000011230000613d000000000101043b000000000001042d0000000001000019000011360001043000001128002104210000000102000039000000000001042d0000000002000019000000000001042d0000112d002104230000000102000039000000000001042d0000000002000019000000000001042d00001132002104250000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000711c316a0000000000000000000000000000000000000000000000000000000093d1692e00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b90000000000000000000000000000000000000000000000000000000093d1692f00000000000000000000000000000000000000000000000000000000cc40105800000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000045a2cab0000000000000000000000000000000000000000000000000000000005eac6238000000000000000000000000000000000000000000000000000000005eac623900000000000000000000000000000000000000000000000000000000647211910000000000000000000000000000000000000000000000000000000045a2cab10000000000000000000000000000000000000000000000000000000058ff9fe500000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb0000000000000000000000000000000000000000000000000000000022e0772c000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff000000000000000000000000000000000000010000000080000000000000000000000000000000000000000000000000000000200000008000000000000000000200000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000005452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30399039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000040000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c1000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f5245454e5452414e4359000000000000000000000000000000000000000000005fd8a132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc8000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712ab4fa3fb3000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df81710000000000000000000000000000000000000000000000000000000008571217000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffeffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000000000000002000000000000000000000000000000000000800000000000000000000000008eabfc2cee883d317bfa1bc6b35c8ed8b90a9288dd10822f462da02177f2a1be0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce932d6d97084c2163485b42b77d74f52baf2e14b443d9c511dfc52958a1290c", + "devdoc": { + "kind": "dev", + "methods": { + "unsubscribeFromIncentive(address,uint256,bool)": { + "params": { + "incentiveIndex": "∈ [0,5]" + } + } + }, + "stateVariables": { + "rewardPerLiquidityLast": { + "details": "rewardPerLiquidityLast[user][incentiveId]Semantic overload: if value is zero user isn't subscribed to the incentive." + }, + "userStakes": { + "details": "userStakes[user][stakedToken]" + } + }, + "title": "Fork of https://github.com/sushiswap/StakingContract", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Permissionless staking contract that allows any number of incentives to be running for any token (erc20). Incentives can be created by anyone, the total reward amount must be sent at creation. Incentives can be updated (change reward rate / duration). Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 90174, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "locked", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 34, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "incentiveCount", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 39, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "incentives", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_struct(Incentive)32_storage)" + }, + { + "astId": 46, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardPerLiquidityLast", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))" + }, + { + "astId": 54, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "userStakes", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_mapping(t_address,t_struct(UserStake)59_storage))" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_struct(UserStake)59_storage))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => struct StakingContractMainnet.UserStake))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_struct(UserStake)59_storage)" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_uint256,t_uint256)" + }, + "t_mapping(t_address,t_struct(UserStake)59_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct StakingContractMainnet.UserStake)", + "numberOfBytes": "32", + "value": "t_struct(UserStake)59_storage" + }, + "t_mapping(t_uint256,t_struct(Incentive)32_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct StakingContractMainnet.Incentive)", + "numberOfBytes": "32", + "value": "t_struct(Incentive)32_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(Incentive)32_storage": { + "encoding": "inplace", + "label": "struct StakingContractMainnet.Incentive", + "members": [ + { + "astId": 17, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "creator", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 19, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "token", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 21, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardToken", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 23, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "endTime", + "offset": 20, + "slot": "2", + "type": "t_uint32" + }, + { + "astId": 25, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardPerLiquidity", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 27, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "lastRewardTime", + "offset": 0, + "slot": "4", + "type": "t_uint32" + }, + { + "astId": 29, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "rewardRemaining", + "offset": 4, + "slot": "4", + "type": "t_uint112" + }, + { + "astId": 31, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "liquidityStaked", + "offset": 18, + "slot": "4", + "type": "t_uint112" + } + ], + "numberOfBytes": "160" + }, + "t_struct(UserStake)59_storage": { + "encoding": "inplace", + "label": "struct StakingContractMainnet.UserStake", + "members": [ + { + "astId": 56, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "liquidity", + "offset": 0, + "slot": "0", + "type": "t_uint112" + }, + { + "astId": 58, + "contract": "contracts/Rewards/StakingContractMainnet.sol:StakingContractMainnet", + "label": "subscribedIncentiveIds", + "offset": 14, + "slot": "0", + "type": "t_uint144" + } + ], + "numberOfBytes": "32" + }, + "t_uint112": { + "encoding": "inplace", + "label": "uint112", + "numberOfBytes": "14" + }, + "t_uint144": { + "encoding": "inplace", + "label": "uint144", + "numberOfBytes": "18" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + } + } + }, + "factoryDeps": [ + "0x0003000000000002000e000000000002000000000c01034f00020000000c035500000000010c001900000060011002700000044e0010019d000000800d0000390000004000d0043f0000000100200190000000570000c13d0000044e03100197000000040030008c0000081a0000413d00000000010c043b000000e002100270000004500020009c000000610000213d00000000013c034f0000045a0020009c0000007e0000a13d0000045b0020009c000000e70000213d0000045e0020009c000001670000613d0000045f0020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b000000000102041a0000007004100272000007bd0000613d0000046a0010009c0000069d0000813d00000001030000390000078a0000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000010041b0000002001000039000001000010044300000120000004430000044f01000041000011350001042e000004510020009c000000c40000a13d000004520020009c0000014a0000213d000004550020009c000001a80000613d000004560020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d000000000010043f0000000301000039000000200010043f000e0000000c0353113411180000040f0000000e0200035f0000002402200370000000000202043b000000000020043f000000200010043f113411180000040f000002040000013d000004600020009c000002000000613d000004610020009c000002080000613d000004620020009c0000081a0000c13d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d000000060230006c000006a40000813d000000400100043d000004b002000041000007bf0000013d000004570020009c000002240000613d000004580020009c000003ad0000613d000004590020009c0000081a0000c13d000000440030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000004630010009c0000081a0000213d0000002402c00370000000000202043b000e00000002001d000004630020009c0000081a0000213d000000000010043f0000000401000039000000200010043f113411180000040f0000000e02000029000000000020043f000000200010043f113411180000040f000000000101041a0000046402100197000000800020043f0000007001100270000000a00010043f0000048201000041000011350001042e0000045c0020009c000004110000613d0000045d0020009c0000081a0000c13d000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000002401c00370000000000301043b0000049000300198000004910100004100000000010060190000049202300197000000000121019f0000000402c00370000000000202043b000e00000002001d000d00000003001d000000000013004b0000081a0000c13d0000004401c00370000000000101043b000c00000001001d0000044e0010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000301043b000000000103041a00000463011001970000000002000411000000000012004b0000052e0000c13d0000000401300039000600000003001d0000000202300039000700000002001d000000000202041a000800000002001d000a00000001001d000000000101041a000900000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d00000009050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b000000000104001900000000010340190000000006050019000004720050009c000006c00000413d000000000521004b000006c00000a13d0000000a03000029000000000303041a0000009006300272000006d80000c13d0000049e01000041000000000010043f0000001201000039000000040010043f0000049f010000410000113600010430000004530020009c000004380000613d000004540020009c0000081a0000c13d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000200041a000000010020008c0000045f0000c13d0000000202000039000000000020041b000000010310008a0000000104000039000000000404041a000000000043004b000004690000813d000000000010043f000000200020043f113411180000040f11340f760000040f0000000101000039000000000010041b0000000001000019000011350001042e000000a40030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000d00000001001d000004630010009c0000081a0000213d0000004401c00370000000000101043b000c00000001001d000004640010009c0000081a0000213d0000006401c00370000000000101043b000b00000001001d0000044e0010009c0000081a0000213d0000008401c00370000000000101043b000a00000001001d0000044e0010009c0000081a0000213d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b0000000c0000006b000004690000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000b0010006b0000000b02008029000b00000002001d0000000a0020006c0000074a0000813d0000000102000039000000000102041a0000000101100039000000000012041b000900000001001d000004a40010009c000008250000413d000000400100043d000004ab02000041000007bf0000013d000000640030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000100000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000600000001001d000004640010009c0000081a0000213d0000004401c00370000000000201043b000000000002004b0000000001000039000000010100c039000500000002001d000000000012004b0000081a0000c13d000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010100002900000006020000291134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000102000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000400000003001d0000000602300029000004640020009c000008b60000213d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000006c70000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000481040000410000000105000029000008160000013d0000000001000416000000000001004b0000081a0000c13d0000000101000039000000000101041a000000800010043f0000046601000041000011350001042e000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000f02043b0000048700f0009c0000081a0000213d0000002302f00039000000000032004b0000081a0000813d0000000402f0003900000000022c034f000000000202043b000c00000002001d000004870020009c0000081a0000213d000e002400f0003d0000000c0200002900000005022002100000000e02200029000000000032004b0000081a0000213d0000000c0000006b0000046d0000c13d0000000001000019000011350001042e000000840030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000e00000001001d000004630010009c0000081a0000213d0000002401c00370000000000101043b000004640010009c0000081a0000213d0000004402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000504043b000004870050009c000004320000213d00000005045002100000003f064000390000048806600197000004890060009c000004320000213d0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b0000081a0000213d000000000005004b000002530000613d000000a00300003900000000052c034f000000000505043b00000000035304360000002002200039000000000042004b0000024d0000413d0000006402c00370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b0000081a0000c13d000000000200041a000000010020008c000006d10000c13d0000000202000039000000000020041b00000464021001970000000e01000029000600000002001d1134109f0000040f0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046302200197000200000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000700000001001d000000000101041a0000046403100197000500000003001d0000000602300029000004640020009c000008b60000213d0000046803100197000000000232019f0000000703000029000000000023041b000004690020009c00000aea0000813d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004810400004100000002050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b000000800100043d000700000001001d000000000001004b000002220000613d0000000004000019000000800100043d000000000041004b00008010030000390000081f0000a13d000900000004001d0000000501400210000000a00110003900000000040104330000000201000039000000000010041b000e00000004001d000000010140008a000000000202041a000000000021004b0000081c0000813d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700000000020300191134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000800000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000040e0000613d0000000d020000290000000201200039000000000101041a000a00000001001d0000000401200039000c00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b070000290000044e037001970000000a02000029000000a0022002700000044e04200197000000000501043b000000000045004b00000000020400190000000002054019000004720070009c0000000d0100002900000003011000390000033e0000413d000000000632004b0000033e0000a13d0000000c09000029000000000509041a0000009007500272000001440000613d00000000033400490000002004500270000004640840019700000000066800a900000000033600d900000464063000d100000000067600d9000000000701041a0000000006670019000000000061041b0000000003340049000000200330021000000473033001970000047404500197000000000334019f000000000223019f000000000029041b000003460000013d000004750070009c000003460000213d000000000053004b000003460000813d0000047603700197000000000232019f0000000c03000029000000000023041b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000802000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000ae70000613d000000000301041a0000046e0030009c0000000c0500002900000f580000813d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b000000000105041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000015041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d02000039000000030300003900000486040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d0000000102000039000000000020041b00000009040000290000000104400039000000070040006c000002a80000413d000002220000013d000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000301043b000000000100041a000000010010008c0000045f0000c13d0000000201000039000000000010041b000000010130008a0000000102000039000000000202041a000000000021004b000004690000813d000e00000003001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000005010000c13d0000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000d00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000c00000002001d000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a00000464001001980000074d0000c13d000000400100043d0000048f02000041000007bf0000013d000000240030008c0000081a0000413d0000000002000416000000000002004b0000081a0000c13d0000000402c00370000000000202043b000004870020009c0000081a0000213d0000002304200039000000000034004b0000081a0000813d000000040420003900000000044c034f000000000404043b000600000004001d000004870040009c0000081a0000213d000500240020003d000000060200002900000005022002100000000504200029000000000034004b0000081a0000213d000000000300041a000000010030008c0000045f0000c13d0000000203000039000000000030041b0000003f032000390000048803300197000004890030009c000005040000a13d0000049e01000041000000000010043f0000004101000039000000040010043f0000049f010000410000113600010430000000240030008c0000081a0000413d0000000001000416000000000001004b0000081a0000c13d0000000401c00370000000000101043b000000000010043f0000000201000039000000200010043f113411180000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a0000046301100197000000800010043f0000046301500197000000a00010043f0000046301400197000000c00010043f000000a0014002700000044e01100197000000e00010043f000001000030043f0000044e01200197000001200010043f00000020012002700000046401100197000001400010043f0000009001200270000001600010043f0000046501000041000011350001042e0000047d01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000048a01000041000000c40010043f000004ad0100004100001136000104300000049d01000041000000800010043f000004ac010000410000113600010430000000200e00008a0000000005000019000b0000000f001d0000000004f30049000d00000005001d00000005025002100000000e0220002900000000022c034f000000000202043b000000430440008a0000049a054001970000049a06200197000000000756013f000000000056004b00000000050000190000049a05002041000000000042004b00000000040000190000049a040040410000049a0070009c000000000504c019000000000005004b0000081a0000613d0000000e0420002900000000024c034f000000000b02043b0000048700b0009c0000081a0000213d0000000005b3004900000020044000390000049a065001970000049a07400197000000000867013f000000000067004b00000000060000190000049a06004041000000000054004b00000000050000190000049a050020410000049a0080009c000000000605c019000000000006004b0000081a0000c13d00000000064c034f0000000007eb0170000000400400043d0000000005740019000004a30000613d000000000806034f0000000009040019000000008a08043c0000000009a90436000000000059004b0000049f0000c13d0000001f08b00190000004b00000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005b40019000000000005043500000000050004140000000002000410000000040020008c000004b90000c13d00000001060000310000000102000039000004cf0000013d0000044e00b0009c0000044e0b0080410000006001b002100000044e0040009c0000044e040080410000004003400210000000000113019f0000044e0050009c0000044e05008041000000c003500210000000000113019f1134112f0000040f0000000b0f000029000000200e00008a000000800d0000390000000003000031000000020c000367000000010220018f000000000401001900000060044002700001044e0040019d0000044e06400197000000000006004b00000000040d00190000006005000039000004fa0000613d000004b10060009c000004320000813d0000001f046000390000000004e4016f0000003f044000390000000004e4016f000000400500043d0000000004450019000000000054004b00000000070000390000000107004039000004870040009c000004320000213d0000000100700190000004320000c13d000000400040043f00000000046504360000000008e601700000000007840019000004ed0000613d000000000901034f000000000a040019000000009b09043c000000000aba043600000000007a004b000004e90000c13d0000001f06600190000004fa0000613d000000000881034f0000000306600210000000000907043300000000096901cf000000000969022f000000000808043b0000010006600089000000000868022f00000000066801cf000000000696019f0000000000670435000000000002004b0000067c0000613d0000000d0500002900000001055000390000000c0050006c000004700000413d000002220000013d000000400100043d0000048b02000041000007bf0000013d0000008003300039000000400030043f0000000603000029000000800030043f0000001f0320018f000000000002004b000005110000613d000000a002200039000000a004000039000000001501043c0000000004540436000000000024004b0000050d0000c13d000000000003004b000000060000006b000005310000c13d0000000101000039000000000010041b0000002002000039000000400100043d0000000002210436000000800300043d00000000003204350000004002100039000000000003004b000005250000613d000000a0040000390000000005000019000000004604043400000000026204360000000105500039000000000035004b000005200000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e000000400100043d0000049302000041000007bf0000013d0000000002000019000900000002001d0000000502200210000700000002001d0000000501200029000e00000001001d0000000201100367000000000101043b000000010210008a0000000103000039000000000303041a000000000032004b0000081c0000813d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000b00000001001d000d00000002001d0000000401200039000a00000001001d000000000101041a000c00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000c060000290000044e026001970000000b03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000d070000290000000308700039000b00000008001d000005850000413d000000000521004b000005850000a13d0000000a09000029000000000409041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000019041b0000058d0000013d000004750060009c0000000a030000290000058d0000213d000000000042004b0000058d0000813d0000047602600197000000000121019f000000000013041b0000000e010000290000000201100367000000000101043b000e00000001001d0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d020000290000000102200039000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000d0100002900000464011001970000000b03000029000000000303041a000c00000003001d0000000002230049000004b30020009c0000000003020019000000000300601900000000431300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000031200a9000000000434004b00000000050000390000000105004039000000000454004b000005ed0000c13d000004640130012a000005f50000013d000004780040009c0000081a0000213d000004641010012a000004642020012a00000000011200a9000004641010012a000000000113004900000479011000d1000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000d0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c000006270000c13d0000000001010433000000000010043f000000010300003100000001020000390000064d0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c0000002005000039000000000503401900000020045001900000063e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000063a0000c13d0000001f055001900000064b0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000d0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f00000001002001900000081a0000613d000000800100043d0000000902000029000000000021004b0000081f0000a13d0000000701000029000000a0011000390000000d0300002900000000003104350000000102200039000000060020006c000005320000413d000005140000013d000000400100043d000004b20200004100000000002104350000000402100039000000200300003900000000003204350000000002050433000000240310003900000000002304350000004403100039000000000002004b000006900000613d000000000500001900000000063500190000000007540019000000000707043300000000007604350000002005500039000000000025004b000006890000413d0000001f042000390000000004e4016f0000000002230019000000000002043500000044024000390000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f00001136000104300000046b0010009c00000002030000390000078a0000413d0000046c0010009c000007840000813d00000003030000390000078a0000013d000004690020009c000008b60000813d0000046801100197000000000112019f0000000702000029000000000012041b000004690010009c000007c50000813d000000400100043d0000002402100039000000060300002900000000003204350000047a020000410000000000210435000000040210003900000000030004110000000000320435000000000200041400000001030000290000046303300197000e00000003001d000000040030008c000007cf0000c13d00000001020000390000000001010433000000000010043f0000000103000031000007f70000013d000004750060009c000006ec0000213d000000000032004b000006ec0000813d0000047602600197000000000121019f000006ea0000013d000300010000003d0000046a0010009c000009080000413d0000046b0010009c000300020000003d000009080000413d0000046c0010009c000009010000813d0000000301000039000009070000013d000000400100043d00000044021000390000048a03000041000000000032043500000024021000390000000a0300003900000d460000013d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000006060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f0000000a02000029000000000012041b0000000c01000029000c044e0010019c000007030000613d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000044e021001970000000c0010006b0000000c020080290000000a03000029000000000103041a0000047601100197000000000121019f000000000013041b0000000b0000006b000007080000c13d0000000701000029000000000101041a0000071d0000013d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d000000000101043b0000000b0010006b0000000b01008029000000a00110021000000494011001970000000703000029000000000203041a0000049502200197000000000121019f000000000013041b000000a0021002700000044e032001970000000a02000029000000000202041a0000044e04200197000000000034004b0000074a0000813d0000000d03000029000004960030009c000008b00000213d0000000d0000006b000008b00000613d0000000d030000290000046404300197000000200320027000000464033001970000000003430019000004640030009c000008b60000213d000004970220019700000020033002100000047303300197000000000223019f0000000a03000029000000000023041b000000400300043d000000440230003900000000004204350000002402300039000000000400041000000000004204350000049802000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cb10000c13d00000001020000390000000001030433000000000010043f000000010300003100000cd80000013d000000400100043d000004a302000041000007bf0000013d0000000d020000290000000201200039000000000101041a000900000001001d0000000401200039000a00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000903000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000a9c0000413d000000000521004b00000a9c0000a13d0000000a03000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d90000000d060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000aa40000013d0000046d0010009c00000004030000390000078a0000413d0000046e0010009c000000060300003900000005030040390000000d0030006b000007bd0000813d000b00000004001d000a00000002001d0000000d01000029000e0018001000cd000000000001004b000007960000613d0000000e020000290000000d012000fa000000180010008c000008b60000c13d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000e040000290000000b0340024f0000046f03300197000000ff0040008c0000000003002019000e00000003001d00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b000008bc0000c13d000000400100043d000004a102000041000007bf0000013d000000400100043d000004a20200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c70000113600010430000300010000003d0000046a0010009c00000afb0000413d0000046b0010009c000300020000003d00000afb0000413d0000046c0010009c00000af40000813d000000030100003900000afa0000013d0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000047b011001c70000000e02000029113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007e40000c13d000000000005004b000007f50000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d000000400100043d000000060200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004af040000410000000e050000290000000006000411113411250000040f0000000100200190000001630000c13d00000000010000190000113600010430000000400100043d0000049d02000041000007bf0000013d0000049e01000041000000000010043f0000003201000039000000040010043f0000049f0100004100001136000104300000000d010000290000000c020000291134109f0000040f000000400100043d000800000001001d000004a50010009c000004320000213d00000008030000290000010001300039000000400010043f000000c0023000390000000c01000029000600000002001d0000000000120435000000a0023000390000000b01000029000700000002001d000000000012043500000080023000390000049601000041000500000002001d000000000012043500000060023000390000000a01000029000400000002001d000000000012043500000040023000390000000d01000029000200000002001d000000000012043500000020023000390000000e01000029000100000002001d000000000012043500000000010004110000000000130435000000e001300039000300000001001d00000000000104350000000901000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000080200002900000000020204330000046302200197000000000101043b000000000301041a000004a603300197000000000223019f000000000021041b0000000102000029000000000202043300000463022001970000000103100039000000000403041a000004a604400197000000000224019f000000000023041b0000000202000029000000000202043300000463022001970000000203100039000000000403041a000004a704400197000000000224019f00000004040000290000000004040433000000a0044002100000049404400197000000000242019f000000000023041b000000050200002900000000020204330000000303100039000000000023041b0000000302000029000000000202043300000090022002100000000603000029000000000303043300000020033002100000047303300197000000000232019f000000070300002900000000030304330000044e03300197000000000232019f0000000401100039000000000021041b000000400100043d00000060021000390000000a03000029000000000032043500000040021000390000000b03000029000000000032043500000020021000390000000c030000290000000000320435000000090200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a8011001c70000800d020000390000000403000039000004a9040000410000000e050000290000000d060000290000000007000411113411250000040f00000001002001900000081a0000613d0000000101000039000000000010041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e010080410000004001100210000004aa011001c7000011350001042e0000000d030000290000049a0030009c00000d240000413d0000000d03000029000004910030009c00000c920000c13d0000049e01000041000000000010043f0000001101000039000000040010043f0000049f0100004100001136000104300000000e01000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000000000101041a000800000001001d000700000002001d0000000401200039000900000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b050000290000044e025001970000000803000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720050009c00000d510000413d000000000521004b00000d510000a13d0000000903000029000000000303041a0000009006300272000001440000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000007060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000d590000013d0000046d0010009c000300040000003d000009080000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c050000290000000308500039000009590000413d000000000521004b000009590000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f0000095f0000013d000004750060009c000009610000213d000000000042004b000009610000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d0000000001000411000000000010043f0000000301000039000000200010043f000000050000006b0000099e0000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b000009d90000c13d000004640120012a000009e00000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000a5c0000c13d000004640330012a00000464023000d1000000000003004b00000a660000c13d00000a690000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000a120000c13d0000000001010433000000000010043f0000000103000031000000010200003900000a380000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000a290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000a250000c13d0000001f0550019000000a360000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000a8c0000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000a690000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000030020006c0000090c0000413d000001ef0000013d0000000b04000029000004750040009c00000aa60000213d000000000032004b00000aa60000813d0000000b020000290000047602200197000000000121019f0000000a02000029000000000012041b0000000d010000290000000301100039000000000101041a000d00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000202041a0000046302200197000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e020000290000046f0220019800000f550000c13d000000400100043d0000048e02000041000007bf0000013d000400010000003d0000046a0020009c00000dba0000413d0000046b0020009c000400020000003d00000dba0000413d0000046c0020009c00000db30000813d000000030100003900000db90000013d0000046d0010009c000300040000003d00000afb0000413d0000046e0010009c00000006010000390000000501004039000300000001001d0000000401000029000004641010012a000200000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000e00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000d00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030950003900000b4d0000413d000000000521004b00000b4d0000a13d0000000d08000029000000000408041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000609041a0000000005560019000000000059041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f000000000018041b00000b550000013d000004750060009c0000000d0300002900000b550000213d000000000042004b00000b550000813d0000047602600197000000000121019f000000000013041b000c00000009001d000000050000006b00000c150000613d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000004322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000004021000b9000000000323004b00000000040000390000000104004039000000000343004b00000b920000c13d000004640120012a00000b990000013d000004780030009c0000081a0000213d000004641010012a00000002011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000bcb0000c13d0000000001010433000000000010043f0000000103000031000000010200003900000bf10000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000be20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000bde0000c13d0000001f0550019000000bef0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000e050000290000000006000411113411250000040f000000010020019000000c830000c13d0000081a0000013d0000000701000029000000000101041a000004640110019800000b580000613d000b00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000004433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000004032000b9000000000434004b00000000050000390000000105004039000000000454004b00000c560000c13d000004640230012a00000464032000d1000000000002004b00000c600000c13d00000c630000013d000004780040009c0000081a0000213d000004642020012a00000002022000b9000004642020012a000000000223004900000479022000d100000464032000d1000000000002004b00000c630000613d00000000022300d9000004640020009c000008b60000c13d0000000b023000fa000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000d04000029000000000104041a0000009002100270000000060220006a000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f000000000014041b00000009020000290000000102200039000000030020006c00000aff0000413d000006ac0000013d0000000d030000290000000003300089000004640430019700000020032002700000046405300197000000000054004b00000000040580190000000003430049000000200330021000000473033001970000049702200197000000000223019f0000000a03000029000000000023041b000000400300043d000000240230003900000000004204350000047a02000041000000000023043500000004023000390000000004000411000000000042043500000000040004140000046302100197000000040020008c00000cee0000c13d00000001020000390000000001030433000000000010043f000000010300003100000d150000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000cc90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000cc50000c13d000000000005004b00000cd60000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000ce70000613d000000000141016f000000000113019f000000010010019000000d240000c13d000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000d460000013d0000044e0030009c0000044e0300804100000040013002100000044e0040009c0000044e04008041000000c003400210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000d060000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d020000c13d000000000005004b00000d130000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b00000000030000390000000103006039000000010020019000000d400000613d000000000141016f000000000113019f000000010010019000000d400000613d0000000701000029000000000101041a0000000a02000029000000000202041a0000044e02200197000000400300043d00000020043000390000000000240435000000a0011002700000044e01100197000000400230003900000000001204350000000d0100002900000000001304350000044e0030009c0000044e03008041000000400130021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000049b011001c70000800d0200003900000002030000390000049c040000410000000e05000029000008170000013d000000400100043d00000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300000000b04000029000004750040009c00000d5b0000213d000000000032004b00000d5b0000813d0000000b020000290000047602200197000000000121019f0000000902000029000000000012041b0000000c0000006b00000d630000c13d0000000a01000029000000000101041a000004640310019700000007010000290000000e0200002911340fbe0000040f0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000001041b0000000a01000029000000000101041a00000464021001970000000901000029000000000101041a00000090031002700000000002230049000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000902000029000000000012041b0000000a01000029000000000101041a00000070021002700000000d03000029000000050030008c00000da50000213d0000049a03000041000000010400008a0000049a0030009c000000000400c0190000000d03000029000000060330008900000018033000ca000001000530008900000000045401cf000004740530027f000000000445019f0000047404006041000004750330027f000000000332016f0000001804400210000000000242016f0000001802200270000000000232019f00000464011001970000007002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d020000390000000303000039000004a004000041000008150000013d0000046d0020009c000400040000003d00000dba0000413d0000046e0010009c00000006010000390000000501004039000400000001001d0000000501000029000004641010012a000300000001001d0000000002000019000900000002001d00000018012000c90000000702000029000000000202041a0000007002200270000000000112022f0000046f01100197000d00000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000201043b0000000201200039000800000001001d000000000101041a000a00000001001d000c00000002001d0000000401200039000e00000001001d000000000101041a000b00000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000f510000613d0000000b060000290000044e026001970000000a03000029000000a0033002700000044e03300197000000000401043b000000000034004b00000000010300190000000001044019000004720060009c0000000c05000029000000030850003900000e0b0000413d000000000521004b00000e0b0000a13d0000000e04000029000000000404041a0000009006400272000001440000613d00000000022300490000002003400270000004640730019700000000055700a900000000022500d900000464052000d100000000056500d9000000000608041a0000000005560019000000000058041b0000000002230049000000200220021000000473022001970000047403400197000000000223019f000000000112019f00000e110000013d000004750060009c00000e130000213d000000000042004b00000e130000813d0000047602600197000000000121019f0000000e02000029000000000012041b000c00000008001d00000064010000390000000201100367000000000101043b0000000002000411000000000020043f0000000302000039000000200020043f000000000001004b00000e530000613d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000101041a000000000001004b00000f520000613d0000000c02000029000000000202041a000b00000002001d0000000001120049000004b30010009c0000000002010019000000000200601900000005322000b900000080042002700000008003300210000000000343019f0000047704200197000004773530012a0000008003300210000000000343019f00000477045000d1000000000034004b000000010550208a0000047703500197000000000332001900000005021000b9000000000323004b00000000040000390000000104004039000000000343004b00000e8e0000c13d000004640120012a00000e950000013d0000000701000029000000000101041a000b00000001001d00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b000000000201041a000000000002004b00000f520000613d0000000c01000029000000000101041a0000000002210049000004b30020009c0000000003020019000000000300601900000005433000b900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000005032000b9000000000434004b00000000050000390000000105004039000000000454004b00000f110000c13d000004640330012a00000464023000d1000000000003004b00000f1b0000c13d00000f1e0000013d000004780030009c0000081a0000213d000004641010012a00000003011000b9000004641010012a000000000112004900000479011000d1000c00000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000b02000029000000000021041b0000000801000029000000000201041a000000400100043d00000024031000390000000c0400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c00000ec70000c13d0000000001010433000000000010043f0000000103000031000000010200003900000eed0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c00000020050000390000000005034019000000200450019000000ede0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000eda0000c13d0000001f0550019000000eeb0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d000000010020019000000d410000613d000000000254016f000000000223019f000000010020019000000d410000613d0000000c0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d02000039000000030300003900000480040000410000000d050000290000000006000411113411250000040f000000010020019000000f410000c13d0000081a0000013d000004780040009c0000081a0000213d000004642020012a00000003022000b9000004642020012a000000000223004900000479032000d100000464023000d1000000000003004b00000f1e0000613d00000000033200d9000004640030009c000008b60000c13d0000000b030000290000046403300198000001440000613d00000000023200d9000c000000210053000008b60000413d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f00000001002001900000081a0000613d000000000101043b0000000c02000029000000000021041b0000000e01000029000000000101041a00000090021002700000000602200029000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000e02000029000000000012041b00000009020000290000000102200039000000040020006c00000dbe0000413d0000028d0000013d000000000001042f000000400100043d000004ae02000041000007bf0000013d000000000301041a000004830030009c00000f5b0000a13d000000400100043d0000048d02000041000007bf0000013d00000058043002700000048404400197000000000224019f00000070022002100000046403300197000000000232019f000000000021041b0000000a01000029000000000101041a00000090021002700000000002320019000004640020009c000008b60000213d00000475011001970000009002200210000000000112019f0000000a02000029000000000012041b00000000010004140000044e0010009c0000044e01008041000000c00110021000000485011001c70000800d0200003900000003030000390000048604000041000008150000013d00040000000000020000000202100039000000000202041a000200000002001d000100000001001d0000000401100039000400000001001d000000000101041a000300000001001d0000047001000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000471011001c70000800b020000391134112a0000040f000000010020019000000fb70000613d00000003060000290000044e026001970000000203000029000000a0033002700000044e04300197000000000301043b000000000043004b00000000010400190000000001034019000004720060009c00000fae0000413d000000000521004b00000fae0000a13d0000000408000029000000000308041a000000900630027200000fb80000613d00000000022400490000002004300270000004640740019700000000055700a900000000022500d900000464052000d100000000056500d900000001060000290000000306600039000000000706041a0000000005570019000000000056041b0000000002240049000000200220021000000473022001970000047403300197000000000223019f000000000112019f00000fb50000013d000004750060009c000000040800002900000fb60000213d000000000032004b00000fb60000813d0000047602600197000000000121019f000000000018041b000000000001042d000000000001042f0000049e01000041000000000010043f0000001201000039000000040010043f0000049f0100004100001136000104300004000000000002000200000003001d000400000002001d000300000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b000000000101041a000000000001004b000010870000613d00000003020000290000000302200039000000000202041a000100000002001d0000000001120049000004b30010009c000000000301001900000000030060190000000202000029000004640220019700000000432300a900000080053002700000008004400210000000000454019f0000047705300197000004774640012a0000008004400210000000000454019f00000477056000d1000000000045004b000000010660208a0000047704600197000000000443001900000000032100a9000000000434004b00000000050000390000000105004039000000000454004b00000fff0000c13d000004640130012a000010070000013d000004780040009c000010850000213d000004642020012a000004641010012a00000000012100a9000004641010012a000000000113004900000479011000d1000200000001001d0000000001000411000000000010043f0000000301000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000010850000613d000000000101043b0000000102000029000000000021041b00000003010000290000000201100039000000000201041a000000400100043d0000002403100039000000020400002900000000004304350000047a03000041000000000031043500000004031000390000000004000411000000000043043500000000030004140000046302200197000000040020008c0000103a0000c13d00000001020000390000000001010433000000000010043f0000000103000031000010610000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e03008041000000c003300210000000000113019f0000047b011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010520000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000104e0000c13d000000000005004b0000105f0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000400003900000001040060390000001f0030008c00000000050000390000000105002039000000000003004b00000000030000390000000103006039000000400100043d00000001002001900000108f0000613d000000000254016f000000000223019f00000001002001900000108f0000613d000000020200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f0000047f011001c70000800d020000390000000303000039000004800400004100000004050000290000000006000411113411250000040f0000000100200190000010850000613d000000000001042d00000000010000190000113600010430000000400100043d000004ae0200004100000000002104350000044e0010009c0000044e0100804100000040011002100000048c011001c7000011360001043000000044021000390000047c03000041000000000032043500000024021000390000000f0300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c700001136000104300002000000000002000100000002001d000004b4020000410000000000200443000200000001001d000000040010044300000000010004140000044e0010009c0000044e01008041000000c001100210000004b5011001c700008002020000391134112a0000040f0000000100200190000010fe0000613d000000400300043d000000000101043b000000000001004b000010ff0000613d00000044013000390000000102000029000000000021043500000024013000390000000002000410000000000021043500000498010000410000000000130435000000040130003900000000020004110000000000210435000000000100041400000002020000290000046302200197000000040020008c000010c70000c13d00000001020000390000000001030433000000000010043f0000000103000031000010ee0000013d0000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000047e011001c7113411250000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000010df0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000010db0000c13d000000000005004b000010ec0000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000100000003001f000000000100043d000000010010008c000000000100003900000001010060390000001f0030008c00000000040000390000000104002039000000000003004b000000000300003900000001030060390000000100200190000011060000613d000000000141016f000000000113019f0000000100100190000011060000613d000000000001042d000000000001042f000004b60100004100000000001304350000044e0030009c0000044e0300804100000040013002100000048c011001c70000113600010430000000400100043d0000004402100039000004990300004100000000003204350000002402100039000000140300003900000000003204350000047d0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000047e011001c70000113600010430000000000001042f00000000010004140000044e0010009c0000044e01008041000000c00110021000000467011001c700008010020000391134112a0000040f0000000100200190000011230000613d000000000101043b000000000001042d0000000001000019000011360001043000001128002104210000000102000039000000000001042d0000000002000019000000000001042d0000112d002104230000000102000039000000000001042d0000000002000019000000000001042d00001132002104250000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000711c316a0000000000000000000000000000000000000000000000000000000093d1692e00000000000000000000000000000000000000000000000000000000e121c10100000000000000000000000000000000000000000000000000000000e121c10200000000000000000000000000000000000000000000000000000000e1a472b90000000000000000000000000000000000000000000000000000000093d1692f00000000000000000000000000000000000000000000000000000000cc40105800000000000000000000000000000000000000000000000000000000711c316b0000000000000000000000000000000000000000000000000000000073455b9f00000000000000000000000000000000000000000000000000000000862d2d7c0000000000000000000000000000000000000000000000000000000045a2cab0000000000000000000000000000000000000000000000000000000005eac6238000000000000000000000000000000000000000000000000000000005eac623900000000000000000000000000000000000000000000000000000000647211910000000000000000000000000000000000000000000000000000000045a2cab10000000000000000000000000000000000000000000000000000000058ff9fe500000000000000000000000000000000000000000000000000000000069def88000000000000000000000000000000000000000000000000000000001e897afb0000000000000000000000000000000000000000000000000000000022e0772c000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff000000000000000000000000000000000000010000000080000000000000000000000000000000000000000000000000000000200000008000000000000000000200000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000fffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffeffffffffffffffffffffffffffffa9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000005452414e534645525f4641494c4544000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30399039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f70000000000000000000000000000000000000040000000800000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000000000001dd3c6bbd98f0e8289d22fc98f1c6c67a8f85ca3be88f5cd947bd79cdc4695c1000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f5245454e5452414e4359000000000000000000000000000000000000000000005fd8a132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bbfd9e3100000000000000000000000000000000000000000000000000000000dfa8318d00000000000000000000000000000000000000000000000000000000039f2e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000ffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffff47bc7cc8000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffff23b872dd000000000000000000000000000000000000000000000000000000005452414e534645525f46524f4d5f4641494c45440000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006000000000000000000000000051703ddde1b61a1d053748381ba1d4e518b4318cf9a790827cb22efb552b712ab4fa3fb3000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000caf3cdf1c8646c034cb422145b37c59b14c56f887b41ad71d0cfdb14dff0228172f94ce0000000000000000000000000000000000000000000000000000000063df81710000000000000000000000000000000000000000000000000000000008571217000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000fffffffffffffeffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000000000000002000000000000000000000000000000000000800000000000000000000000008eabfc2cee883d317bfa1bc6b35c8ed8b90a9288dd10822f462da02177f2a1be0000000000000000000000000000000000000020000000000000000000000000ea4a6a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000000064000000800000000000000000237e6c2800000000000000000000000000000000000000000000000000000000390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811cd06ff88e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000d935448500000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000079d93f49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce932d6d97084c2163485b42b77d74f52baf2e14b443d9c511dfc52958a1290c" + ] +} \ No newline at end of file diff --git a/deployments/zkSyncSepolia/UniswapV2Factory.json b/deployments/zkSyncSepolia/UniswapV2Factory.json new file mode 100644 index 0000000..d4767ef --- /dev/null +++ b/deployments/zkSyncSepolia/UniswapV2Factory.json @@ -0,0 +1,1750 @@ +{ + "address": "0x8CC9c8f3890B16264A70Cd7b35FA52fe6E11984A", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_defaultProtocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_defaultLpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_protocolFeeBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "fees", + "type": "tuple" + } + ], + "name": "DefaultFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "LpFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "PairCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "ProtocolFeeBeneficiarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "ProtocolFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + } + ], + "name": "RoyaltiesFeesSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "allPairs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairs", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairsLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + } + ], + "name": "createPair", + "outputs": [ + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "defaultFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFees", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFeesAndRecipients", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "protocolBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getPair", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getTotalFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "pairFees", + "outputs": [ + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "protocolFeeOverride", + "type": "bool" + }, + { + "internalType": "bool", + "name": "lpFeeOverride", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeBeneficiary", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "_fees", + "type": "tuple" + } + ], + "name": "setDefaultFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setLpFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_protocolFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setProtocolFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + } + ], + "name": "setProtocolFeeBeneficiary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_royaltiesFee", + "type": "uint256" + } + ], + "name": "setRoyaltiesFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "receipt": { + "to": "0x0000000000000000000000000000000000008006", + "from": "0x80b756c9CE65D5A2C2922d4CF778cD2FB2e6Fa24", + "contractAddress": "0x8CC9c8f3890B16264A70Cd7b35FA52fe6E11984A", + "transactionIndex": 0, + "gasUsed": "62623656", + "logsBloom": "0x00400000000400080800010000000000000000000000400000800010400000000000000000000000000002000001000000000000000000000400000000000002000140000000840000000028400040000503000000000000000000000000080400080000020100000000000004000800000000000000400000000010000000400000801000000000000004000100000000000100000000001000000000000080800010000004100000000000800100000000000010000000102000010000000000000002008000000042000000000100000010000100000000000000000020000200000000010000000000000000000000000040000000000000000080008000", + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b", + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x0000000000000000000000000000000000000000000000000000000000008001" + ], + "data": "0x000000000000000000000000000000000000000000000000000c6942b8388e00", + "logIndex": 0, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000cc0000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ea1b7a03643121a15ed1ad0b67a37e0fae3d2c52a54b4aefe0a2166e38c95e2a3", + "logIndex": 1, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0xa1b7a03643121a15ed1ad0b67a37e0fae3d2c52a54b4aefe0a2166e38c95e2a3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000005e4206e9000000000000000000000001002001900000044e010080410000044e0010009c0000076d0000c13d1134112f0000040f000000000101043b000000200030008c000000c0011002100000000001000414ffffffffffffffff000000000021043500001136000104300000004a0000213d00000000003204350000044e0020009c0000076d0000413d0000076d0000213d0000044e02008041000000400200043d000000000010043f00000000040340190000004001100210000000000001004b000000400100043d00000020040000390000076d0000613d0000801002000039000000800010043f000000000112019f00000493011001c7000000400010043f00000b3d0000413d000000000006004b000000200010043f000011350001042e000300000001035500000000006504350000044e03300197000000000101041a00000000010004160000000003010019000000000048004b0000000008980436000000007907043c0000000008020019000000000701034f000007d10000613d00000000046200190000048e063001980000001f0530018f0000001f01400039000100000003001f000000000767022f000001000660008900000003066002100000001f0640018f0000006003300270000000000002004b000000c0022002100000000002000414000000400020043f000007d10000013d000000000686019f00000000066701cf000000000707043b000000000868022f00000000086801cf0000000008050433000000000771034f000000200740019000000b3d0000c13d000000600110018f000000000202043b00000000020004164d616769637377610000000000120435000000000001042d0000000009a90436000000008a08043c000000000801034f000000040020008c000000000059004b0000048f011001c700000000010000190000000101000039000000000021041b000000000201041a0000000d020000291134112a0000040f00000044021000390000048f01000041000000040010043f000004b2010000410000044e0030009c0000000e020000290000800d02000039000000000202041a000000840010043f0000044e0300804100000000010104330000002402100039000000000003004b0000000f0200002900000010010000290000048c0020009c0000048c0010009c0000048c022001970000000303000039000000090200002900000000020204331134107c0000040f0000049b010000410000049e0010009c0000000e030000290000049101000041000000240030008c0000002001000039000f00000002001d0000001002000029000000400300043d00000001020000390000048b010000410200000000000000000000000019004b0000000000020435000000000003043500000b3d0000213d000000000004004b000000000020043f000000040210037000000004011003700000000f01000029000000000100041000000458010000410000000d010000290000000002000039000000000021004b0000000e01000029000000000034043500000009010000390000000103000031000000c40010043f000000a40010043f000000000403041a00000020030000390000049b020000410000000b010000290000004a0000c13d000e00000002001d001000000001001d000000000121019f000000200040008c0000000701000039000003860000c13d00000f7d0000613d00000d490000c13d0000000f030000290000002002100039000004ac0030009c0000000301000029000004a3011001c700000040022002100000000d0300002900000000002404350000000a020000290000000000230435000000400030043f000000000200041000000080057001bf0000049c011001c70000048c01100197000000000404043b000d00000002001d000000000032004b000000000034004b00000002010000390000800b0200003900000456011001c700000000001004430000006002300039000000000001041b000000000201043b0000000d011000290000000000310435000004ac0020009c000000040040008c0000000d090000290000000d05700029000004a4040000410000000c01000029000000000404041a0000000102004039000000000005004b000000000013043500000060022002100000000f0b00002900000000090b0019000000000131019f00000000020000190000052e0000613d000000000058004b0000000008a80436000000009a09043c000000000901034f000000800800003911340f8c0000040f000000000300041400000000050004100000048d011001c7000004b4010000410000002401100370000000440030008c0000044e01100197000000000303041a0000049e0040009c000000000001042f00000004021000390000022f0000013d00000001030000390000000b030000290000000e050000290000049201000041000e00000001001d00000008010000390000000b01000039000000000012041b001000000002001d0000004101000039000000c0010000390000000104000031000000010020008c000000400040043f554646494349454e7056323a20494e5300000000ffffffff000010500000213d000010320000613d00000f1f0000613d000300000002001d0000000302000029000000a00030008c000000070200002900000000050004110000001101000039000000000013004b000000000e03001900000b130000013d000000000606041a0000006002700039000004ac0070009c000000400700043d0000002003200039000000400320003900000060032000390000002401300039000000440130003900000000004204350000048b020000410000000006000019000000080200002900000000040000190000002002000039000000100f0000290000049e0030009c00000004012000390000000e0570002900000040013002100000000c0200002900000496011001c7000000000113019f0000076d0000013d0000000001b1001900000000057b0019000000c001300210000900000002001d000e00000004001d000008d20000c13d000a00000003001d00000490022001970000000f04000029000d00000003001d000000000012004b000000000014004b0000044f0000013d0000048b03000041000000800300043d00000080021001bf0000004002000039000e00000003001d000000000301041a000000000100041a0000000c02000039000000000302041a000000000303043b000000000035004b000c00000001001d00000000004304350000000201000367000000000031004b000300000001001d0000076d0000813d000000000200041100000024021003700000001201000039000000800020043f0000000802000039000000000232019f113411080000040f0000000002040433000000000014043500000000030004100000023a0000613d0000004002100039000003530000013d000000a00010043f0000002004008039000000040030008c000400000000000275737465640000007056323a2062616cffff000000000000ffffffffffffffe07fffffffffffffff454400000000000000000020000000007056323a20494e5600000080000000000000004000000000ffffffff000000000000000100000000000010f40000613d000010ee0000213d00000000000d0435000010560000213d000000000904041a00000001006001900000000105000039000000040300002900000f7f0000413d0000000102000029000200000001001d000100000003001d0000000202000029000027100310011a000027100010008c00000000022100d9000400000001001d0000006001100039000000a0040000390000000304000029000000000045004b0000000b020000290000000303000029000000000024004b00000002050000290000000d0400002900000010060000290000000005000019000000320100003900000aa00000213d000000000098004b000000000096004b0000000006000039000000010200c039000004ac00c0009c000000400c00043d000000000deb0019000004ab033081c7000000000092004b000000010400c0390000000004000039000000ff0040019000000040033000390000044e02200197000000000093043500000000010204330000000000040435000000400410003900000060041000390000000000760435000000000707041a000000080100002900000aef0000013d0000000001120019000000000012001a000000000067004b000000040000006b00000000010304330000000000010435000004ac0010009c00000000009c004b000000000064043500000b200000613d000000400270003900000c510000213d00000008040000290000000202000367000c00000002001d0000000e09000029000000000400041000000004024000390000000e04000029000004a203000041000000000010041b000008240000213d0000000a0020006b0000000e0000006b0000000e0060006c0000000c0600002900000070022002700000000001040433000004a9011001c700000064021000390000000903000029000000000054004b000000400500043d000008e00000613d000000000505041a000007ba0000813d0000000000540435000000000575019f000000000656022f000001000550008900000000070404330000000305500210000000000047004b0000000007000019000000000000043f0000000a030000290000000e020000390000004003400210000008ce0000c13d000000000401041a000a00000002001d000000000115001900000000043200d90000000103300039000000000043004b0000000f0030006c00000b3d0000613d000b00000004001d0000000f050000290000000104400039000000000605041a0000000004020019000000800200043d00000080011001bf00000490041001970000007001100270000004900310019700000000020104330000000001140019000000000053043500000084031001bf0000049f011001c700000040012002100000000401000039000000000013041b000000000114019f000000000043041b000004590440019700000458020000410000ffff0010008c11340ee80000040f0000000001000411000000000301043b000000ff00200190000004c101000041000000e40010043f0000002404100370000007870000c13d000000000505043b000000140300003900000044021003700000000d0600002900000010030000290000003f011000390000049e0020009c0000004401100370000004be01000041000000c00010043f000004900120019700000490011001970000000301000039000001fc0000013d000f00000001001d000001ed0000013d0000000601000039000000a00240003900000010040000290000002002300039000004510010009c7e042cfd0f2efa9f94a277a401bf8a4675e00547a1918c050b016bb9e76d006b494c4544000000004e534645525f46417056323a20545241a9059cbb0000000029000000000000002c75696e7432353628616464726573737472616e73666572062b03a9fffbbad189e3cab4c78be50e1c2f21f7726b17ae1c411e9a96e0712400000000ffff000052464c4f570000007056323a204f564500010000000000005b200ac8c7c3b925dd0314c0f7b2291ed14f71427d1e84f38c5be1e5ebec7d5bffffffffffffffa0fffffffffffffc17ffffffffffffff005f414d4f554e5400545f4f5554505554414c49445f544f00545f494e5055545f414d4f554e5400007056323a204b0000616e63653041646a616e63653141646ae3d130840159d822e613ce37657fb8d56551d0da85fc275fd78ad95fa46c994b9d836a6e000000000000000005f5e1008c23283800000000000000840000008049545900000000004b454400000000007056323a204c4f430000006000000080c3a93dbf584e125ad8f7e35e7747279b652e4400164f05a5ac49e518f90a358f00000040000000800000ffff00000000ffff0000ffffffff00000001000100000000000400000080313ce56700000000000000640000008042494444454e00007056323a20464f524e487b71000000004954595f4d494e5426394f4c03821c4f560dff690a1c6fef8f13e2e1088ba56a4c209b5fc8ad50755f6e3230263bcb493c7e97b47efa546f729641147f791557a6eef7e35abe702649000000000000004f4c440000000000ffffffffffffff9f0000008400000000545f4c49515549444954595f4255524e89976e6d81936496a42612892bb3f4f79cb1fd330b93224cdccd412f0b12528128f55a4df523b3ef952ba7f163c4a11669c2b068fc378daaddf252ad1be2c89b666c6f77000000006d756c2d6f76657264732d6d6174682d00000000000000c04d414749432d563249524544000000007056323a20455850000000640000000008c379a0000000004e41545552450000414c49445f534947ffffffffffffff7f1901000000000000ffffffffffffff1f169c64845d6126c95fa2faae0126114a4d1f60370fef10106e71edae12b1b97f08cc6b5d955391325d622183e25ac5afcd93958e4c903827796b89b91644bc9800000020000000800000ffffffffffff000000240000000000000000ffffffe0000000240000008070a082310000000000000000053f14da00000000022c0d9f000000000902f1ac0000000006fdde030000000006fdde02000000000dfe168100000000095ea7b30000000023b872dd0000000018160ddd0000000018160ddc00000000095ea7b2000000002b8e066600000000252c09d700000000313ce5670000000030adf81f0000000030adf81e000000003644e5150000000032148f67000000004f1a470800000000485cc95500000000485cc9540000000032148f6600000000252c09d60000000070a08231000000006a62784200000000883bdbfd000000007ecebe00000000007ecebdff0000000095d89b410000000089afcb4400000000aab5497c00000000a9059cbb00000000a9059cba0000000089afcb4300000000bc25cf7700000000ba9a7a5600000000d21220a700000000c45a015500000000c45a015400000000d6cf0c3700000000d505accf00000000fff6cae900000000e1f1c4a700000000dd62ed3e00000000dd62ed3d00000000d505acce00000000ba9a7a55000000006a627841000000400000010000000002000000000000000000030009ffffffffffffff3f000000040000000002000002000000000d0df415241f670b5976f597df104ee23bc6df8224c17b489a8a0592ac89c5ada9a75d522b39400f239f7b179b0ffaca512ecc4cf759cc798b73c3c69bb8fe3d3100000000000000ffffffffffffffc00000000c000000a07020563200000000000011340000043200001132002104230000112d00210421000011290000613d0000111b0000613d0000001c03000039000004dd03000041000011050000c13d000011050000a13d0000001f0010008c000011050000213d000004dc0010009c000010ed0000613d000000800300003900000060010000390000109e0000c13d0000044e041001970001044e0010019d0000006001100270000000010220018f00000000020400190000006003300210000010dc0000013d00000000056501cf000000000565022f00000000076701cf000000000557034f000010dc0000613d000010b40000c13d000000000049004b0000000009030019000000000807034f000010b80000613d00000003070003670000000004530019000004d3054001980000000003410436000010ee0000c13d00000001060040390000000003310019000004d303100197000004d301100197000010da0000613d000010c60000c13d00000000030504330000008002500039000004980050009c000000000025043500000044020000390000002403500039000004db030000410000002001500039000000440150003900000000005104350000001905000039000004da060000410000002005100039000000400050043f0000004005100039000010ee0000813d00000000040100190000001503000039000004d6030000410000106e0000613d000004d904000041000000200420003900000490014001970000049003300197000004d8033001970000007003400210000000e002200210000000000034041b000000000353019f000004b705900197000000000363019f000004d7033001970000001003500210000000000073041b00000001077001bf000004d007800197000000000803041a0000000e03300039000000000078041b0000000d08300039000000000098041b00000000099a019f000004b70aa00197000000000a08041a0000000c0830003900000003036000c9000000000078043500000020083000390000000000a80435000000010a0000390000004008300039000000400080043f00000060083000390000000007ab0019000010500000413d0000000000ab001a000010500000c13d0000000000c3004b00000000038a00d9000010100000213d000000000073004b000000000b0b0433000000000a8c00a90000044e00c0009c000000000ca900490000044e0aa00197000000000a0a043300000000000c0435000000200dc00039000000400dc000390000004000d0043f000000600dc000390000044e0920019700000000606900d90000ffff0990018f00000001099000390000ffff0650018f000010760000613d00000ff50000013d00000000050c0019000000000c05c01900000000006d004b0000ffff00d0008c000000010d50008a00000ff30000a13d00000000005c004b0000ffff0cc0018f000000200c9002700000102c0000613d0000044e00c00198000000000c2d013f0000000000ce0435000000010c00c039000000000c000039000000ff00c00190000000000c0c041a0000000e0cc00039000000400ea000390000000000eb0435000000000e0e041a0000000d0ec00039000000000bba04360000044e0bd00197000000000d0b041a0000000c0bc00039000000030c6000c90000004000b0043f000000600ba000390000ffff0550018f0000001005900270000010560000813d000004d200a0009c000000400a00043d000010700000613d0000ffff0060008c0000ffff0690018f0000000b04000039000000000084041b0000000a0400003900000000083700d9000010500000013d00000fc70000613d00000000055700d9000000000704001900000fc20000013d00000000074500a900000fc60000613d00000fb50000c13d0000000007080019000000010660027200000000055700a9000000010700603900000000087700a90000000a0700003900000fc00000613d0000004d0060008c000000050500003900000490044001980000000104000029000004900330019800000002030000290000044e003001980000000003320049000000e0033002700000106d0000613d0000105c0000813d000004d50020009c0000105c0000213d000004900010009c000200000003001d000100000004001d000000e003200270000000020600002900000003050000290000000102300029000000040030002a00000002010000290001000400100074000200000002001d000400000003001d0000000306000029000004d40400004100030000000000020000000001210019000004d3022001970000001f02200039000000000321001900000edb0000413d000000200440003900000000060604330000000006430019000000000541001900000ee20000613d00000040011000390000000032020434000000000431043600000ecd0000813d000004d20010009c000004c6040000410000048c06200197000004c5011001c7000000c0033002100000004402200370000000240320037000000004032003700000001d03000039000004c70300004100000ea10000813d000027100330011a000000010300002900000e900000c13d00000e840000c13d00000e9d0000013d000004c80300004100000e950000813d0000000e0020006b000027100220011a00000e890000613d00000e6a0000613d00000e590000c13d00000e5d0000613d00000e700000613d000d00000004001d0000000e0410002900000e7d0000613d00000e220000613d00000e110000c13d00000e150000613d00000e260000013d00000dfa0000c13d00000de50000c13d00000db60000013d000000040200002900000db60000413d000000060020006c00000006012000b9000000050200002900000dd20000413d000000070020006c00000007012000b900000db60000613d000d00000001001d0000000b010060290000000001020019000000000102601900000dea0000213d000000010010008c000000ff0110018f000000010110003900000dbc0000013d000e00000000001d000700000001001d0000004001200039000600000001001d00000080012000390009048c0010019b0008048c0010019b000500000001001d0000000301100029000001e00110018f00000dde0000613d00000d900000613d00000d7f0000c13d000000030900002900000d830000613d0000000305700029000000e00740019000000d940000013d00000d680000c13d0000000002240436000004c40200004100000004013000390000001402000039000004a20200004100000caf0000013d000000000056004b0000000a0040006c00000000044600d90000000a076000fa00000d430000a13d0000000c0080006b00000008080000290000000a064000b900000ca20000013d0000000b0050006c00000000054200d90000000b052000fa00000d360000a13d000000090060006b0000000e060000290000000b024000b900000d2a0000c13d00000c240000013d00000d230000613d00000d160000613d00000d050000c13d00000d090000613d00000ce90000c13d000004ad0300004100000cd60000c13d00000d540000013d000004c90200004100000d5a0000813d000004c3022000d1000000040110003900000010022000b9000000020010006c00000001014000fa000000010010006c00000002014000fa00000cba0000613d00000001045000b900000cbd0000613d0001000000650053000200000021005100000d3c0000c13d0000000c0060006c000027100650011a000027100060008c0000000c065000fa00000ca90000613d00002710056000c900000d2f0000c13d000000090020006c000027100210011a000027100020008c00000009021000fa00000c9c0000613d000000000404043300002710012000c900000ce20000613d00000c850000613d00000c740000c13d00000c780000613d00000c8b0000613d000700000004001d0000048c0440019700000000005204350000000000560435000004c2050000410000000604000039000004a6011001c7000004a50400004100000cee0000c13d00000004023000390000000f0310002900000ccf0000613d00000c000000613d00000bef0000c13d0000000f0900002900000bf30000613d0000000f0570002900000040033002100000001e030000390000049a03000041000008620000013d000003e80440003900000bb90000c13d000004b00400004100000002030000390000000802300029000000090020002a000800000002001d0000000901100029000000090010002a00000b4a0000c13d00000bbe0000a13d000004d10040009c000004af03000041000000200030043f000000000020041b000003e802000039000903e80040009400000b2d0000c13d0000080a0000013d000009a30000413d0000000c0250002900000b200000a13d00000000024800d900000b3d0000013d00000b130000813d00000b0e0000a13d000000000128001900000000083400a900000000047600d9000000000018004b000000000626004b00000000060204330000044e0070009c000000000718004900000afb0000c13d00000000008a004b0000044e08600197000000000607043300000af50000c13d00000000031a004b0000000f0a0000290000044e01c001970000000e0080006b000004ab0880a1c700000aa00000013d000000010ba0008a0000000200d0008c00000ad80000a13d000004ab0660a1c70000000f0080006b00000aea0000213d00000aea0000413d00000ae50000213d0000000f0060006c00000ae10000213d00000ae10000413d0000044e06c00197000000000c0c043300000000006f0435000000010600c039000000ff00600190000000400f7000390000000e066000390000000000f20435000000000f0f041a0000000d0f60003900000000028704360000044e082001970000000c0260003900000003062000c90000000020f300d900000a9f0000613d0000000103a000390000004003c000390000000e022000390000000d0320003900000000043c04360000000c0320003900000003022000c90000000020fa00d90000006002c00039000000010ad002700000000000eb001a00000aa30000013d000000010be0002900000cdb0000213d000004ab0220a1c700000a820000013d00000a7d0000213d00000a7d0000413d0000000e040000390000000d06000039000000000423043600000a770000c13d0000000e044000390000000d0740003900000000062304360000000c024000390000000304e000c900000002e0f000f9000009de0000a13d00000000006a004b000004ab0aa0a1c7000000000a0c0019000004ab066081c700000000060b00190000000104000039000000400230003900000004031000fa00000a360000613d000000000203043300000004014000b90000044e0040009c0000000004190049000000200410003900000b130000613d0000044e00400198000000030440014f000000010700c0390000000007000039000000ff0070019000000007070000290000000601000029000000400620003900000000031204360000044e0140019700000005010000290000006001200039000000000c03043300000000022704360000000000620435000000010600003900000004071000fa000009f70000613d00000004016000b90000044e0060009c0000000f06100069000000600210003900000aef0000613d0000044e001001980000000001b8013f00000a4e0000213d0000000000bc004b00000a450000213d00000a450000413d0000000000a60435000000010a00c039000000000a000039000000ff00a00190000000000a0a041a000000070a000029000000400630003900000006060000290000000004c304360000044e0c800197000000000804041a000000050400002900000060043000390000ffff0030008c00000008030000290000000002070436000000000219004900000a070000613d0000044e011001980000000a01200029000000050230021000000000030000190002ffff001001930005000c0020003d0006000d0020003d0007000e0020003d00000003023000c9000800000003001d00000001012000390001000100f000920000044e091001970000ffff0320018f0000002602000039000004cb02000041000004ca0200004100000064013000390000000c0050006b0000000805000029000000090050006b000000040220003900000000020040190000000c0240006b0008000f0020007300000024022003700000000004004019000000090450006b000e00100040007300000004042003700000000e0210002900000bb20000613d0000095a0000613d000009490000c13d0000094d0000613d000009600000613d0000000c040000290000000d0410002900000b260000613d000009120000613d000009010000c13d000009050000613d000004cc01000041000000170100003900000004021001bf0000022c0000013d00000c040000013d00000bd90000c13d0000000002030019000e000a002001020000000a032000fa000000000121004b000f000e0010007400000008014000f90000000f0010006c00000008013000f9000008700000613d0008000f003000bd000008270000013d000004b10300004100000b4f0000c13d000000090000006b00000000020180190000000e014000fa00000000021200d900000000033400d90000000f054000fa000008570000613d0000000f043000b90000000b0000006b00000000045200d90000084b0000613d0000000d0060006b0000000b0600002900000000025300a90000000a05000029000000000321004b00000009020000390000002a03000039000004a803000041000004a703000041000008680000c13d0000000f0000006b0000000002120049000008140000413d00000000026204360000000056050434000008190000613d00000000030304330000000002210436000009970000c13d000008000000c13d000000000016004b0000000006760436000000004704043c000000000605001900000002044003670000000004000031000008040000613d0000001f0310018f00000000053404360000000904000029001000000006001d000000010050019000000001050040390000000005000039000900000005001d0000000004450019000004aa044001970000003f04100039000000050130021000000000030104330000006001300210000000000161019f00000000015101cf000000000151022f00000000065601cf0000000006040433000000000161034f000007de0000613d000007cd0000c13d000004c001000041000004a8010000410000002301000039000009160000013d000008ea0000c13d0000000003040019000007aa0000613d000000000402043b000007a30000613d0000000c0020006c000c048c0050019b00000008050000390000000e0020006c000e048c0050019b00000007050000390000000f0040006c000f04900040019b0000007004400270000000100030006c001004900040019b0000000904000039000007820000c13d000007760000c13d000008380000813d0000000001b2001900000000040b0019000000600210018f000007c60000613d0000075b0000613d0000074a0000c13d0000074e0000613d0000000e0b000029000e0000000b001d00000000020b40190000044e020000410000044e00b0009c0000017b0000013d000d000e00100074000006f00000c13d00000bd20000c13d000000100010006c00000bd20000613d0000048c01100198000000000100043d00000b430000613d00000000055601cf000000000606043b000000000757022f00000000075701cf000000000641034f000006da0000613d000006c90000c13d0000000007870436000000006806043c000000000601034f000006cd0000613d00000020044001900000001f0540018f00000499011001c7000000c4011003700000004004300039000000a4021003700000002004300039000000ff0220018f0000016002200039000004980030009c00000042020000390000010202300039000004970200004100000100013000390000012202300039000000e003200039000004950040009c00000494020000410000000001140436000000400140003900000060014000390000008001400039000000c002400039000000400400043d000000000032041b000000010310003a000000000102041a000b00000001001d000005090000813d0000077b0000613d000006310000613d000006200000c13d000006240000613d00000040035002100000049b0000813d0000076f0000613d000006010000613d000005f00000c13d000005f40000613d000005d70000c13d000005cb0000c13d000005bf0000c13d000004b9022001c7000004b80220019700000001011001bf000004d0013001970000000d01000039000004b7033001971134111d0000040f11340ec80000040f000000000023041b0000000503000039000000ff0020008c000006e90000613d000005920000613d000005810000c13d000005850000613d000004b6011001c70000056b0000c13d000003cd0000813d000005d00000613d000005590000613d000005480000c13d0000054c0000613d000000100b000029000008220000c13d0000000a0000006b000000000041004b00000000013200d900000000014200d9000005270000613d00000000023400a90000052a0000613d000000000200041a0000060c0000c13d000b00000002001d00000084041001bf0000000000350435000005c40000613d000004ee0000613d000004dd0000c13d000004e10000613d00000b330000013d000004c00000413d0000000003050019000000000403001900000001054002700000000004340019000000000034001a00000b320000813d000000000023004b00000001032002700000000f032000fa00000000034200d9000004b70000613d0000000d0050006b0000000f024000b90000000b050000290000000a040000290000000e0030006c0000000c03000029000008430000c13d000000000300041a000f000000250053000c00000005001d000000000505043300000070025002700000000d0340006b0000049004500197000005dc0000c13d000005b80000613d000004800000613d0000046f0000c13d000004730000613d000004b3010000410000001601000039000004bd04000041000004bc011001c70000044f0000613d0000ffff0150018f000004bb044001970000002004500210000004ba0140019700000000050100190000042d0000413d000000000065041b00000001066001bf000004b7066001970000000c0550003900000003054000c900000b200000813d0000ffff0040008c0000043a0000a13d0000000005020019000004240000c13d0000075f0000013d000007310000c13d0000000401b0003900000000001b0435000000400b00043d000f048c0010019b000000000312004b000005640000613d000003f90000613d000003e80000c13d000003ec0000613d000005340000c13d000f00000003001d0000041d0000613d000003b20000613d000003a10000c13d00000000005a004b000000000a9a0436000000008908043c000003a50000613d000000800a000039000004bf010000410000001301000039000003520000013d11340f210000040f000004f20000013d000004cc0000c13d000004840000013d0000045e0000c13d000005960000013d000005700000c13d000004b5010000410000000803000039000000000424019f0000000703000039000004540000c13d00000000040004110000048c0330019700000006030000390000049401000041000004a1011001c70000006001100210000000c00110008a11340ed30000040f0000008002000039000000a00020043f0000044f02000041000004ae01000041000004290000c13d0000ffff0220019000000020024002700000000b03000039000000000002041b000000010030008c000003640000013d000000010100c0390000000001000039000000a00030043f0000000c011000390000000d031000390000000e0210003900000003011000c90000fffe0010008c000004ce01000041000004cd0100004100000027010000390000000403100370000000000003041b000000010040008c0000045803000041000000240440003900000000045400190000049e0050009c000000000551034f000000040540003900000023054000390000006404100370000000840030008c00002710010000390000049d030000410000063c0000813d0000000e0010006b000000ff0010008c00000084011003700000006402100370000000e40030008c000003e8010000390000ffff0110018f00000020011002700000046c0020009c000003570000613d0000046b0020009c000004ae03000041000007e40000c13d0000ffff061001900000001001200270000001d00000413d000000000065004b00000020055000390000002003300039000004ab0040009c000000000451034f000001d90000613d000a00000001001d0000000001310436000000010030019000000001030040390000000003000039000b00000003001d0000000001130019000004aa011001970000000b02000039000400000002001d0000000a020000390000000f02100029000f0005002002180000002401200039000000000141034f00000004042000390000002304200039000004710020009c000003440000613d000004700020009c0000000501000039000004780020009c000002d70000613d000004770020009c000003630000013d000006f50000c13d000004cf0010009c000000640030008c000004830020009c000002d00000613d000004820020009c0000047d0020009c000002c90000613d0000047c0020009c0000044e0130019711340f850000040f000004880020009c000002b80000613d000004870020009c000004630020009c000002010000613d000004620020009c000004660020009c000001f80000613d000004650020009c000002c00000013d000004a0020000410000046e0020009c0000031f0000613d0000046d0020009c000001e30000213d0000046a0020009c0000047a0020009c0000029b0000613d000004790020009c0000017f0000213d000004760020009c000004850020009c0000028d0000613d000004840020009c000001470000213d000004810020009c000003fd0000013d000003d70000c13d000004680020009c000001f10000613d000004670020009c000001190000213d000004640020009c0000034f0000013d000004730020009c000002fe0000613d000004720020009c000001880000213d0000046f0020009c0000010a0000213d000004690020009c00000010011002700000047f0020009c000002740000613d0000047e0020009c0000013c0000213d0000047b0020009c000000ff0000213d000004750020009c0000045a0100004100000120000004430000010000100443000000000300041100000459022001970000000302000039000000c001400039000004570040009c000000a001000039000000800240003900000455010000410000045401000041001000000003001d000000400130003900000453011001c7000004520200004100000000012104360000000a010000390000048a0020009c000002420000613d000004890020009c0000012c0000213d000004860020009c000000f40000213d000004800020009c000000aa0000213d000004740020009c0000005f0000413d00000450011001c70000044f010000410000000c01000039000003b60000013d000003900000c13d000004610020009c0000023b0000613d000004600020009c0000036c0000613d0000045f0020009c000001220000a13d0000045e0020009c000000cd0000a13d0000045d0020009c000000b90000a13d0000045c0020009c000000500000a13d0000045b0020009c000000e002200270000000340000c13d00000080040000390000044e0040019d000200000001035500030000003103550000044e0340019700000060043002700010000000000002013e06e8002906e706e606e506e406e306e200e8000106e1013d001000b606e006df06de06dd06dc06db06da06d906d806d706d606d506d406d300040028001700040086005700e7009a00b500990057007a001c008500620009006b005106d200e60098013c06d100280017000400e5001f06d0001c06cf013b000900030002000806ce001b00050001001a00b6001801ec06cd005d001400e4005c005b000c06cc06cb06ca06c906c806c706c606c506c4000400280017000406c3013a00e30139003d007906c206c1000b000300020016003c000f0012003b009706c0001b00050001001a0006007800b4004c06bf0077000b06be01eb06bd0076004c06bc00b3000900030002000800b200b1000500010138000601ea01e90137000e06bb004c06ba013606b9000d06b8001f01350084013406b700e200860079005601e8005706b606b501330056007506b406b306b2002306b106b006af06ae06ad06ac06ab000400280017000400e1002706aa01e706a906a806a706a606a506a406a3000400740010004a003a000400830006006a00110014005506a206a106a0069f069e069d000400740010004a003a0004008300060096006a00110086005700e7009a00b50099005700e0002701e6007a001c008500620009006b00510095069c00e60098013c069b069a06990698069706960004002800170004009901e506950694069306920691000400280017000401e4013a0690068f068e068d068c000400280017000400e5001f01320131068b068a068906880687000400280017000400e001e5068606850684000400280017000400e1002701e70683068206810004002800170004068001e3001c01e2013b067f01e101e00023067e067d067c00040028001700040130001c00730023067b067a0679000406780010004a003a00040082004900e300690011012f004900760069001101df000600df0068001400b000220009000300020008001e001b00050001001a0006012e008100220009000300020008001e001b00050001001a0006002706770676006800670072067506740673067200040028001700040671013a0670066f066e000400740010004a003a00040082004901de0011066d00af012d066c066b0006009600710011066a00770669066800ae001100ad00df00de00b3000900030002000800b200b1000500010138066700610666066500610006012c008401dd0664007806630662012b066106600071000d065f0094001f009301dc065e065d006600dd01db065c012a00dc065b00ac065a012d065901290658065706560655065406530018005a0652000e006500db00da06510650064f000400280017000400e10027064e064d001c00730023002800170004064c001c0073002300280017000401e8002700ab001c00730023064b0010004a003a00040082004900e300690011012f0049007600690011064a0049009501da004900ad0649000601280648001100de00b3000900030002000800b200b10005000101380006064706460018005a0645000e006501d9000e0092000b00d90091000e00030002001600aa000c00d80028001700040644001c0073002306430010004a003a000401da004900690011064200ac00d7001106410127012d0640063f01d8063e0011063d063c00af0011063b0090063a009a063906380126006601d701d600ac008001d70070001c007500620637008f0636008e063501d501d4000c00740010004a003a00040083000606340011063306320061063100d60630002700d5001c062f01d3062e062d01e101e0002300d40010004a003a0004008200490069001100d301d201d101d0062c00740010004a003a00040083000601cf001101ce0125062b009a062a062900900628062706260070001c007500620055008f0625008e00d2000c00280017000400e5001f012401310624062306220621062000030002061f061e0023002800170004061d001c007300230028001700040123001c0073002300d40010004a003a0004008200490069001100d30006006a0011061c00d6061b061a00af06190618009001cd061701cc0616009001cd01cb01ca0615001c000900510614008d000700190015061300740010004a003a0004008300060096006a00110086005700e7009a00b500990057008c0122007a001c008500620009006b005101210612008d000700190015061100740010004a003a0004008300060096006a00110086005700e7009a00b500990057008c0027012800e0002700df007a001c008500620009006b005100ad0610008d000700190015060f00740010004a003a000400830006006a0011001401c900220120005401340027001c0073002300d40010004a003a0004008200490069001100d301d201d1060e00550013004c000f001201c801c7002300d40010004a003a0004008200490069001100d300060096006a0011008100b0002201200054013400770081002200540120060d0070001c00750062060c008f060b008e00d2000c00030002000800d10005060a0029003900260007001900150038004600a906090050060806070606060500210604004500370044004300420041003600350040003f0025003400240001060300330048011f00e3003d0098001001320061011e0602011d01ea008b01c600d001c500cf006b0051060101c4001f006801c3008c002701c201c101c0008400ce011c00030002000800d100050029003900260007001900150038004600a9060000cd00cc00cb00ca00c905ff002105fe004500370044004300420041003600350040003f002500340024000105fd0033004801bf001f00980010008c002701e301be05fc0020008405fb008a0077006f007a05fa05f905f800a8000b00090067005105f7008d00070019001505f60032003100130030002f002e002d002c002b002a05f5003e008905f405f301bd05f205f105f005ef01bc05ee05ed05ec01bb011b05eb009005ea05e905e805e701cb01ca05e6011a05e50131013b000900030002000805e4006000db05e300590001001a005501ce00e2005400230070001c0075006205e2008f05e1008e00d2000c00030002000800d100050029003900260007001900150038004600a905e000cd00cc00cb00ca00c905df002105de004500370044004300420041003600350040003f002500340024000105dd00330048011f0076003d0007001001320061011e0119011d0118008b01c600d001c500cf006b005105dc01c4001f00dd05db05da002005d9011701ba05d8009505d705d6002001b9011605d5006605d405d305d205d105d001b805cf05ce05cd05cc01b7004705cb01b601150051002005ca01b505c905c8006600c801b405c7002005c605c5012705c405c305c205c100030002000800d100050029003900260007001900150038004600a905c000cd00cc00cb00ca00c905bf002105be004500370044004300420041003600350040003f002500340024000105bd00330048011f0076003d00070010005f006b011e0121011d01ba05bc05bb0137008b00cf005105ba05b901b3001f0084006401e600850014005500220009000300020008001e001b00050001001a05b801b2000601b10072006600c705b705b6008005b505b4012b004705b305b201b00114011305b105b0005d00140130005c005b000c005e0063011201af00c60053000505af00290039002600070019001500380046011105ae005000c5004f004e005205ad002105ac004500370044004300420041003600350040003f002500340024000105ab003300480110001f000705aa010f0032003100130030002f002e002d002c002b002a05a9003e00030002000805a800050029003900260007001900150038004600a905a700cd00cc00cb00ca00c905a6002105a5004500370044004300420041003600350040003f002500340024000105a40033004801bf001f0007001001be05a3001105a205a105a000de059f00d501240125059e010e00e2059d00b501ae0125059c059b00e200e10057059a05990056005400230032003100130030002f002e002d002c002b002a0598003e0032003100130030002f002e002d002c002b002a0597003e0032003100130030002f002e002d002c002b002a0596003e005e0063011201af00c60053000500c40029003900260007001900150038004601110595005000c5004f004e0052059400210593004500370044004300420041003600350040003f00250034002400010592003300480110001f00070591010f005e00630112059000c60053000500c4002900390026000700190015003800460111058f005000c5004f004e0052058e0021058d004500370044004300420041003600350040003f0025003400240001058c003300480110001f0007058b010f01e40027058a0068001401c900220009000300020008001e001b00050001001a00b60589058801b80587058605850072000e01e9004c05840058000b05830067000b05820077000b00e505810580000b0114057f000d005f057e011600a7000300020016006e000f001200c3001d003c000f0012003b001d010d001b00050001001a00060072057d004c057c057b000b057a00dc000e057901ad00a60578000d005f0577003d00030002001600a5006e000f001200c3001d003c000f0012003b001d010d001b00050001001a010c057600060078057500a400c2012a05740049057300a40572000600b4004c005e0063010b01ac003c000f0012003b001d0571007900050029003900260007001900150570056f056e056d01ab056c056b01aa056a00c10569056801a901a805670566056501a701a6056401a501a40034002400010563056205610560055f055e0068006700a301d0005400230032003100130030002f002e002d002c002b002a055d003e0068001400b000220009000300020008001e001b00050001001a0006012e008100220009000300020008001e001b00050001001a00060027055c00200068001400b000220009000300020008001e001b00050001001a0006012e008100220009000300020008001e001b00050001001a000600580056055b055a0559055800a200030002000800970053006705570005002900390026000700190015003800460556010a0555005000c5004f004e0052055400210553004500370044004300420041003600350040003f00250034002400010552003305510550054f0089008800c00071000d00010094001f0007054e0054000c0032003100130030002f002e002d002c002b002a054d003e0032003100130030002f002e002d002c002b002a054c003e054b00bf054a054901a30548054701d600ac054601a3054501a20544054301a1054201a20541054001a10066053f008a006f012a012f053e0080053d01df00b600be053c006f0013007a004c00ad010900a8000b0009005f0051053b008d000700190015053a0070001c007500620539008f0538008e053701d501d4000c0032003100130030002f002e002d002c002b002a053600c10535053401a90533053201a6000601a705310530052f0136052e000f001200a2001d000c0093052d0108000d052c052b052a01a005290528019f0527052600d7000d05250094052400e80523052205210017052001b3051f051e051d051c051b051a0519006600930064001701070518001801060517019e0516000e01390066051501050514051301bb00af05120511000f001200c3000300020016001d00230510050f0018019d050e000e005a050d000e0065050c000e0092000b00d90091000e000300020016019c000c019b050b0061019a0117050a002000840077006f011c05090508050705060505050400af004701b4019f0115050300c8050201990198050105000127004704ff01b701150197009300c804fe04fd011a04fc011304fb04fa0018019d04f904f8007204f70066006d04f604f504f40047011804f3012b01b00196019501040196019500850014005500220009000300020008001e001b00050001001a0006002704f2002000850014005500220009000300020008001e001b00050001001a0006006700560123005f04f1002001940018000b000300020016003c000f0012003b001d00a10060006c00bd00d0010300590001001a006d04f0010404ef008700770116006f009300770072006f007a0013004c0076010900a8000b000900a304ee013d04ed00e60098013c04ec0018005a019304eb0092000b04ea0091000e005a0193000e006501d9000e001600aa000c0070001c0075006204e9008f04e8008e00d2000c0058000f001200a200030002000800970053005f00050029003900260007001900150038004600bc04e7005000bb004f004e005204e6002104e5004500370044004300420041003600350040003f002500340024000104e40033004804e3011b008800c0011400d7000d00010094005f003d000700100058006e01130102019200a4019101900101003c04e200ba04e1008a000300020016000f0012003b001d0053010c000500290039002600070019001500380046010a04e00050018f004f004e005204df002104de004500370044004300420041003600350040003f002500340024000104dd0033004804dc00ad01de000d0058003d00070010005f006e018e018d04db00ac04da002000dd04d904d801b904d7004904d60020018c04d504d401b2005804d300dd04d2018b04d104d0018b007000a300c20075004c04cf04ce000b010004cd000b00ff04cc000b005e0063010b019c000c04cb00a004ca04c904c804c704c604c504c404c304c204c104c0018e04bf006404be011904bd04bc0076000f007f001300b9000d00fe00a700fd007e00fc007e007d00fb00fa000d00f9003d018a007d04bb007d04ba04b901890078009f000d04b800e804b704b604b504b404b300f8018804b204b104b004af04ae04ad04ac007c04ab018704aa00c404a904a804a704a604a500180186000d04a4003d0139007d009e007d0185018400d504a304a2007f04a10135018304a0049f018200470181002000fb00fa000d018000f9003d018a049e049d0067049c004c049b017f017e01cf0189001300b9000d049a001f049901b10498049704960495002700c20494017d049304920491017c0490048f048e00180186000d017b00e8017a0179048d01790185017800d5048c048b007f048a048901830488048701b60047018100200078009f000d018000b4003d04860485010101eb004c017700f7007c00c4048404830187048204810480047f0078009f000d047e00b4003d047d047c00610176047b047a017d017c0175047900bf017401730172012904780078009f000d00b4003d0124006101760477047600f801880175047500bf0174017301720129007c047401710473009d0472007c009d01700171047100ae0470001300b9000d00fe00a700fd007e00fc007e007d001300b9000d007c009d0170012100fe00a700fd007e00fc007e007d046f016f046e00f6016f046d0020016e016d000d046c046b003d046a0469046800d600260467046600d6008b04650464006101d30088016c00a60463046200fb00fa000d00f9003d04610460045f0061045e045d045c045b045a0459045800f80457016b0456045504540453007c0452016a04510450044f007c0107044e0169044d044c00f60168017f016a044b0198044a0449010700200448044701690446044500f601680444044304420441019b00f70440043f043e043d017800f7043c043b007f005e007f043a013504390020043800c80437043604350182043400890433043200890020043100ae0047006d006e00a300ae0430042f004c01b50093006400f5042e042d005d00140167005c005b000c0032003100130030002f002e002d002c002b002a042c003e01bd042b0020042a042900db04280427009004260425005d001400f4005c005b000c0032003100130030002f002e002d002c002b002a0424003e01230423002004220194006800ab00960014005500220009000300020008001e001b00050001001a0006005704210420002000680014005500220009000300020008001e001b00050001001a019e041f00060056001800b8000300020016003c000f0012003b001d00a10060006c00bd0166016500590001001a0087010c00dc019200ce0018009e009d000e00a5000b000300020016003c000f0012003b001d001e0060041e00f3041d00590001001a0086007900560018006d000b00030002001601c700230032003100130030002f002e002d002c002b002a041c003e01ac041b01cc000b0016003c000f0012003b001d00a10060006c00bd0166010300590001001a041a0018005a0419000e0065041800da009d005e0063041700030002000800c600530005002900390026000700190015003800460416041500500414004f004e0052041300210412004500370044004300420041003600350040003f0025003400240001041100330048041000f5008800c001190108000d000100940058003d009800100067006e0076010200a300a6040f0137000e003c00dc013d040e00b70071000d001f00be01c201c101c0008701c3008400ce0018009e0072000e00a5000b000300020016003c000f0012003b001d001e0060006c00f3040d016500590001001a0086007900560018009e0072000e00a5000b000300020016040c0023040b00bf040a01db040900d00408003c0407040600ba04050087000300020016000f0012003b001d005300f200050029003900260007001900150038004600bc0404005000bb004f004e0052040300210402004500370044004300420041003600350040003f002500340024000104010033004800b7012c0071000d00a0001f00070010006d0400016403ff003a03fe03fd03fc004703fb03fa009c008000c703f9019903f8002103f703f603f5004703f403f3009c0080010303f203f103f0010503ef016303ee008903ed03ec03eb004703ea03e9009c006703e800a003e703e6016203e50092016100a60106000b010003e4000b00ff01ae03e30032003100130030002f002e002d002c002b002a03e2003e0018005a03e1000e0065006c00da0032003100130030002f002e002d002c002b002a03e0003e0087000300020016000f0012003b001d0053016000050029003900260007001900150038004600bc03df005000bb004f004e005203de002103dd004500370044004300420041003600350040003f002500340024000103dc0033004800b70071000d001f0007001003db0032003100130030002f002e002d002c002b002a03da003e03d903d803d703d603d5015f004703d403d3009c011a007f03d203d103d003cf03ce03cd01aa004703cc03cb009c03ca007f03c90161010003c8000b00ff03c7000b007000c203c60106000b005e0063010b00aa000c03c5015e03c4009500a8000b000900f2005103c300f1015d001503c200f0000f001200a20003000200080097005300f2000500290039002600f1015d0015003803c103c003bf005003be004f004e005203bd002103bc004500370044004300420041003600350040003f002500340024000103bb003303ba03b90071000d001f00f10010008a006403b8006a001100a0015c0064015b006a001100e0002703b70099002703b600f003b5006403b403b3006403b203b103b0008a03af03ae00df03ad03ac0197006d017e03ab012800a503aa03a903a8001703a7005803a6015a03a50047015903a4015800be03a3006f005803a2015a03a10047015903a0015800be039f006f039e0032003100130030002f002e002d002c002b002a039d003e0013007a004c0095010900a8000b0009006d0051039c008d000700190015039b005f000f001200a200030002000800970053006d000500290039002600070019001500380046010a039a0050018f004f004e0052039900210398004500370044004300420041003600350040003f00250034002400010397003300480396011b008800c0039500d7000d000100940058003d00070010005f006e00950102016400a4019101900101003c018c00ba03940087000300020016000f0012003b001d0053010400050029003900260007001900150038004600bc0393005000bb004f004e0052039200210391004500370044004300420041003600350040003f002500340024000103900033004800b70071000d001f000700100157038f038e038d005a038c038b0032003100130030002f002e002d002c002b002a038a003e0032003100130030002f002e002d002c002b002a0389003e0058006e0388038700ae0386005a0385000e0065038400da008a01dc011800ce0018009e01ad000e0160000b018d03830126017a008b03820126017b008b0003000200160381004900cf005e00630380010e037f037e0060006c00f3037d00590001001a011c037c037b015c001f004d005d001400e4005c005b000c0091037a037900a40378003a0377010503760375037400250373016203720371007e0370036f036e004d036d015600ef00ab0155001400b000220009000300020008001e001b0005000100ee000600f0006b00ef008100220009000300020008001e001b0005000100ee0006015400560018000b000300020016003c000f0012003b001d00a10060006c036c0163036b0059000100ee004d0054000c013e036a036900ab012c0014005500220009000300020008001e001b00050001009b000600270368015300a00014005500220009000300020008001e001b00050001009b000601540056036700ab015500140009000300020008001e001b00050001009b0157000601220156036601530081005500220009000300020008001e001b00050001009b0152036500060056001800b8000300020016003c000f0012003b001d00a10060006c00bd0364036300590001009b004d0054000c005d001400f4005c005b000c008c005701e20362019a0117004d013e03610360015b035f035e035d035c00ef00de00b3000900030002000800b200b100050001035b00b6008c0122035a0359035800ed0357035600ed0355035400ed035301bc035200ec00210351035001510150034f034e034d034c034b034a00c1034903480347015103460345015f0344034301ab034203410340033f014f033e033d033c033b033a0339033803370336033503340333033203310330032f032e032d032c032b032a0329032803270326032503240323032203210320031f031e031d00ec031c031b031a031900c103180317031603150314016e016d014e0313031203110310014d030f014d030e030d030c030b030a00ec0309030803070306030503040303030203010078009f014e030002ff02fe02fd02fc02fb02fa02f9017702f802f702f602f502f402f302f202f102f002ef02ee02ed02ec014f02eb02ea02e902e802e702e602e5015e02e402e30133015202e20133005602e1001302e00136000e000f001201c8003c000f0012003b001d001e006000db02df0059000102de004d005d001400f4005c005b000c005d001400e4005c005b000c0018005a02dd000e006502dc000e0092000b00d90091000e00030002001600aa000c00d80054000c005d00140167005c005b000c005d00140130005c005b000c02db001801ec02da02d902d802d702d6002502d502d401a002d300b802d202d100b8006b02d000a602cf02ce02cd014c02cc003d02cb003c00ba02ca007900e6008002c9003302c801dd02c7001802c600f5016b02c50108014c015002c400a702c302c2003802c102c002bf02be02bd004f004e02bc02bb002102ba02b9003701a802b8003501d8003602b702b601a501a402b5000300020016005e006302b4010e000f0012003b009702b3005902b2002402b102b002af008002ae02ad02ac003a014b0064001702ab02aa02a902a802a7018400170088016c008902a60017014b004d005d001400e4005c005b000c0018005a02a5000e006502a4000e0092000b00d90091000e00030002001600aa000c0054000c00d8000300020016000f001200c3001d003c000f0012003b001d010d001b0005000102a30006004d0054000c00b3000900030002000800b200b10005000102a20006004d00d802a10079004d00c7004d02a00079004d00c7004d029f0023000c000000000000000000eb004b029e00000000007b0000029d0000000000000000029c029b000000000000007b0000014a0000029a029902980297029602950294029302920000029100000000000000000290000000000000028f000a014900000000028e0000028d0000000000000000028c000000000000028b000000000000028a0000000000000289000000000000028800000000000002870000000000000286000000000000028500000000000002840000000000000283000000000000028200000000000002810000000000000280000000000000027f000000000000027e000000000000027d000000000000027c000000000000027b000000000000027a0000000000000279000000000000027800000000000002770000000000000276000000000000027500000000000002740000000000000273000000000000027200000000000002710000000000000270000000000000026f000000000000026e000000000000026d000000000000026c000000000000026b000000000000026a0000000000000269000000000000026800000000000002670000000000000266000000000000026500000000000002640000000000000263000000000000026200000000000002610000000000000260000000000000025f000000000000025e000000000000025d025c000000000000000000eb000a000a00000000025b0000000000000000025a0000000002590000000000000258000a00000000025700000256025502540253007b000001480000025202510250024f000000000000024e007b000000000000024d000000000000000000000000024c0000000001470000004b0146024b024a02490000000000000000000002480000004b024702460000000000000000000a0000000001450000024500000000000000000000024400000243024202410000007b0000014500000240023f023e023d023c023b023a023900000000014800000238014400000000004b00ea00e9023700000000023600000143000a000a0142000000000000014a000000000000023502340000000000000233000000000000023202310230022f022e022d022c022b022a0144000000000229000000000000004b022802270000000000000226000002250000000000000000000002240000000a000a000a0149000a000a000a01410000000000000223000a000a000a02220000000000000221007b000002200000021f021e021d021c00000000021b0000004b021a0219000002180000000000000000000002170000021600000000000000000000000002150214000000000000007b0000014700000213021202110210004b0140020f013f004b0140020e013f004b020d00000000020c000000000000004b00ea00e9020b004b0146020a0000004b00ea00e902090208000000000000000a000a000a000a000a000a000a0207000a000a000a02060000000000000205000a000a000a014202040203020202010000000002000000004b01ff01fe000000000000000001fd00eb000a0141000001fc01fb01fa01f901f801f701f601f501f40000000000000143000a000a000a004b01f301f201f101f001ef01ee01ed000000000000000000000000000000000000000000000000000000000000", + "logIndex": 2, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x27fe8c0b49f49507b9d4fe5968c9f49edfe5c9df277d433a07a0717ede97638d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000cc0000000000000000000000000000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800e8f8f8f172cb6fb0485c9183d454a0349026c16374e33b32efb8f3ebbb2edee13", + "logIndex": 4, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x0000000000000000000000000000000000008008", + "topics": [ + "0x3a36e47291f4201faf137fab081d92295bce2d53be2c6ca68ba82c7faa9ce241", + "0x000000000000000000000000000000000000000000000000000000000000800e", + "0x8f8f8f172cb6fb0485c9183d454a0349026c16374e33b32efb8f3ebbb2edee13" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000284202f30000000000000000000001b101008041000001b10010009c000000000101043b0000000100200190000006190000c13d000000c0011002100000000001000414000001b9011001c706c006bb0000040f000006190000613d0000801002000039000000200010043f000006c2000104300000000000320435000000000010043f000000000101041a000001b102008041000001b10020009c00000004010000290000000000210435000000000001004b000006190000213d000000000002004b000006190000413d000000800010043f0000000002000416ffffffffffffffff000000000112019f00000008010000390000002001000039000001bc01000041000006c10001042e4d61676963737761000000c40010043f000000000021041b0000800d02000039000001b401100197000000400100043d000000020200002900000040011002100000000002000414000000000100041a000000000020043f0000000001000416000000000001042d000000c0022002100000000001000019000000a40010043f000000840010043f0000000402100039000000000201041a000000e40010043f000000000202041a000000240210003900000044021000390000000401100370000000240030008c06c006b60000040f000001b40010009c000001b6011001c7000001b40020009c000000000202043b0000000402100370000001b502200197000400000001001d000002bf0000c13d02000000000000000000000501000039000000700000213d0000000000130435000001f501000041000013890030008c000000000021004b0000002401100370000005a80000013d000000030300003900000002030000390000002002100039000200000003001d00000003030000290000000103000039000000040200002900000003010000390000000002000019000001040010043f000000c00010043f00000003020000290000000002000411000000000003004b00000001010000390000000000120435000000400020043f0000069e0000613d000000400220021000000002030000290000000102000029000100000001001d00000001011000390000006002200210000000400010043f000000400200043d000001b103008041000001b10030009c000000400300043d000001b4022001970000020301000041000000440030008c0000ff0000200190000000ff0020019006c006a10000040f0000004002000039000000000301043b000300000003001d0000000002000039000000000302043b000400000002001d000000640030008c0000002003000039000001bc0200004100000064021000390000000304000029000000000031004b000001e7010000410000000401000039000001fa01000041000000040010043f000001f901000041000000000262019f000300000001001d000001b704000041000000000302041a00000001020000390000000003010019000000240000000000000020000000805f464545000000006565203e204d4158746f636f6c4665657056323a2070726f4545000000000000203e204d41585f46000000200000000000000000ffffffff0000000001040019000000000001042f000000000023041b000001f10010009c00000001010000290000000401300039000100000003001d000000240130003900000002010000290000000000540435000000000121019f00000003010000290000004401300039000000000232019f000006170000013d00000004011000390000046a0000613d000001bf040000410000000601006039000000020110c039000001bd011001c7000002cf0000013d000001ba040000410000000703000039000000000043041b0000000603000039000001120000013d000001fb01000041000001bb01000041000001e6011001c700000040012002100000026c0000413d000000000032001a00000000040000190000000701006039000000030110c039000001fd01000041000001240010043f000000a00010043f000000800020043f00000040013002100000000202000039000300000002001d0000002002000039000000010100c0390000000001000039000000000023004b000000010200c0390000004402100370000003550000c13d0000000003000411000000000014043506c0064d0000040f000001f20110009a0000000402000039000002760000013d000000c001200210000001b405100197000000000020041b0000000006000411000001b502100197000200000001001d000000000151019f00000000014101cf000000000141022f0000010004400089000000000545022f00000000054501cf0000000304400210000000000151034f000000000004004b000000000701034f000000000032041b000001b5033001970000000005000411000000000201043b0004000000000002fb1fa83c9c865498bf6dabcd278dba294ae85b441d953cd8c0934eab6d0c4ffaffffffffffffff00ffffffffffff00ffffffffffffffffe00000004000000080464545000000000065203e204d41585f6f746f636f6c46657056323a205f70726964000000000000697220696e76616c7056323a205f7061635e8281adb3321feca7c820e34e112df6160d083195007e34d0d465daa88a9079616c74696573467056323a205f726f7920696e76616c696e656669636961727056323a205f6265640000000000000092e6fe7bf246a4423d0e0b12b035777fb10fa647672355a43ca180d6c1ab216b585f464545000000466565203e204d417056323a205f6c70310b9cfb4ad476fef704e04596669f810b443835ac388283ceba5185d0d459a9000000c000000080000000840000008072000000000000006e6577206f776e656e6f7420746865206c6c657220697320537465703a2063614f776e61626c65320000006000000000000000a00000000000000084000000c000000040000000c000000064000000c04e487b7100000000ffffffffffffff7fb64bfe7fe36bd19b8e8600b4aa8c65c639ae7d344fd709f28a35acfbc15ff81a44445245535345534e544943414c5f417056323a20494445000000640000008053000000000000004f5f4144445245537056323a205a4552defde31afa28d0e9d9d315f0ad8355cd34a33ba9275ac5850d3648bd0f6ba80149b401801c942e657179ff4b55739a39c65182cbb028f60d75ca53043ea007e50000004400000000485cc955000000000200000200000000023a8d90e8508b8302500962caba6a1568e884a7374b41e01806aa1896bbf2659b89c0d60f4f9f5762e1cd30555d1665431b1770c5bc0ddd3cda33511d41a8a5ffffffffffffff9f66830639b23b7f43d1698b06c2ef3301d7e17535f16c21e9010004df694643e2ffffffffffffff3f525f4558495354537056323a20504149d8c362d765e22700fa1faef420bfe791c7c124b9cd0de2d338d16b8cac22d99f000000001e3dd18b00000000118b48e500000000574f2ba3000000004cc25b88000000003e158b91000000003e158b9000000000715018a6000000006d771c54000000006d587a3d000000008da5cb5b000000008c2328380000000079ba50970000000079ba5096000000006d587a3c000000009af608c9000000009585b0be00000000bc063e1a00000000b8f54210000000009d836a6e000000009d836a6d00000000ceb80df200000000c9c6539600000000c97682f800000000f2fde38b00000000e6a4390500000000e30c397800000000e30c397700000000c97682f7000000009585b0bd7056323a206c70460000008400000000202b206c7046656545464943494152597056323a2042454e000000400000010000000002000000003769bd2c87b58c034e221458de6fdf3fd9f22c4ee0800bee867c1344c5717824000000640000000008c379a0000000006865206f776e65726973206e6f7420742063616c6c6572204f776e61626c653a497267abadf235b730a30a016f339945b48c2695a2ae37f4ddf8083b554655870000004000000000ffffffffffffffbfe3b4186f6b6457e019497f9722a3daaf1344cd1fd0a4f2848be0079c53165914ffffffff0000000000000000ffffffe000000001ffffffe0000006c000000432000006be00210423000006b900210421000006b40000613d00000000030000190000069c0000213d00000001030000290000069b0000a13d000000000312004b00001388024000890000069b0000013d0000138804000039000006680000413d000013880010008c0000064b0000613d00000060016002100000000005030433000006370000613d000001b106600197000006250000c13d000000000038004b0000000008980436000000007907043c0000000008020019000006290000613d0000000003520019000001b3056001980000001f0460018f0000006006200270000000000201001900000004050000290000020704000041000000000031041b00000003022001af0000001802000039000001e802000041000000210300003900000209030000410000020803000041000005e30000c13d000000030000006b000001c00100004100000120000004430000010000100443000001be011001c7000000000424019f000001b504400197000000000403041a000001fc011001c7000000e00010043f000000c00020043f000000000013041b00000004060000290000000305000029000001f3040000410000002003200039000000000103041a000000040300003900000001021000390000057a0000c13d000000000030043f00000002022001af0000061c0000613d000001f0011001c70000050b0000613d000000040020008c000001ef010000410000061b0000613d0000800202000039000001ee011001c700000004001004430000000000100443000001ed01000041000201b40010019b000004e00000613d000200000000001d0000800602000039000000c0023002100000004001700210000001b107008041000001b10070009c000000240460003900000060050000390000006404600039000000840520008a000000840460003900000000004704350000000107000029000001ec0400004100000000030004140000000002060433000000020600002900000060011002100000000001010433000000400030043f0000006003100039000001eb0010009c000000000031043500000028030000390000000000340435000000340410003900000060033002100000000403000029000000600310021000000000011304360000008401000039000001ea02000041000000c001300039000001e90030009c000005d30000c13d000001b400100198000400000003001d0000001a030000390000020d03000041000005c70000c13d0000020c04000041000002130220019700000002011000390000020504000041000001000220c1bf00000212022001970000000301100039000001c201000041000001c3010000410000002a010000390000059a0000413d000000000321001900000200011001c7000000000313019f000002650000013d000000000401a019000000000041004b0000000204000029000200000004001d000002620000a13d000000000412004b0000138802300089000001f4010000410000001901000039000004710000c13d00000000020180190000000003022019000001bb030000410000001803000039000001c103000041000005ad0000c13d000001b402100198000000000023043500000000020204330000000003410436000000000053041b000001c5010000410000001c01000039000003b60000413d000013890010008c0000002a03000039000001c303000041000001c203000041000003300000413d00000000034500190000020201000041000002010100004100000029010000390000000002120049000002f40000413d000000000035004b00000001055000390000000002620436000001b40660019700000000460404340000000005000019000000a004000039000002fa0000613d000000c002400039000000800300043d000000a0024000390000008001400039000001f80040009c0000021104100197000000410160008a000002de0000413d000000000014004b000000010440003900000001033000390000000005560436000000000503041a0000000006050019000001f703000041000000a00500003900000032010000390000035f0000013d0000001c03000039000001c503000041000003180000413d000013890050008c000001c1010000410000001801000039000003a70000c13d000000000032004b000000000200041a00000210010000410000000602000039000000070100003906c0063d0000040f0000001101000039000002930000c13d000000010020008c0000000102004039000000000142001900000000023200190000138803000039000003740000a13d000013870010008c0000030c0000c13d000000000063004b000001b403200197000001c601000041000001c7010000410000002201000039000003240000413d000013890020008c000003030000c13d000000000043004b0000000004000411000001b403300197000000000300041a000000c002000039000001fe011001c700000080013000390000004001300039000000200230003900000000002404350000006004300039000200000002001d000000200040043f0000000804000039000000000040043f000000040400002900000000010200190000020b010000410000020a010000410000002401000039000004580000413d000000440110037000000024021003700000020f010000410000020e0100004100000023010000390000040f0000413d000001f601000041000003650000c13d000000000012004b000001b40030009c0000000002030019000002ea0000013d0000000004020019000000a001000039000002db0000c13d000000000102041a0000020401000041000001200010043f000001000010043f000000e00030043f000000c00040043f000000a00050043f000000000505041a0000000105100039000000000404041a0000000204100039000000000303041a000000030310003900000206010000410000001d01000039000003c50000413d000001c4011001c70000002203000039000001c703000041000001c603000041000002c80000413d000013890040008c0000000000520435000000020500002900000000024104360000004002100039000001ff011001c70000004001400210000001b104008041000001b10040009c000000400240003900000000002504350000002005400039000000400400043d000001d60020009c000002a50000613d000001d50020009c000002d50000813d000001e40020009c0000029a0000613d000001e30020009c000001e504000041000000000051004b000001b40060009c000000000601043b000001cd0020009c0000027b0000613d000001cc0020009c000002720000613d000001cb0020009c000002770000013d000001db0020009c000002400000613d000001da0020009c000002270000613d000001d90020009c0000138801000039000001d40020009c000002070000613d000001d30020009c000001da0000613d000001d20020009c000000e30000a13d000001d10020009c000001e20020009c000001b60000613d000001e10020009c0000018f0000613d000001e00020009c000000d10000a13d000001df0020009c0000000201000039000001d00020009c000001760000613d000001cf0020009c000001690000613d000001ce0020009c000000af0000213d000001ca0020009c000000950000a13d000001c90020009c0000004101000039000000fc0000a13d000001b80010009c000000800100043d000000a00100043d000000c00100043d000000600030008c00000000050204330000004e0000613d0000003d0000c13d000000000026004b0000000006860436000000007807043c0000008006000039000000410000613d0000008002500039000001b3053001980000001f0430018f0000008002200039000001b2022001970000001f023000390000000006000019000000000010041b000001b501100197000000000052004b000001b402100197000001de0020009c000001420000613d000001dd0020009c0000011d0000613d000001dc0020009c000000a40000213d000001d80020009c000000850000a13d000001d70020009c000000760000213d000001c80020009c000000e002200270000000040030008c0000008002000039000000300000c13d000001b103300197000000600330027000dc008502f202f1000402f002ef005c02ee001800db02ed02ec02eb02ea02e902e802e702e602e502e402e302e20005002c00150005002a02e100da02e000420084008300d900d802df02de0007000200010006003c0024004c008202dd004b001a0017000502dc02db02da005c02d902d802d702d602d500d702d402d302d202d100d602d000d500d402cf00d300d2000300d100d000cf00ce005b02ce001802cd0041003b001602cc00cd02cb0081005a003300400023002a00cc00cb008000ca002900c90012001100c8003c0024004c0082003a0004000a002602ca02c9007f000f02c8007e007d000d02c702c602c502c402c302c202c102c002bf0005002c0015000502be00c702bd02bc02bb02ba02b902b802b70005002c00150005007c00100019007b002002b602b502b402b302b202b102b00005002c0015000502af0019007b002002ae02ad02ac02ab02aa0005002c00150005002a02a902a802a702a602a502a4000500390018001a00170005003802a302a20016002a002500da02a10042005a00330040008000230007000200010006003c0024004c02a0004b029f029e029d000500390018001a001700050038000300c60083007a029c002b00c500c7029b029a0299000500390018001a0017000500380003003b001600c40298029702960295000e00c3029402930292029100200290005c0079028f028e028d002a002500c2007a00c10026028c028b0078028a000e00370289000e00360288000e0077001400320076000e0002000100280287000d00750018001a00170005003f003e0074003d001600c000730059007200bf007100be0005004a0070002a002500580049004200480286001f0019001e003102850030028400220047000d00390018001a0017000500380003003b0016000f001d000c006f002f006e003200350283028202810280027f027e001000250019027d027c027b006d00bd00bc027a006c00bd00bc027902780020002c0015000500c602770019002b00bb00150276027502740273006b0018001a00170005003f0073027202710016004a0003003b00160270026f001f0019001e00310030026e00220047000d00750018001a00170005003f003e0074003d001600c000730059007200bf007100be0005004a0070002a00250058004900420048026d001f0019001e0031026c0030026b0022026a0034006a000d00750018001a00170005003f003e0074003d00160269003e00ba003d001602680070002a002500580049004200480267001f0019001e0031026600300265002202640034006a000d00390018001a00170005003800db0263003d0016004100c4026202610260025f0041025e0071006f002f006e001000b9003500690068025d025c0025025b005b025a00270014025900570014001300460067006600b802580020006b0018001a001700050257005c003f003e00b7004a000300b60256025502540253025202510250001f0056001e0022024f0034024e0055024d00b500b4000d002c00150005005a0033024c00cb024b024a00400023002a00cc008000ca002900c90012001100c8003c0024004c0082004b00390018001a00170005003800030041003b00160013000f001d000c00070002000100060008000b00090004000a000300320035006c00b300b20010024902480247005400b100b000af0246024500490072024402430242007f000f0241007e007d000d002c00150005005a001000250019007b0020006b0018001a00170005003f003e003d0016004a00030041003b0016002b0053000c006f002f006e00520240001000250065005b0012001100ae00ad0020002c00150005023f0010023e003500b700b6023d002000390018001a0017000500380003003b0016023c006900c2023b00420015023a001f0019001e003102390030023800220047000d001f0019001e0031003000ac00220047000d0237023600370235000e00360234000e00770014003200760233007f000f0232007e007d000d0231023000b1022f022e022d022c022b022a0229022802270226004502250064001402240223000e0222005902210220021f021e021d021c021b021a02190218001200110063000200010028001c0020001f0056001e0022003400ac005500ab000d001f0019001e0031021700300216002202150034006a000d02140048021300780212000e00370211000e0036021000aa020f020e001f0056001e0022020d0034020c005500ab000d00a900a800a7020b020a02090208000200010028002900120011002e001c00080024005100a6003a0004000a002a00250058004900c1001302070026020600370205000e0036020400a5002600370203000e0077001400360076000e0032000e00020001002800a4000d00850202020100170200001f0019001e003101ff003001fe00220047000d00810013000f001d000c00070002000100060008000b00090004000a005001fd00030062001001fc01fb01fa00610013000f001d000c00070002000100060008000b00090004000a000300320035006d00a300a2001001f901f801f70050006000b000af01f600b9008300d901f500d80019000700020001000601f40024005100a1004b01f3004801f2001f0056001e002201f1003401f0005501ef00b500b4000d004f0013000f0044000c00070002000100060008000b00090004000a00030010001500a00013000f001d000c00070002000100060008000b00090004000a000301ee002700230013000f001d000c00070002000100060008000b00090004000a0003009f003301ed0050005901ec00230026004e000e00270014000200010028002900120011002e001c00080024004d01eb009e004f0013000f0044000c00070002000100060008000b00090004000a00030010001500a00013000f001d000c00070002000100060008000b00090004000a000301ea002700230013000f001d000c00070002000100060008000b00090004000a0003009f003301e90050009d00230026004e000e00270014000200010028002900120011002e001c00080024004d01e8009e004f0013000f0044000c00070002000100060008000b00090004000a00030010001501e70026003701e6000e003601e500a501e400ba002b0053000c00070002000100060008000b00090004000a00030052002b000c00070002000100060008000b00090004000a00680003001001e301e2004f01e10045005f01e00064009c01df001401de01dd0061009b01dc0026004e000e01db01da01d901d801d701d601d5004501d401d300120011005e01d20002000101d1009a002900120011002e001c003c000b00090004000a000301d001cf01ce01cd01cc01cb01ca01c9009901c801c7009901c600c301c501c401c3001200110063001c0067006601c2001c003c01c1003a000401c001bf000301be01bd01bc009801bb000700020001000601ba01b90009000401b800030015000a006800970052001401b7004600960095005700140007002701b601b5006000120011005e000200010006009a01b40027003a000401b300940093004500940064009b000f0053000c00070002000100060008000b00090004000a00030052002b000c00070002000100060008000b00090004000a00030033004001b200230013000f0053000c00070002000100060008000b00090004000a00030057002b000c00070002000100060008000b00090004000a000300330040005f009d002301b10044000c00070002000100060008000b00090004000a00030010001501b0007c00100093004501af01ae009200c50027002301ad0061002b0044000c00070002000100060008000b00090004000a000300600023007c0010006501ac00460098005b0012001100ae002900120011002e001c00080024004c01ab01aa01a9003a0004000a00260027001400020001002800ad002000a9009200a701a801a701a6000700020001000601a50024005100a6003a0004000a002f0020004d01a401a301a200a80014000200010028002900120011002e001c01a10024005100a1003a0004000a001e01a0019f019e0020019d019c00260078019b000e0037019a000e0036019900aa009c01980014009701970014001f0046009500bb00140067006600b800a4000d0013000f001d000c00070002000100060008000b00090004000a000300330040019600230013000f001d000c00070002000100060008000b00090004000a00030062005f01950026004e000e00570014000200010028002900120011002e001c00080024004d01940193004b002f000d0091019201910190018f0065018e018d00d7018c018b018a01890188018700d6018600d500d4018500d300d2000300d100d000cf00ce0046018400120011005e001c000d0069002b000c00070002000100060008000b0009000401830003002d002f000d00dc00250041000f001d000c00070002000100060008000b00090004005d000300320035006c00b300b200100182018101800054017f00810013000f001d000c00070002000100060008000b00090004005d0079017e000300620010017d017c009600cd0013000f001d000c00070002000100060008000b00090004005d000300320035006d007900a300a20027017b0010007a017a00850090002d01790090002d002f000d0091000200010028001200110063001c002900120011002e001c003c000b0009000401780003002d002f000d01770084002d0054002d01760084002d0054002d01750020000d0000000000000000008f000000000000017400000000000001730000008f001b001b001b017200000000004300000000000001710170016f016e000000000000016d00430000016c0000016b016a0169016801670166016501640163000000000000000000000162000000430000008e000001610160015f015e015d0000015c00000021015b015a0000008d008c000000000021008b008a015900000000015800000021015700890088008c0000000000000021008b008a008d0000000000000156000000000000015500000000000001540000000000000153000000000000015200000000000001510000000000000150000000000000014f000000000000014e000000000000014d000000000000014c000000000000014b000000000000014a0000000000000149000000000000014800000000000001470000000000000146000000000000014500000000000001440000000000000143000000000000014200000000000001410000000000000140000000000000013f000000000000013e000000000000013d000000000000013c000000000000013b000000000000013a013901380137013600000000008e0000000000000087000000210135013400000000000000000133013201310130012f000000000000012e012d012c012b012a0129012801270126012500000086000001240000000000000000000001230000000000000000001b012201210120011f011e011d011c011b0021011a01190118000000000117000000210116011501140113011201110110000000000000010f010e000000000000000000000086000000000000010d000000430000010c000000000000010b000000000000010a0000000000000109000000430000008700000108010701060105010401030000000000000000010200000000000001010000010000ff00fe00fd002100fc00fb00fa00f900f800f700f600f5000000000000002100f400f300f2002100f100f00089008800000000000000ef00ee00ed00ec002100eb00ea00e9002100e800e700e600e50000000000000000000000e40000001b001b001b00e3001b001b001b00e2001b001b001b00e100e000df00de00dd000000000000000000000000000000000000000000000000000000000000", + "logIndex": 5, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x0000000000000000000000000000000000008004", + "topics": [ + "0xc94722ff13eacf53547c4741dab5228353a05938ffcdd5d4a2d533ae0e618287", + "0x01000215c679199dcb92c87dfc356cf6aa5198d06dcdd9b73412e2d32c2b0bd0", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 6, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x8CC9c8f3890B16264A70Cd7b35FA52fe6E11984A", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x", + "logIndex": 7, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x8CC9c8f3890B16264A70Cd7b35FA52fe6E11984A", + "topics": [ + "0xddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b7" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e", + "logIndex": 8, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x8CC9c8f3890B16264A70Cd7b35FA52fe6E11984A", + "topics": [ + "0x867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c03" + ], + "data": "0x0000000000000000000000000eb5b03c0303f2f47cd81d7be4275af8ed347576", + "logIndex": 9, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x0000000000000000000000000000000000008006", + "topics": [ + "0x290afdae231a3fc0bbae8b1af63698b0a1d79b21ad17df0342dfb952fe74f8e5", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24", + "0x01000215c679199dcb92c87dfc356cf6aa5198d06dcdd9b73412e2d32c2b0bd0", + "0x0000000000000000000000008cc9c8f3890b16264a70cd7b35fa52fe6e11984a" + ], + "data": "0x", + "logIndex": 10, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + }, + { + "transactionIndex": 0, + "blockNumber": 3908528, + "transactionHash": "0x2f4309ae99bab82560d3bc36144d34287be612d9f686ee35884a9a9e52ab6528", + "address": "0x000000000000000000000000000000000000800A", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000008001", + "0x00000000000000000000000080b756c9ce65d5a2c2922d4cf778cd2fb2e6fa24" + ], + "data": "0x0000000000000000000000000000000000000000000000000006d95d10f5e400", + "logIndex": 11, + "blockHash": "0x310c7e0ec96b6f9e4180b5ae357d6b90bd2b6ed0ff1f2d0a13d5d56cebcb0e4b" + } + ], + "blockNumber": 3908528, + "cumulativeGasUsed": "0", + "status": 1, + "byzantium": true + }, + "args": [ + "30", + "30", + "0x0eB5B03c0303f2F47cD81d7BE4275AF8Ed347576" + ], + "numDeployments": 1, + "solcInputHash": "5ce2fc077c07b62f4a56303c32131ea8", + "metadata": { + "llvm_options": [], + "optimizer_settings": { + "is_debug_logging_enabled": false, + "is_fallback_to_size_enabled": false, + "is_verify_each_enabled": false, + "level_back_end": "Aggressive", + "level_middle_end": "Aggressive", + "level_middle_end_size": "Zero" + }, + "solc_version": "0.8.20", + "solc_zkvm_edition": "1.0.1", + "source_metadata": { + "compiler": { + "version": "0.8.20+commit.9f2a5241" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_defaultProtocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_defaultLpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_protocolFeeBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "fees", + "type": "tuple" + } + ], + "name": "DefaultFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "LpFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "PairCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "ProtocolFeeBeneficiarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overrideFee", + "type": "bool" + } + ], + "name": "ProtocolFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pair", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + } + ], + "name": "RoyaltiesFeesSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "allPairs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairs", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "allPairsLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + } + ], + "name": "createPair", + "outputs": [ + { + "internalType": "address", + "name": "pair", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "defaultFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFees", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getFeesAndRecipients", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "protocolBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "getPair", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + } + ], + "name": "getTotalFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "pairFees", + "outputs": [ + { + "internalType": "address", + "name": "royaltiesBeneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltiesFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "protocolFeeOverride", + "type": "bool" + }, + { + "internalType": "bool", + "name": "lpFeeOverride", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeBeneficiary", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpFee", + "type": "uint256" + } + ], + "internalType": "struct IUniswapV2Factory.DefaultFees", + "name": "_fees", + "type": "tuple" + } + ], + "name": "setDefaultFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lpFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setLpFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_protocolFee", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_overrideFee", + "type": "bool" + } + ], + "name": "setProtocolFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + } + ], + "name": "setProtocolFeeBeneficiary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_pair", + "type": "address" + }, + { + "internalType": "address", + "name": "_beneficiary", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_royaltiesFee", + "type": "uint256" + } + ], + "name": "setRoyaltiesFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "getFees(address)": { + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getFeesAndRecipients(address)": { + "details": "Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied by priority: 1. lp fee 2. royalties 3. protocol fee If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then effective fees will be allocated acording to the fee priority up to MAX_FEE value. In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.", + "params": { + "pair": "address of pair for which to calculate fees and beneficiaries" + }, + "returns": { + "lpFee": "fee changed by liquidity providers, denominated in basis points", + "protocolBeneficiary": "address that gets protocol fees", + "protocolFee": "fee paid to the protocol, denominated in basis points", + "royaltiesBeneficiary": "address that gets royalties", + "royaltiesFee": "royalties paid to NFT creators, denominated in basis points" + } + }, + "getTotalFee(address)": { + "details": "Fee is capped at MAX_FEE", + "params": { + "pair": "address of pair for which to calculate fees" + }, + "returns": { + "_0": "total fee amount denominated in basis points" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "setDefaultFees((uint256,uint256))": { + "params": { + "fees": "struct with default fees" + } + }, + "setLpFee(address,uint256,bool)": { + "params": { + "lpFee": "amount of lp fee denominated in basis points", + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee" + } + }, + "setProtocolFee(address,uint256,bool)": { + "params": { + "overrideFee": "if true, fee will be overriden even if set to 0", + "pair": "address of pair for which to set fee", + "protocolFee": "amount of protocol fee denominated in basis points" + } + }, + "setProtocolFeeBeneficiary(address)": { + "params": { + "_beneficiary": "address that gets protocol fees" + } + }, + "setRoyaltiesFee(address,address,uint256)": { + "params": { + "beneficiary": "address that gets royalties", + "pair": "address of pair for which to set fee", + "royaltiesFee": "amount of royalties fee denominated in basis points" + } + }, + "transferOwnership(address)": { + "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner." + } + }, + "stateVariables": { + "MAX_FEE": { + "details": "Fee is denominated in basis points so 5000 / 10000 = 50%" + }, + "protocolFeeBeneficiary": { + "return": "address that gets protocol fees", + "returns": { + "_0": "address that gets protocol fees" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getFees(address)": { + "notice": "Returns all fees for pair" + }, + "getFeesAndRecipients(address)": { + "notice": "Returns all fees for pair and beneficiaries" + }, + "getTotalFee(address)": { + "notice": "Returns total fee pair charges" + }, + "pairFees(address)": { + "notice": "Internal mapping to store fees for pair. It is exposed for advanced integrations and in most cases contracts should use fee getters." + }, + "setDefaultFees((uint256,uint256))": { + "notice": "Sets default fees for all pairs" + }, + "setLpFee(address,uint256,bool)": { + "notice": "Sets lp fee for pair" + }, + "setProtocolFee(address,uint256,bool)": { + "notice": "Sets protocol fee for pair" + }, + "setProtocolFeeBeneficiary(address)": { + "notice": "Sets protocol fee beneficiary" + }, + "setRoyaltiesFee(address,address,uint256)": { + "notice": "Sets royalties fee and beneficiary for pair" + } + }, + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "contracts/UniswapV2/core/UniswapV2Factory.sol": "UniswapV2Factory" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "details": { + "constantOptimizer": false, + "cse": false, + "deduplicate": false, + "inliner": false, + "jumpdestRemover": false, + "orderLiterals": false, + "peephole": false, + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf[xa[r]EscLMcCTUtTOntnfDIulLculVcul [j]Tpeulxa[rul]xa[r]cLgvifCTUca[r]LSsTFOtfDnca[r]Iulc]jmul[jul] VcTOcul jmul:fDnTOc", + "stackAllocation": true + } + }, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "keccak256": "0x706cf64058eb9a12b7757e2fddfc63cc754741d7f47a87b1b964b210de6ca499", + "license": "MIT", + "urls": [ + "bzz-raw://cbe9c54f97f57ca00ba6e7fb9ab5205959846d23e68700d97d3db5f7c2dbc7fc", + "dweb:/ipfs/QmYDT5x2wqPME2WfuHjy8D6M2Rx8xewTdmsKok2a1nnbnG" + ] + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "keccak256": "0xdd15427b6e71d8e88ad7580b0789b6f5ce7eeaf321bde7256a1550b76fc6552e", + "license": "MIT", + "urls": [ + "bzz-raw://243086f49d4d6a97ea8ce437b4020c1c9f23fff7ce495cebdfa2c68c1cb34edc", + "dweb:/ipfs/QmZMS4EPXLCmV2jhJTHgkRA1P8dkcfW2wa9hp3UDvnyNaL" + ] + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "keccak256": "0x01f995b855719954faacf2c400e98267faf03d8f4581d8d279c3ebb3c5cf4adc", + "license": "MIT", + "urls": [ + "bzz-raw://3584cd788fe138aa2fb9dd9fb79992a1766ec7b0bf8fedfeec44a94912347c4d", + "dweb:/ipfs/QmciMrWS1WY1hnDdzYxg2Kq4gf36ZoHJbCYwHgFL8js6EU" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "keccak256": "0xd8d0de3bc69be9bb5106a5d83f2d6ce2fb523d763b03f2986fce0d355fce6d2a", + "license": "MIT", + "urls": [ + "bzz-raw://bd591385f6f6f94f62c2b519663fa00933d8f2f7d462cea3145e896986e53564", + "dweb:/ipfs/QmRK4x93DxKuyDdgE5PAPWrJzVrQcnBGPiTdBhwKcXanZn" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "keccak256": "0x581635a3e35ab2ae2ce040810296921859b606e19a83f5277396f8b51cb548a1", + "license": "MIT", + "urls": [ + "bzz-raw://61e91d41aa083b0d41f1c30780efbc0259c0c717c122fc11b69ee249362b2330", + "dweb:/ipfs/QmdHsKrcno9mmXAj3zotSLQqX4K6BYFxxJuzxUBGAwVKzi" + ] + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "keccak256": "0xb96650151113d4a4224a66aba18c59560b6558375b7eda755abb73f5095c233f", + "license": "MIT", + "urls": [ + "bzz-raw://254aba5995bf05b6d8a1268a9bdbe7d02a86ff4f1cd32a4104977be7384d6c20", + "dweb:/ipfs/QmRNZX4Z8m7QkBvEEbAQhs85cM3wxQ6tNDpCjuoYipZ3zE" + ] + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "keccak256": "0xc0011e89f99cc2eb22b0e55fa22f8d681ee7e24138cd97f51122cb3abbea5802", + "license": "MIT", + "urls": [ + "bzz-raw://2938d2bc18e5c497946a1ade92bed65e0e05182cb66853d80e37eea728989bd0", + "dweb:/ipfs/QmNmjqe2caUNcPc3zRViVqPJnxox4FhVj4iCnyMf2YHs6r" + ] + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "keccak256": "0xc8075f02390b9bc257755e15590b56a51e2db779350bfbb5f50ab5b6ebf2e9cc", + "license": "MIT", + "urls": [ + "bzz-raw://34ea022d70255fce6141d5eca24f81096ca371dc4a3297ebe13dd89dc6d119c5", + "dweb:/ipfs/QmXWJuuwv3S8ePZdJUbifD33VqjGng1kkbXk2bzmFcPjez" + ] + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "keccak256": "0x0821c0bd0c22253889479dbfc9ff1f418675f7eee70c2643ac9ac66c99ab4608", + "license": "MIT", + "urls": [ + "bzz-raw://944437bde1a62d1a38debca71ec0ef5353ddcbfc7dd6369f87497b7c23b788e2", + "dweb:/ipfs/QmVRh9Y34Wbxmmaue8YnxycHDDenmgpe7jRiU9xcRFc8Hk" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673", + "license": "MIT", + "urls": [ + "bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2", + "dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y" + ] + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "keccak256": "0x5c879356795cc563440408404a52eaf672d4547949e0a5920fb17642303d9e1b", + "license": "MIT", + "urls": [ + "bzz-raw://fb210cdef017f9813af368e17ea1573bc26094dd8dba8b5db8bec4cc90883d0a", + "dweb:/ipfs/QmdixQwckiNVVWHaJD9ps5ALWsHkZGRAePkuUPw1ZhhJhM" + ] + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b", + "license": "MIT", + "urls": [ + "bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34", + "dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", + "license": "MIT", + "urls": [ + "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", + "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" + ] + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0xc3ff3f5c4584e1d9a483ad7ced51ab64523201f4e3d3c65293e4ca8aeb77a961", + "license": "MIT", + "urls": [ + "bzz-raw://d7d3dd6067a994690471b5fc71b6f81fac3847798b37d404f74db00b4d3c3d0e", + "dweb:/ipfs/QmRHF1RarifjNi93RttouNPkYZGyu6CD926PgRDzD5iL35" + ] + } + }, + "version": 1 + }, + "zk_version": "1.5.4" + }, + "bytecode": "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498", + "deployedBytecode": "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498", + "factoryDeps": [ + "0x00040000000000020010000000000002000000000301001900000060043002700000044e03400197000300000031035500020000000103550000044e0040019d0000008004000039000000400040043f0000000100200190000000340000c13d000000040030008c0000076d0000413d000000000201043b000000e0022002700000045b0020009c000000500000a13d0000045c0020009c000000b90000a13d0000045d0020009c000000cd0000a13d0000045e0020009c000001220000a13d0000045f0020009c0000036c0000613d000004600020009c0000023b0000613d000004610020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000003900000c13d0000000104000031000000200040008c0000002004008039000003b60000013d0000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000c01000039000000800010043f0000044f01000041000000a00010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000450011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000201043b000000400100043d000004510010009c0000005f0000413d000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000004740020009c000000aa0000213d000004800020009c000000f40000213d000004860020009c0000012c0000213d000004890020009c000002420000613d0000048a0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000a01000039000003530000013d001000000002001d0000004002100039000000400020043f00000001020000390000000001210436000004520200004100000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000121019f00000453011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000400300043d00000060023000390000000000120435000000400130003900000010020000290000000000210435001000000003001d00000020023000390000045401000041000f00000002001d00000000001204350000045501000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d000000000101043b0000001004000029000000a0024000390000000003000410000000000032043500000080024000390000000000120435000000a0010000390000000000140435000004570040009c0000004a0000213d000000c001400039000000400010043f00000000020404330000000f01000029113411080000040f0000000302000039000000000012041b00000458010000410000000102000039000000000021041b0000000601000039000000000201041a00000459022001970000000003000411000000000232019f000000000021041b0000002001000039000001000010044300000120000004430000045a01000041000011350001042e000004750020009c000000ff0000213d0000047b0020009c0000013c0000213d0000047e0020009c000002740000613d0000047f0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a0000001001100270000001ed0000013d000004690020009c0000010a0000213d0000046f0020009c000001880000213d000004720020009c000002fe0000613d000004730020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000048c0010009c0000076d0000213d000000000010043f00000001010000390000034f0000013d000004640020009c000001190000213d000004670020009c000001f10000613d000004680020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000801000039000000000101041a000f00000001001d0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000e00000002001d000003d70000c13d0000000104000031000000200040008c0000002004008039000003fd0000013d000004810020009c000001470000213d000004840020009c0000028d0000613d000004850020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000701000039000001fc0000013d000004760020009c0000017f0000213d000004790020009c0000029b0000613d0000047a0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000301000039000003530000013d0000046a0020009c000001e30000213d0000046d0020009c0000031f0000613d0000046e0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000802000039000000800020043f000004a002000041000002c00000013d000004650020009c000001f80000613d000004660020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000801000039000001fc0000013d000004620020009c000002010000613d000004630020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a000001ed0000013d000004870020009c000002b80000613d000004880020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d11340f850000040f0000049001100197000000800010043f0000049001200197000000a00010043f0000044e01300197000000c00010043f000004be01000041000011350001042e0000047c0020009c000002c90000613d0000047d0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000001201000039000000800010043f0000049101000041000011350001042e000004820020009c000002d00000613d000004830020009c0000076d0000c13d000000640030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b001000000002001d0000048c0020009c0000076d0000213d0000002402100370000000000202043b000f00000002001d0000048c0020009c0000076d0000213d0000004401100370000000000101043b000e00000001001d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000004cf0010009c000006f50000c13d00000010010000290000000f020000290000000e03000029000003630000013d000004770020009c000002d70000613d000004780020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000501000039000003530000013d000004700020009c000003440000613d000004710020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000049e0020009c0000076d0000213d0000002304200039000000000034004b0000076d0000813d0000000404200039000000000141034f000000000101043b001000000001001d0000049e0010009c0000076d0000213d00000024012000390000001002000029000f0005002002180000000f02100029000000000032004b0000076d0000213d000d00000002001d000e00000001001d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d0000000a02000039000000000202041a000400000002001d0000000b02000039000000000202041a000000000101043b000300000001001d0000000f010000290000003f01100039000004aa01100197000000400300043d0000000001130019000b00000003001d000000000031004b000000000300003900000001030040390000049e0010009c0000004a0000213d00000001003001900000004a0000c13d000000400010043f0000000b0100002900000010030000290000000001310436000a00000001001d000000000003004b0000000e050000290000000d06000029000001d90000613d00000002010003670000000b03000029000000000451034f000000000404043b000004ab0040009c0000076d0000813d000000200330003900000000004304350000002005500039000000000065004b000001d00000413d00000010012002700000ffff06100190000007e40000c13d000000400100043d0000004402100039000004ae030000410000000000320435000000240210003900000001030000390000022f0000013d0000046b0020009c000003570000613d0000046c0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a00000020011002700000ffff0110018f000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d000003e801000039000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d0000000601000039000000000101041a0000048c01100197000000800010043f0000049101000041000011350001042e000000e40030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b001000000002001d0000048c0020009c0000076d0000213d0000002402100370000000000202043b000f00000002001d0000048c0020009c0000076d0000213d0000006402100370000000000202043b000e00000002001d0000004402100370000000000202043b000d00000002001d0000008401100370000000000101043b000c00000001001d000000ff0010008c0000076d0000213d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000023a0000613d000000000101043b0000000e0010006b0000063c0000813d000000400100043d00000044021000390000049d0300004100000000003204350000002402100039000000140300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c70000113600010430000000000001042f0000000001000416000000000001004b0000076d0000c13d0000271001000039000000800010043f0000049101000041000011350001042e000000840030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000004402100370000000000202043b0000048c0020009c0000076d0000213d0000006404100370000000000404043b0000049e0040009c0000076d0000213d0000002305400039000000000035004b0000076d0000813d0000000405400039000000000551034f000000000505043b0000049e0050009c0000076d0000213d00000000045400190000002404400039000000000034004b0000076d0000213d0000045803000041000000000403041a000000010040008c000003860000c13d000000000003041b0000000403100370000000000303043b000000000003004b000007870000c13d0000002404100370000000000404043b000000000004004b000007870000c13d0000049b01000041000000800010043f0000002001000039000000840010043f0000002701000039000000a40010043f000004cd01000041000000c40010043f000004ce01000041000000e40010043f000004c1010000410000113600010430000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000fffe0010008c0000076d0000213d00000003011000c90000000e02100039000000000202041a0000000d03100039000000000303041a0000000c01100039000000000101041a0000044e01100197000000800010043f000000a00030043f000000ff002001900000000001000039000000010100c039000000c00010043f000004be01000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000301043b000000000100041111340ee80000040f000003640000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000ffff0010008c0000076d0000213d0000045802000041000000000302041a000000010030008c000003860000c13d000000000002041b0000000b03000039000000000403041a00000020024002700000ffff02200190000004290000c13d0000049b01000041000000800010043f0000002001000039000000840010043f0000000101000039000000a40010043f000004ae01000041000000c40010043f000004b40100004100001136000104300000000001000416000000000001004b0000076d0000c13d000000c001000039000000400010043f0000000c02000039000000800020043f0000044f02000041000000a00020043f000000800200003911340ed30000040f000000c00110008a0000044e0010009c0000044e010080410000006001100210000004a1011001c7000011350001042e0000000001000416000000000001004b0000076d0000c13d0000049401000041000000800010043f0000049101000041000011350001042e0000000001000416000000000001004b0000076d0000c13d000000000100041a000000800010043f0000049101000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000101043b0000048c0010009c0000076d0000213d0000000603000039000000000303041a0000048c033001970000000004000411000000000034004b000004540000c13d0000000703000039000000000403041a0000045904400197000000000424019f000000000043041b0000000803000039000000000403041a0000045904400197000000000114019f000000000013041b000004b501000041000000800010043f0000000001000414000000040020008c000005700000c13d0000000103000031000000200030008c00000020040000390000000004034019000005960000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000901000039000000000301041a0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000e00000003001d0000045e0000c13d0000000103000031000000200030008c00000020040000390000000004034019000004840000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d0000045801000041000000000201041a000000010020008c000003860000c13d000000000001041b0000000701000039000000000201041a0000000901000039000000000101041a000c00000001001d0000000801000039000000000101041a000e00000001001d0000048b01000041000000800010043f0000000001000410000000840010043f00000000010004140000048c02200197000000040020008c000d00000002001d000004cc0000c13d0000000103000031000000200030008c00000020040000390000000004034019000004f20000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000048c0010009c0000076d0000213d000000000010043f0000000401000039000000200010043f00000040020000390000000001000019113411080000040f000000000101041a000000800010043f0000049101000041000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000301043b000000000100041111340f210000040f0000000101000039000000400200043d00000000001204350000044e0020009c0000044e0200804100000040012002100000049f011001c7000011350001042e000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b0000048c0020009c0000076d0000213d0000002401100370000000000101043b001000000001001d0000048c0010009c0000076d0000213d000000000020043f0000000201000039000000200010043f00000040020000390000000001000019113411080000040f0000001002000029000000000020043f000000200010043f00000000010000190000004002000039000003520000013d0000049b01000041000000800010043f0000002001000039000000840010043f0000001301000039000000a40010043f000004bf01000041000000c40010043f000004b40100004100001136000104300000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000800a000039000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000003a50000613d000000000801034f000000008908043c000000000a9a043600000000005a004b000003a10000c13d000000000006004b000003b20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000041d0000613d0000001f01400039000000600110018f00000080021001bf001000000002001d000000400020043f000000200040008c0000076d0000413d0000000802000039000000000202041a000000800300043d000f00000003001d0000048b030000410000001004000029000000000034043500000084031001bf0000000005000410000000000053043500000000030004140000048c02200197000000040020008c000005340000c13d0000000001140019000000400010043f000000100100002900000000020104330000000901000039000000000101041a0000049003100197000000700110027000000490041001970000000f0100002911340f8c0000040f0000044f0000013d0000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000003ec0000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000003e80000c13d000000000006004b000003f90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005640000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200040008c0000076d0000413d0000000901000039000000000101041a0000049001100197000000800200043d000000000312004b00000b3d0000413d0000000f01000029000f048c0010019b0000000e0100002900000010020000291134107c0000040f0000048b01000041000000400b00043d00000000001b04350000000401b000390000000002000410000000000021043500000000010004140000000f02000029000000040020008c000007310000c13d0000000103000031000000200030008c000000200400003900000000040340190000075f0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004240000c13d000007d10000013d000000000021004b00000000050200190000043a0000a13d00000000040200190000ffff0040008c00000b200000813d00000003054000c90000000c05500039000000000605041a000004b70660019700000001066001bf000000000065041b0000000104400039000000000014004b0000042d0000413d000000000403041a0000000005010019000004ba014001970000002004500210000004bb04400197000000000114019f000000000013041b0000ffff0150018f000000000012004b0000044f0000613d000000800020043f000000a00010043f00000000010004140000044e0010009c0000044e01008041000000c001100210000004bc011001c70000800d020000390000000103000039000004bd040000411134112a0000040f00000001002001900000076d0000613d00000001010000390000045802000041000000000012041b0000000001000019000011350001042e0000049b01000041000000800010043f0000002001000039000000840010043f0000001601000039000000a40010043f000004b301000041000000c40010043f000004b40100004100001136000104300000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000004730000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b0000046f0000c13d000000000006004b000004800000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005b80000613d0000001f01400039000000600110018f00000080021001bf000f00000002001d000000400020043f000000200030008c0000076d0000413d0000000802000039000000000202041a000000800300043d000d00000003001d0000048b030000410000000f04000029000000000034043500000084031001bf0000000005000410000000000053043500000000030004140000048c02200197000000040020008c000005dc0000c13d0000000001140019000000400010043f0000000e0500002900000490045001970000000d0340006b00000b3d0000413d000000700250027000000490022001970000000f050000290000000005050433000e00000002001d000c00000005001d000f00000025005300000b3d0000413d000b00000004001d000a00000003001d000000000300041a000000000003004b000008430000c13d0000000c030000290000000e0030006c0000000a040000290000000b0500002900000b3d0000613d0000000f024000b90000000d0050006b000004b70000613d00000000034200d90000000f0030006c00000b3d0000c13d0000000f032000fa000000000043004b000008d20000c13d000000040020008c00000b3d0000413d00000001032002700000000103300039000000000023004b00000b320000813d000000000003004b0000052e0000613d00000000043200d9000000000034001a00000b3d0000413d00000000043400190000000105400270000000000035004b00000000040300190000000003050019000004c00000413d00000b330000013d0000044e0010009c0000044e01008041000000c0011002100000048d011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000004e10000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000004dd0000c13d000000000006004b000004ee0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005c40000613d0000001f01400039000000600110018f00000080021001bf000f00000002001d000000400020043f000000200030008c0000076d0000413d0000000e020000290000048c02200197000000800300043d000e00000003001d0000048b030000410000000f05000029000000000035043500000084041001bf000000000300041000000000003404350000000003000414000000040020008c000b00000002001d0000060c0000c13d0000000001150019000000400010043f0000000f010000290000000001010433000f00000001001d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000200041a000a00000002001d000000000101043b000000000401041a0000000e03000029000000000003004b00000000020000190000052a0000613d00000000023400a9000000000004004b000005270000613d00000000014200d9000000000031004b00000b3d0000c13d00000000013200d9000000000041004b000008ce0000c13d000e00000004001d000900000002001d0000000a0000006b000008220000c13d000004b201000041000000000010043f0000001201000039000000040010043f0000048f0100004100001136000104300000044e0030009c0000044e03008041000000c0013002100000004003400210000000000131019f0000048f011001c71134112f0000040f000000100b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000054c0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005480000c13d000000000006004b000005590000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005d00000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c000003cd0000813d0000076d0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000056b0000c13d000007d10000013d0000044e0010009c0000044e01008041000000c001100210000004b6011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000005850000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000005810000c13d000000000006004b000005920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000006e90000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200030008c0000076d0000413d000000800200043d000000ff0020008c0000076d0000213d0000000503000039000000000023041b11340ec80000040f00000492010000411134111d0000040f0000044e011001970000000c02000039000000000302041a000004b703300197000000000113019f000000000012041b0000000d01000039000000000001041b0000000e02000039000000000302041a000004d00130019700000001011001bf000000000012041b0000000b01000039000000000201041a000004b802200197000004b9022001c7000000000021041b0000000001000019000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005bf0000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005cb0000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005d70000c13d000007d10000013d0000044e0030009c0000044e03008041000000c0013002100000004003400210000000000131019f0000048f011001c71134112f0000040f0000000f0b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000005f40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005f00000c13d000000000006004b000006010000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000076f0000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c0000049b0000813d0000076d0000013d0000044e0030009c0000044e03008041000000c0013002100000004003500210000000000131019f0000048f011001c71134112f0000040f0000000f0b000029000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000006240000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000006200000c13d000000000006004b000006310000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000077b0000613d0000001f01400039000000600110018f0000000001b10019000000400010043f000000200030008c000005090000813d0000076d0000013d0000000301000039000000000101041a000b00000001001d0000001001000029000000000010043f0000000401000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000201043b000000000102041a000000010310003a00000b3d0000613d000000000032041b000000400400043d000000c0024000390000000e030000290000000000320435000000a002400039000000000012043500000080014000390000000d02000029000000000021043500000060014000390000000f020000290000000000210435000000400140003900000010020000290000000000210435000000c001000039000000000114043600000494020000410000000000210435000e00000004001d000004950040009c0000004a0000213d0000000e02000029000000e003200039000a00000003001d000000400030043f0000044e0010009c0000044e01008041000000400110021000000000020204330000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000e030000290000012202300039000000000012043500000100013000390000049702000041000000000021043500000102023000390000000b03000029000000000032043500000042020000390000000a030000290000000000230435000004980030009c0000004a0000213d0000000e020000290000016002200039000000400020043f0000044e0010009c0000044e0100804100000040011002100000000a0200002900000000020204330000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000076d0000613d0000000c02000029000000ff0220018f000000000101043b000000400300043d0000002004300039000000000024043500000000001304350000000201000367000000a402100370000000000202043b00000040043000390000000000240435000000c401100370000000000101043b000000600230003900000000001204350000044e0030009c0000044e030080410000004001300210000000000000043f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000499011001c700000001020000391134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000006cd0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000006c90000c13d000000000005004b000006da0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000000b430000613d000000000100043d0000048c0110019800000bd20000613d000000100010006c00000bd20000c13d00000010010000290000000f020000290000000d0300002911340ee80000040f0000000001000019000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006f00000c13d000007d10000013d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000d000e0010007400000b3d0000413d0000001001000029000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000d02000029000000000021041b0000017b0000013d0000044e00b0009c0000044e0200004100000000020b401900000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c70000000f02000029000e0000000b001d1134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0b0000290000000e057000290000074e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000074a0000c13d000000000006004b0000075b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000007c60000613d0000001f01400039000000600210018f00000000040b00190000000001b20019000000000021004b000000000200003900000001020040390000049e0010009c0000004a0000213d00000001002001900000004a0000c13d000000400010043f000000200030008c000008380000813d000000000100001900001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007760000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007820000c13d000007d10000013d0000000904000039000000000404041a001004900040019b000000100030006c000007ba0000813d0000007004400270000f04900040019b0000002404100370000000000404043b0000000f0040006c000007ba0000813d0000000705000039000000000505041a000e048c0050019b0000000e0020006c000008e00000613d0000000805000039000000000505041a000c048c0050019b0000000c0020006c000008e00000613d000000000003004b000007a30000613d0000000e010000291134107c0000040f00000002010003670000002402100370000000000402043b000000000004004b000007aa0000613d0000004401100370000000000201043b0000000c0100002900000000030400191134107c0000040f000000400200043d0000048b010000410000000000120435000d00000002001d00000004012000390000000002000410000000000021043500000000010004140000000e02000029000000040020008c000008ea0000c13d0000000103000031000000200030008c00000020040000390000000004034019000009160000013d0000049b01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f000004a801000041000000c40010043f000004c001000041000000e40010043f000004c10100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007cd0000c13d000000000005004b000007de0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500000060013002100000044e0020009c0000044e020080410000004002200210000000000112019f00001136000104300000000b0100002900000000030104330000049e0030009c0000004a0000213d00000005013002100000003f04100039000004aa04400197000000400500043d0000000004450019000900000005001d000000000054004b000000000500003900000001050040390000049e0040009c0000004a0000213d00000001005001900000004a0000c13d001000000006001d000000400040043f000000090400002900000000053404360000001f0310018f000000000001004b000008040000613d0000000001150019000000000400003100000002044003670000000006050019000000004704043c0000000006760436000000000016004b000008000000c13d000000000003004b0000000b010000290000000001010433000000000001004b000000100f000029000009970000c13d000000400100043d000000200200003900000000022104360000000903000029000000000303043300000000003204350000004002100039000000000003004b000008190000613d0000000004000019000000005605043400000000026204360000000104400039000000000034004b000008140000413d00000000021200490000044e0020009c0000044e0200804100000060022002100000044e0010009c0000044e010080410000004001100210000000000112019f000011350001042e0000000f0000006b000008680000c13d000000400100043d0000006402100039000004a70300004100000000003204350000004402100039000004a803000041000000000032043500000024021000390000002a0300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e010080410000004001100210000004a9011001c7000011360001043000000000010404330000000902000039000000000202041a00000070022002700000049002200197000000000321004b00000b3d0000413d0000000f0100002900000010020000291134107c0000040f0000044f0000013d0000000a0500002900000000025300a90000000b060000290000000d0060006b0000084b0000613d00000000045200d9000000000034004b00000b3d0000c13d00000000043200d9000000000054004b000008d20000c13d0000000b0000006b0000052e0000613d0000000f043000b90000000c060000290000000e0060006c000008570000613d0000000f054000fa000000000035004b00000b3d0000c13d00000000033400d90000000f0030006c000008d20000c13d0000000e0000006b0000000b010000290000052e0000613d00000000021200d90000000e014000fa000000000012004b0000000002018019000900000002001d000000090000006b00000b4f0000c13d000000400100043d0000006402100039000004b103000041000008270000013d0000000e030000290008000f003000bd000000000003004b0000000902000029000008700000613d00000008013000f90000000f0010006c00000b3d0000c13d0000000f0400002900000008014000f9000000000031004b000008ce0000c13d0000000a0020006b000008240000213d00000008020000290000000a0020006b000008240000213d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000f000e0010007400000b3d0000413d0000000001000410000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b0000000f02000029000000000021041b000000000100041a0000000e02000029000000000121004b00000b3d0000413d000000000010041b000000400100043d00000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500041000000000060000191134112a0000040f00000001002001900000076d0000613d00000009020000290000000a032000fa0000000802000029000e000a002001020000000d010000290000001002000029000a00000003001d1134107c0000040f0000000b0100002900000010020000290000000e030000291134107c0000040f0000048b01000041000000400200043d0000000000120435000f00000002001d00000004012000390000000002000410000000000021043500000000010004140000000d030000290000000002030019000000040030008c00000bd90000c13d0000000104000031000000200040008c000000200400803900000c040000013d000000400100043d0000004402100039000004a2030000410000022c0000013d0000049b02000041000000000021043500000004021001bf000000200300003900000000003204350000004402100039000004a203000041000000000032043500000024021000390000001403000039000000000032043500000040011002100000049c011001c700001136000104300000049b01000041000000800010043f0000002001000039000000840010043f0000001701000039000000a40010043f000004cc01000041000000c40010043f000004b40100004100001136000104300000000d020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c70000000e020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d05700029000009050000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b000009010000c13d000000000006004b000009120000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000b260000613d0000001f01400039000000600110018f0000000d04100029000000000014004b00000000020000390000000102004039000e00000004001d0000049e0040009c0000004a0000213d00000001002001900000004a0000c13d0000000e02000029000000400020043f000000200030008c0000076d0000413d0000000d020000290000000002020433000900000002001d0000048b020000410000000e04000029000000000024043500000004024000390000000004000410000000000042043500000000020004140000000c04000029000000040040008c000009600000613d0000000e010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c70000000c020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e057000290000094d0000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b000009490000c13d000000000006004b0000095a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000bb20000613d0000001f01400039000000600110018f0000000e02100029000d00000002001d0000049e0020009c0000004a0000213d0000000d02000029000000400020043f000000200030008c0000076d0000413d0000000e020000290000000002020433000c00000002001d00000002020003670000000404200370000000000404043b000e00100040007300000b3d0000413d0000000e05000029000000090450006b0000000004004019000b00000004001d0000002402200370000000000202043b0008000f0020007300000b3d0000413d00000008040000290000000c0240006b0000000002004019000a00000002001d0000000d0200002900000004022000390000000e05000029000000090050006b00000c510000213d00000008050000290000000c0050006b00000c510000213d0000049b010000410000000d030000290000000000130435000000200100003900000000001204350000006401300039000004ca0200004100000000002104350000004401300039000004cb0200004100000000002104350000002401300039000000260200003900000000002104350000044e0030009c0000044e030080410000004001300210000004a9011001c700001136000104300000ffff0320018f00000003010000290000044e091001970001000100f000920000000101200039000800000003001d00000003023000c90007000e0020003d0006000d0020003d0005000c0020003d0002ffff0010019300000000030000190000000502300210000c00000002001d0000000a0120002900000000010104330000044e01100198000d00000003001d00000a070000613d0000000002190049000f00000002001d0000044e0020009c00000b3d0000213d000000400200043d000004ac0020009c0000004a0000213d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000400700043d000004ac0070009c0000004a0000213d0000006002700039000000400020043f000000400270003900000000000204350000000002070436000000000002043500000008030000290000ffff0030008c00000b200000613d000000400300043d000004ac0030009c0000004a0000213d0000006004300039000000400040043f0000000504000029000000000804041a0000044e0c8001970000000004c304360000000606000029000000000606041a00000000006404350000004006300039000000070a000029000000000a0a041a000000ff00a00190000000000a000039000000010a00c0390000000000a60435000000000019004b00000a450000413d00000000009c004b00000a450000213d0000000f0b0000290000000000bc004b00000a4e0000213d0000000001b8013f0000044e0010019800000aef0000613d000000400100043d000004ac0010009c0000004a0000213d0000006002100039000000400020043f0000004002100039000000000002043500000020021000390000000000020435000000000001043500000000010304330000044e011001970000000f061000690000044e0060009c00000b3d0000213d00000004016000b90000000002040433000000040000006b000009f70000613d00000004071000fa000000000067004b00000b3d0000c13d000000000012001a00000b3d0000413d000000400700043d000004ac0070009c0000004a0000213d00000000011200190000006002700039000000400020043f0000004002700039000000010600003900000000006204350000000f0200002900000000022704360000000000120435000000000c03043300000aef0000013d00000008010000290000ffff0010008c00000b200000613d000000400200043d000004ac0020009c0000004a0000213d0000006001200039000000400010043f0000000501000029000000000401041a0000044e01400197000000000312043600000040062000390000000601000029000000000101041a00000000001304350000000707000029000000000707041a000000ff007001900000000007000039000000010700c0390000000000760435000000030440014f0000044e0040019800000b130000613d000000400100043d000004ac0010009c0000004a0000213d0000006004100039000000400040043f0000004004100039000000000004043500000020041000390000000000040435000000000001043500000000010204330000044e0110019700000000041900490000044e0040009c00000b3d0000213d00000004014000b90000000002030433000000040000006b00000a360000613d00000004031000fa000000000043004b00000b3d0000c13d000000000012001a00000b3d0000413d000000400300043d000004ac0030009c0000004a0000213d00000000011200190000006002300039000000400020043f00000040023000390000000104000039000000000042043500000020023000390000000000120435000000000093043500000b130000013d000000000019004b0000000f0b00002900000000060b0019000004ab066081c700000000009c004b000000000a0c0019000004ab0aa0a1c700000000006a004b000009de0000a13d000000400300043d000004ac0030009c0000004a0000213d00000002e0f000f90000006002300039000000400020043f0000000304e000c90000000c02400039000000000202041a0000044e0220019700000000062304360000000d07400039000000000707041a000000000076043500000040033000390000000e04400039000000000404041a000000ff004001900000000004000039000000010400c039000000000043043500000a770000c13d000000400300043d000004ac0030009c0000004a0000213d0000006002300039000000400020043f0000000c02000039000000000202041a0000044e0220019700000000042304360000000d06000039000000000606041a000000000064043500000040033000390000000e04000039000000000404041a000000ff004001900000000004000039000000010400c0390000000000430435000000000019004b00000a7d0000413d000000000092004b00000a7d0000213d0000000f0300002900000a820000013d000000000019004b0000000f03000029000004ab033081c7000000000092004b000004ab0220a1c7000000000032004b00000cdb0000213d000000400200043d000004ac0020009c0000004a0000213d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000400200043d000004ac0020009c0000004a0000213d000000000019004b0000000f03000029000004ab033081c7000e00000003001d0000006003200039000000400030043f00000040032000390000000000030435000000200320003900000000000304350000000000020435000000010be00029000000000deb001900000aa30000013d000000000e030019000000000deb00190000000000eb001a00000b3d0000413d000000400c00043d000004ac00c0009c0000004a0000213d000000010ad002700000006002c00039000000400020043f0000000020fa00d900000003022000c90000000c03200039000000000303041a0000044e0330019700000000043c04360000000d03200039000000000303041a00000000003404350000000e022000390000004003c00039000000000202041a000000ff002001900000000002000039000000010200c03900000000002304350000000103a0003900000a9f0000613d000000400700043d000004ac0070009c0000004a0000213d0000006002700039000000400020043f0000000020f300d900000003062000c90000000c02600039000000000202041a0000044e0820019700000000028704360000000d0f600039000000000f0f041a0000000000f204350000000e06600039000000400f700039000000000606041a000000ff006001900000000006000039000000010600c03900000000006f0435000000000c0c04330000044e06c00197000000000019004b00000ae10000413d000000000096004b00000ae10000213d0000000f0060006c00000ae50000213d000000000019004b000000100f00002900000aea0000413d000000000098004b00000aea0000213d0000000f0080006b000000000e03001900000aa00000213d00000aef0000013d000000000096004b000004ab0660a1c70000000e0060006c00000ad80000a13d0000000200d0008c000000100f00002900000b3d0000413d000000010ba0008a00000aa00000013d000000000098004b000004ab0880a1c70000000e0080006b000000000e03001900000aa00000213d0000044e01c001970000000f0a00002900000000031a004b00000af50000c13d000000000104043300000b130000013d00000000060704330000044e0860019700000000008a004b00000afb0000c13d000000000102043300000b130000013d00000000071800490000044e0070009c00000b3d0000213d0000044e0030009c00000b3d0000213d00000000060204330000000002040433000000000626004b00000b3d0000413d000000000018004b0000052e0000613d00000000047600d900000000083400a90000000001280019000000000067004b00000b0e0000a13d000000000021004b00000b130000813d00000b3d0000013d000000000021004b00000b3d0000413d00000000024800d9000000000032004b00000b3d0000c13d000000090200002900000000020204330000000d03000029000000000032004b00000b200000a13d0000000c02500029000000000012043500000001033000390000000b010000290000000001010433000000000013004b000009a30000413d0000080a0000013d000004b201000041000000000010043f0000003201000039000000040010043f0000048f0100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b2d0000c13d000007d10000013d0000000004020019000903e80040009400000b3d0000413d000003e802000039000000000020041b0000000103000039000000200030043f000004af03000041000000000403041a000004d10040009c00000bbe0000a13d000004b201000041000000000010043f0000001101000039000000040010043f0000048f0100004100001136000104300000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b4a0000c13d000007d10000013d000000000100041a000000090010002a00000b3d0000413d0000000901100029000000000010041b00000010010000290000048c01100197001000000001001d000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d000000000101043b000000000201041a000800000002001d000000090020002a00000b3d0000413d0000001001000029000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f00000001002001900000076d0000613d00000009030000290000000802300029000000000101043b000000000021041b000000400100043d00000000003104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500001900000010060000291134112a0000040f00000001002001900000076d0000613d0000000d010000290000000c020000290000000b030000290000000e0400002911340f8c0000040f000000400100043d00000020021000390000000f0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d0200003900000002030000390000000005000411000004b0040000411134112a0000040f00000001002001900000076d0000613d00000458010000410000000102000039000000000021041b000000400100043d000000090200002900000000002104350000044e0010009c0000044e0100804100000040011002100000049f011001c7000011350001042e0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000bb90000c13d000007d10000013d000000000000043f000003e804400039000000000043041b0000000000210435000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000000500001900000000060000191134112a0000040f00000001002001900000076d0000613d000008620000013d000000400100043d00000044021000390000049a03000041000000000032043500000024021000390000001e030000390000022f0000013d0000000f030000290000044e0030009c0000044e0300804100000040033002100000044e0010009c0000044e01008041000000c001100210000000000131019f0000048f011001c71134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000f0570002900000bf30000613d000000000801034f0000000f09000029000000008a08043c0000000009a90436000000000059004b00000bef0000c13d000000000006004b00000c000000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000ccf0000613d0000001f01400039000000600110018f0000000f03100029000000000013004b00000000020000390000000102004039000d00000003001d0000049e0030009c0000004a0000213d00000001002001900000004a0000c13d0000000d02000029000000400020043f000000200040008c0000076d0000413d0000000f020000290000000002020433000f00000002001d0000048b020000410000000d03000029000000000023043500000004023000390000000003000410000000000032043500000000020004140000000b03000029000000040030008c00000cee0000c13d0000000d011000290000049e0010009c0000004a0000213d000000400010043f0000000c010000290000049003100197000000700110027000000490041001970000000d0100002900000000020104330000000f0100002911340f8c0000040f000000400100043d00000020021000390000000e0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d0200003900000003030000390000000005000411000004a50400004100000010060000291134112a0000040f00000001002001900000076d0000613d00000458010000410000000102000039000000000021041b000000400100043d00000020021000390000000e0300002900000000003204350000000a0200002900000000002104350000044e0010009c0000044e010080410000004001100210000004a6011001c7000011350001042e0000000604000039000000000404041a000004c2050000410000000d0600002900000000005604350000000005000410000000000052043500000000020004140000048c04400197000700000004001d000000040040008c00000c8b0000613d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c700000007020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000c780000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000c740000c13d000000000006004b00000c850000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000ce20000613d0000001f01400039000000600110018f0000000d01100029000300000001001d0000049e0010009c0000004a0000213d0000000301000029000000400010043f000000200030008c0000076d0000413d000000090200002900002710012000c90000000d040000290000000004040433000000000002004b00000c9c0000613d00000009021000fa000027100020008c00000b3d0000c13d000027100210011a000000090020006c00000d490000c13d000000000004004b000000000200001900000d2f0000c13d0000000c0600002900002710056000c9000000000006004b00000ca90000613d0000000c065000fa000027100060008c00000b3d0000c13d000027100650011a0000000c0060006c00000d490000c13d000000000004004b000000000600001900000d3c0000c13d00020000002100510001000000650053000000000400001900000cbd0000613d000000020500002900000001045000b9000000000021004b00000cba0000613d00000002014000fa000000010010006c00000b3d0000c13d00000001014000fa000000020010006c00000d490000c13d0000000f0200002900000010022000b900000003010000290000000401100039000004c3022000d1000000000024004b00000d5a0000813d0000049b0200004100000003030000290000000000230435000000200200003900000000002104350000004401300039000004c902000041000000000021043500000024013000390000000e0200003900000d540000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000cd60000c13d000007d10000013d000000400100043d0000004402100039000004ad030000410000000000320435000000240210003900000003030000390000022f0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000ce90000c13d000007d10000013d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c70000000b020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000d090000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000d050000c13d000000000006004b00000d160000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000d230000613d0000001f01400039000000600110018f0000000d011000290000049e0010009c0000004a0000213d000000400010043f000000200030008c0000076d0000413d00000c240000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000d2a0000c13d000007d10000013d0000000b024000b90000000e06000029000000090060006b00000d360000a13d0000000b052000fa000000000045004b00000b3d0000c13d00000000054200d90000000b0050006c00000d490000c13d000000000012004b00000b3d0000213d00000ca20000013d0000000a064000b900000008080000290000000c0080006b00000d430000a13d0000000a076000fa000000000047004b00000b3d0000c13d00000000044600d90000000a0040006c00000d490000c13d000000000056004b00000b3d0000213d00000caf0000013d00000003030000290000004401300039000004a20200004100000000002104350000002401300039000000140200003900000000002104350000049b0100004100000000001304350000000401300039000000200200003900000000002104350000044e0030009c0000044e0300804100000040013002100000049c011001c70000113600010430000004c40200004100000003040000290000000002240436000e00000002001d0000000002000410000000000021043500000000010004140000000702000029000000040020008c00000d680000c13d000000a00030008c000000a004000039000000000403401900000d940000013d00000003020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c700000007020000291134112f0000040f000000000301001900000060033002700000044e03300197000000a00030008c000000a00400003900000000040340190000001f0640018f000000e007400190000000030570002900000d830000613d000000000801034f0000000309000029000000008a08043c0000000009a90436000000000059004b00000d7f0000c13d000000000006004b00000d900000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000dde0000613d0000001f01400039000001e00110018f00000003011000290000049e0010009c0000004a0000213d000000400010043f000000a00030008c0000076d0000413d0000000e010000290000000001010433000500000001001d0000048c0010009c0000076d0000213d000000030100002900000060011000390000000001010433000400000001001d0000048c0010009c0000076d0000213d0000000801000039000000000101041a0008048c0010019b0000000701000039000000000101041a0009048c0010019b000000030200002900000080012000390000000001010433000600000001001d00000040012000390000000001010433000700000001001d000e00000000001d00000dbc0000013d0000000e010000290000000101100039000000ff0110018f000e00000001001d000000010010008c00000dea0000213d0000000e0000006b000000090200002900000008010000290000000001026019000c00000001001d0000000a0200002900000000010200190000000b01006029000d00000001001d000000000001004b00000db60000613d0000000d0200002900000007012000b900000000022100d9000000070020006c00000b3d0000c13d000027100010008c00000dd20000413d000027100310011a0000000c0100002900000005020000291134107c0000040f0000000d0200002900000006012000b900000000022100d9000000060020006c00000b3d0000c13d000027100010008c00000db60000413d000027100310011a0000000c0100002900000004020000291134107c0000040f00000db60000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000de50000c13d000007d10000013d000000400200043d0000048b010000410000000000120435000e00000002001d00000004012000390000000002000410000000000021043500000000010004140000000902000029000000040020008c00000dfa0000c13d0000000103000031000000200030008c0000002004000039000000000403401900000e260000013d0000000e020000290000044e0020009c0000044e0200804100000040022002100000044e0010009c0000044e01008041000000c001100210000000000121019f0000048f011001c700000009020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000e0570002900000e150000613d000000000801034f0000000e09000029000000008a08043c0000000009a90436000000000059004b00000e110000c13d000000000006004b00000e220000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000e7d0000613d0000001f01400039000000600110018f0000000e04100029000000000014004b00000000020000390000000102004039000d00000004001d0000049e0040009c0000004a0000213d00000001002001900000004a0000c13d0000000d02000029000000400020043f000000200030008c0000076d0000413d0000000e020000290000000002020433000e00000002001d0000048b020000410000000d04000029000000000024043500000004024000390000000004000410000000000042043500000000020004140000000804000029000000040040008c00000e700000613d0000000d010000290000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e02008041000000c002200210000000000112019f0000048f011001c700000008020000291134112f0000040f000000000301001900000060033002700000044e03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d0570002900000e5d0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b00000e590000c13d000000000006004b00000e6a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000e890000613d0000001f01400039000000600110018f0000000d011000290000049e0010009c0000004a0000213d000000400010043f000000200030008c0000076d0000413d0000000202000029000027100220011a0000000e0020006b00000e950000813d0000004402100039000004c80300004100000e9d0000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e840000c13d000007d10000013d0000001f0530018f0000048e06300198000000400200043d0000000004620019000007d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e900000c13d000007d10000013d0000000d0200002900000000020204330000000103000029000027100330011a000000000032004b00000ea10000813d0000004402100039000004c703000041000000000032043500000024021000390000001d030000390000022f0000013d0000000e0100002900000010030000290000000f0400002911340f8c0000040f000000400100043d00000020021000390000000a0300002900000000003204350000000b02000029000000000021043500000002020003670000000403200370000000000303043b000000400410003900000000003404350000002403200370000000000303043b000000600410003900000000003404350000044e0010009c0000044e0100804100000040011002100000004402200370000000000202043b00000000030004140000044e0030009c0000044e03008041000000c003300210000000000113019f000004c5011001c70000048c062001970000800d0200003900000003030000390000000005000411000004c6040000411134112a0000040f00000001002001900000076d0000613d0000044f0000013d000004d20010009c00000ecd0000813d0000006001100039000000400010043f000000000001042d000004b201000041000000000010043f0000004101000039000000040010043f0000048f01000041000011360001043000000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000ee20000613d000000000400001900000000054100190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000edb0000413d000000000321001900000000000304350000001f02200039000004d3022001970000000001210019000000000001042d0003000000000002000100000003001d000300000002001d0000048c01100197000200000001001d000000000010043f0000000201000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f1f0000613d000000000101043b00000003020000290000048c02200197000300000002001d000000000020043f000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f1f0000613d000000000101043b0000000102000029000000000021041b000000400100043d00000000002104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004d404000041000000020500002900000003060000291134112a0000040f000000010020019000000f1f0000613d000000000001042d000000000100001900001136000104300004000000000002000400000003001d000200000002001d0000048c01100197000300000001001d000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d000000000101043b000000000101041a000100040010007400000f7f0000413d0000000301000029000000000010043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d000000000101043b0000000102000029000000000021041b00000002010000290000048c01100197000200000001001d000000000010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d0000000202000029000000000101043b000000000301041a000100000003001d000000040030002a00000f7f0000413d000000000020043f0000000101000039000000200010043f00000000010004140000044e0010009c0000044e01008041000000c00110021000000493011001c700008010020000391134112f0000040f000000010020019000000f7d0000613d00000004030000290000000102300029000000000101043b000000000021041b000000400100043d00000000003104350000044e0010009c0000044e01008041000000400110021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f000004a3011001c70000800d020000390000000303000039000004a404000041000000030500002900000002060000291134112a0000040f000000010020019000000f7d0000613d000000000001042d00000000010000190000113600010430000004b201000041000000000010043f0000001101000039000000040010043f0000048f0100004100001136000104300000000901000039000000000201041a0000049001200197000000e00320027000000070022002700000049002200197000000000001042d0004000000000002000100000004001d000200000003001d000400000001001d000004900010009c0000105c0000213d000004d50020009c0000105c0000813d000300000002001d0000049201000041000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f00000001002001900000106d0000613d000000000201043b0000000901000039000000000301041a000000e00330027000000000033200490000044e00300198000010320000613d00000002030000290000049003300198000010320000613d00000001040000290000049004400198000010320000613d0000000505000039000000000605041a0000004d0060008c000010500000213d000000000006004b00000fc00000613d0000000a070000390000000105000039000000010060019000000000087700a9000000010700603900000000055700a90000000106600272000000000708001900000fb50000c13d000000000005004b00000fc60000613d00000000074500a900000fc20000013d0000000105000039000000000704001900000000055700d9000000000045004b00000fc70000613d000010500000013d000000000700001900000000083700d90000000a04000039000000000084041b0000000b04000039000000000904041a0000ffff0690018f0000ffff0060008c000010700000613d000000400a00043d000004d200a0009c000010560000813d00000010059002700000ffff0550018f000000600ba000390000004000b0043f000000030c6000c90000000c0bc00039000000000d0b041a0000044e0bd00197000000000bba04360000000d0ec00039000000000e0e041a0000000000eb0435000000400ea000390000000e0cc00039000000000c0c041a000000ff00c00190000000000c000039000000010c00c0390000000000ce0435000000000c2d013f0000044e00c001980000102c0000613d000000200c9002700000ffff0cc0018f00000000005c004b00000ff30000a13d000000010d50008a0000ffff00d0008c000010500000213d00000000006d004b000000000c05c01900000000050c001900000ff50000013d000000000005004b000010760000613d0000ffff0650018f00000001099000390000ffff0990018f00000000606900d9000000400c00043d000004ac00c0009c000010560000213d0000044e09200197000000600dc000390000004000d0043f000000400dc0003900000000000d0435000000200dc0003900000000000d043500000000000c0435000000000a0a04330000044e0aa00197000000000ca900490000044e00c0009c000010500000213d000000000a8c00a9000000000b0b0433000000000073004b000010100000213d00000000038a00d90000000000c3004b000010500000c13d0000000000ab001a000010500000413d000000400300043d000004ac0030009c000010560000213d0000000007ab00190000006008300039000000400080043f0000004008300039000000010a0000390000000000a8043500000020083000390000000000780435000000000093043500000003036000c90000000c08300039000000000a08041a000004b70aa0019700000000099a019f000000000098041b0000000d08300039000000000078041b0000000e03300039000000000803041a000004d00780019700000001077001bf000000000073041b000000000904041a0000001003500210000004d703300197000000000363019f000004b705900197000000000353019f000000000034041b000000e00220021000000003040000290000007003400210000004d803300197000000000232019f00000004030000290000049003300197000000000232019f000000000021041b0000049001400197000000400200043d0000002004200039000000000014043500000000003204350000044e0020009c0000044e02008041000000400120021000000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000493011001c70000800d020000390000000103000039000004d9040000411134112a0000040f00000001002001900000106e0000613d000000000001042d000004b201000041000000000010043f0000001101000039000000040010043f0000048f010000410000113600010430000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000000400100043d0000004402100039000004d60300004100000000003204350000002402100039000000150300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c70000113600010430000000000001042f00000000010000190000113600010430000004b201000041000000000010043f0000003201000039000000040010043f0000048f010000410000113600010430000004b201000041000000000010043f0000001201000039000000040010043f0000048f0100004100001136000104300000000004010019000000400100043d000004510010009c000010ee0000813d0000004005100039000000400050043f0000002005100039000004da06000041000000000065043500000019050000390000000000510435000000400500043d000000440150003900000000003104350000002001500039000004db0300004100000000003104350000048c022001970000002403500039000000000023043500000044020000390000000000250435000004980050009c000010ee0000213d0000008002500039000000400020043f00000000030504330000000002000414000000040040008c000010c60000c13d00000001020000390000000104000031000000000004004b000010da0000613d0000001f01400039000004d3011001970000003f01100039000004d303100197000000400100043d0000000003310019000000000013004b000000000600003900000001060040390000049e0030009c000010ee0000213d0000000100600190000010ee0000c13d000000400030043f0000000003410436000004d3054001980000001f0640018f00000000045300190000000307000367000010b80000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b000010b40000c13d000000000006004b000010dc0000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000010dc0000013d0000044e0010009c0000044e0100804100000040011002100000044e0030009c0000044e030080410000006003300210000000000113019f0000044e0020009c0000044e02008041000000c002200210000000000121019f00000000020400191134112a0000040f000000010220018f000300000001035500000060011002700001044e0010019d0000044e04100197000000000004004b0000109e0000c13d00000060010000390000008003000039000000000002004b000010f40000613d0000000001010433000000000001004b000010ed0000613d000004dc0010009c000011050000213d0000001f0010008c000011050000a13d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000011050000c13d000000000001004b000010f40000613d000000000001042d000004b201000041000000000010043f0000004101000039000000040010043f0000048f010000410000113600010430000000400100043d0000004402100039000004dd03000041000000000032043500000024021000390000001c0300003900000000003204350000049b0200004100000000002104350000000402100039000000200300003900000000003204350000044e0010009c0000044e0100804100000040011002100000049c011001c7000011360001043000000000010000190000113600010430000000000001042f0000044e0010009c0000044e0100804100000040011002100000044e0020009c0000044e020080410000006002200210000000000112019f00000000020004140000044e0020009c0000044e02008041000000c002200210000000000112019f00000496011001c700008010020000391134112f0000040f00000001002001900000111b0000613d000000000101043b000000000001042d00000000010000190000113600010430000000000010044300000000010004140000044e0010009c0000044e01008041000000c00110021000000456011001c70000800b020000391134112f0000040f0000000100200190000011290000613d000000000101043b000000000001042d000000000001042f0000112d002104210000000102000039000000000001042d0000000002000019000000000001042d00001132002104230000000102000039000000000001042d0000000002000019000000000001042d0000113400000432000011350001042e0000113600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff4d61676963737761702056320000000000000000000000000000000000000000020000000000000000000000000000000000000c000000a00000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc0310000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000010000000000000000000000008b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b0200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f0000000000000000000000000000000000000000000000000000000000030009ffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000006a62784100000000000000000000000000000000000000000000000000000000ba9a7a5500000000000000000000000000000000000000000000000000000000d505acce00000000000000000000000000000000000000000000000000000000dd62ed3d00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000e1f1c4a700000000000000000000000000000000000000000000000000000000fff6cae900000000000000000000000000000000000000000000000000000000d505accf00000000000000000000000000000000000000000000000000000000d6cf0c3700000000000000000000000000000000000000000000000000000000c45a015400000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000d21220a700000000000000000000000000000000000000000000000000000000ba9a7a5600000000000000000000000000000000000000000000000000000000bc25cf770000000000000000000000000000000000000000000000000000000089afcb4300000000000000000000000000000000000000000000000000000000a9059cba00000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000aab5497c0000000000000000000000000000000000000000000000000000000089afcb440000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000007ecebdff000000000000000000000000000000000000000000000000000000007ecebe0000000000000000000000000000000000000000000000000000000000883bdbfd000000000000000000000000000000000000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000252c09d60000000000000000000000000000000000000000000000000000000032148f6600000000000000000000000000000000000000000000000000000000485cc95400000000000000000000000000000000000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000004f1a47080000000000000000000000000000000000000000000000000000000032148f67000000000000000000000000000000000000000000000000000000003644e5150000000000000000000000000000000000000000000000000000000030adf81e0000000000000000000000000000000000000000000000000000000030adf81f00000000000000000000000000000000000000000000000000000000313ce56700000000000000000000000000000000000000000000000000000000252c09d7000000000000000000000000000000000000000000000000000000002b8e066600000000000000000000000000000000000000000000000000000000095ea7b20000000000000000000000000000000000000000000000000000000018160ddc0000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000dfe16810000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000000000000000000000000000000000000902f1ac00000000000000000000000000000000000000000000000000000000022c0d9f00000000000000000000000000000000000000000000000000000000053f14da70a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000002400000080000000000000000000000000000000000000000000000000000000000000000000000000ffffffe00000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000020000000800000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913202000000000000000000000000000000000000400000000000000000000000006e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9000000000000000000000000000000000000000000000000ffffffffffffff1f02000000000000000000000000000000000000000000000000000000000000001901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f00000000000000000000000000000000000000800000000000000000000000004d616769637377617056323a20494e56414c49445f5349474e4154555245000008c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000004d616769637377617056323a2045585049524544000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000200000000000000000000000004d414749432d56320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000064732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000000200000000000000000000000000000000000020000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d8193649600000000000000000000000000000000000000400000000000000000000000004954595f4255524e4544000000000000000000000000000000000000000000004d616769637377617056323a20494e53554646494349454e545f4c495155494400000000000000000000000000000000000000840000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000ffffffffffffff9f4f4c4400000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000a6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb494c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f4954595f4d494e544544000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000004d616769637377617056323a20464f5242494444454e000000000000000000000000000000000000000000000000000000000064000000800000000000000000313ce567000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000100010000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff0000000000000000000000000000000000000000000000000000ffff000000000200000000000000000000000000000000000040000000800000000000000000ac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a00000000000000000000000000000000000000600000008000000000000000004d616769637377617056323a204c4f434b454400000000000000000000000000495459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000008000000000000000008c232838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f5e1009d836a6e000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000080000000000000000000000000d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8224d616769637377617056323a2062616c616e63653141646a75737465640000004d616769637377617056323a2062616c616e63653041646a75737465640000004d616769637377617056323a204b000000000000000000000000000000000000414d4f554e5400000000000000000000000000000000000000000000000000004d616769637377617056323a20494e53554646494349454e545f494e5055545f4d616769637377617056323a20494e56414c49445f544f0000000000000000004d616769637377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e5400000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17000000000000000000000000000000000000000000000000ffffffffffffffa0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92500000000000000000000000000000000000100000000000000000000000000004d616769637377617056323a204f564552464c4f57000000000000000000000000000000000000000000000000000000000000000000000000000000ffff000000000000ffffffffffffffffffffffffffff00000000000000000000000000001c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad17472616e7366657228616464726573732c75696e743235362900000000000000a9059cbb000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4d616769637377617056323a205452414e534645525f4641494c4544000000000b016bb9e76d006b75e00547a1918c0594a277a401bf8a467e042cfd0f2efa9f", + "0x000400000000000200000000030100190000006003300270000001b1033001970000000100200190000000300000c13d0000008002000039000000400020043f000000040030008c000006190000413d000000000201043b000000e002200270000001c80020009c000000760000213d000001d70020009c000000850000a13d000001d80020009c000000a40000213d000001dc0020009c0000011d0000613d000001dd0020009c000001420000613d000001de0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000001b4021001970000000005000411000000000052004b000002bf0000c13d0000000102000039000000000302041a000001b503300197000000000032041b000001b501100197000000000010041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001b7040000410000000006000019000005a80000013d0000000002000416000000000002004b000006190000c13d0000001f02300039000001b2022001970000008002200039000000400020043f0000001f0430018f000001b3053001980000008002500039000000410000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000003d0000c13d000000000004004b0000004e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000600030008c000006190000413d000000c00100043d000400000001001d000001b40010009c000006190000213d000000a00100043d000200000001001d000000800100043d000300000001001d0000000101000039000000000201041a000001b502200197000000000021041b000000000100041a000001b5021001970000000006000411000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b70400004106c006b60000040f0000000100200190000006190000613d000000400100043d000001b80010009c000000fc0000a13d000001f901000041000000000010043f0000004101000039000000040010043f000001fa01000041000006c200010430000001c90020009c000000950000a13d000001ca0020009c000000af0000213d000001ce0020009c000001690000613d000001cf0020009c000001760000613d000001d00020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000201000039000002760000013d000001df0020009c000000d10000a13d000001e00020009c0000018f0000613d000001e10020009c000001b60000613d000001e20020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000000401000039000000000101041a000000800010043f000001e701000041000006c10001042e000001d10020009c000000e30000a13d000001d20020009c000001da0000613d000001d30020009c000002070000613d000001d40020009c000006190000c13d0000000001000416000000000001004b000006190000c13d0000138801000039000000800010043f000001e701000041000006c10001042e000001d90020009c000002270000613d000001da0020009c000002400000613d000001db0020009c000006190000c13d0000000001000416000000000001004b000006190000c13d000000000100041a000002770000013d000001cb0020009c000002720000613d000001cc0020009c0000027b0000613d000001cd0020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000601043b000001b40060009c000006190000213d000000000100041a000001b4011001970000000005000411000000000051004b000002bf0000c13d0000000101000039000000000201041a000001b502200197000000000262019f000000000021041b0000000001000414000001b10010009c000001b101008041000000c001100210000001b6011001c70000800d020000390000000303000039000001e504000041000005a80000013d000001e30020009c0000029a0000613d000001e40020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b0000000402000039000000000302041a000000000031004b000002d50000813d000000000020043f000001f20110009a000002760000013d000001d50020009c000002a50000613d000001d60020009c000006190000c13d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d06c0064d0000040f000000400400043d00000020054000390000000000250435000000400240003900000000003204350000000000140435000001b10040009c000001b1040080410000004001400210000001ff011001c7000006c10001042e0000004002100039000000400020043f0000000304000029000000000241043600000002050000290000000000520435000000000100041a000001b4011001970000000003000411000000000031004b000003550000c13d000000400100043d000013890040008c000002c80000413d0000006402100039000001c60300004100000000003204350000004402100039000001c7030000410000000000320435000000240210003900000022030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000000000320435000001b10010009c000001b1010080410000004001100210000001c4011001c7000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000003c50000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f0000020601000041000000c40010043f000001f501000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000010043f0000000801000039000000200010043f0000004002000039000000000100001906c006a10000040f0000000402100039000000000202041a0000000303100039000000000303041a0000000204100039000000000404041a0000000105100039000000000505041a000000000101041a000001b401100197000000800010043f000000a00050043f000000c00040043f000000e00030043f000000ff002001900000000001000039000000010100c039000001000010043f0000ff00002001900000000001000039000000010100c039000001200010043f0000020401000041000006c10001042e0000000001000416000000000001004b000006190000c13d0000000402000039000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002db0000c13d000000a0010000390000000004020019000002ea0000013d000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000302043b0000000002030019000001b40030009c000006190000213d0000002401100370000000000101043b000001b40010009c000006190000213d000000000012004b000003650000c13d000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001f601000041000000c40010043f000001f501000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000004402100370000000000302043b000000000003004b0000000002000039000000010200c039000300000003001d000000000023004b000006190000c13d0000002401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c0000040f0000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000020e01000041000000c40010043f0000020f01000041000000e40010043f0000020301000041000006c200010430000000640030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000400000002001d000001b40020009c000006190000213d0000002402100370000000000202043b000300000002001d000001b40020009c000006190000213d0000004401100370000000000301043b000000000100041a000001b4011001970000000002000411000000000021004b000002bf0000c13d000013890030008c000004580000413d000001bc01000041000000800010043f0000002001000039000000840010043f0000002401000039000000a40010043f0000020a01000041000000c40010043f0000020b01000041000000e40010043f0000020301000041000006c200010430000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000201043b0000000001020019000001b40020009c000006190000213d000400000001001d06c0064d0000040f0000000404000029000000000040043f0000000804000039000000200040043f000400000001001d000200000002001d000300000003001d0000004002000039000000000100001906c006a10000040f000000000101041a0000000202000039000000000202041a000001b402200197000000400300043d00000060043000390000000000240435000001b4011001970000002002300039000000000012043500000040013000390000000202000029000000000021043500000080013000390000000302000029000000000021043500000004010000290000000000130435000001b10030009c000001b1030080410000004001300210000001fe011001c7000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d000000c002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002401100370000000000101043b000000a00010043f000000000300041a000001b4033001970000000004000411000000000043004b000003030000c13d000013890020008c000003240000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002201000039000000e40010043f000001c701000041000001040010043f000001c601000041000001240010043f000001fd01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000201041a000001b4032001970000000006000411000000000063004b0000030c0000c13d000001b502200197000000000021041b000000000100041a000001b502100197000000000262019f000000000020041b0000000002000414000001b405100197000001b10020009c000001b102008041000000c001200210000001b6011001c70000800d020000390000000303000039000001b704000041000005a80000013d000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000400000001001d000001b40010009c000006190000213d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013870010008c000003740000a13d000013880300003900000000020000190000000004000019000000000032001a0000026c0000413d00000000023200190000000001420019000000000021004b00000000020000390000000102004039000000010020008c000002930000c13d000001f901000041000000000010043f0000001101000039000000040010043f000001fa01000041000006c2000104300000000001000416000000000001004b000006190000c13d0000000101000039000000000101041a000001b401100197000000800010043f000001e701000041000006c10001042e000000440030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000402100370000000000202043b000001b40020009c000006190000213d0000002401100370000000000101043b000400000001001d000001b40010009c000006190000213d000000000020043f0000000301000039000000200010043f0000004002000039000000000100001906c006a10000040f000000040200002906c0063d0000040f000000000101041a000001b401100197000000400200043d0000000000120435000001b10020009c000001b1020080410000004001200210000001e6011001c7000006c10001042e0000000001000416000000000001004b000006190000c13d0000000701000039000000000101041a0000000602000039000000000202041a000000800020043f000000a00010043f0000021001000041000006c10001042e000000240030008c000006190000413d0000000002000416000000000002004b000006190000c13d0000000401100370000000000101043b000001b40010009c000006190000213d000000000200041a000001b4022001970000000003000411000000000032004b000002bf0000c13d000000000001004b000003a70000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f000001c101000041000000c40010043f000001f501000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f000000a40010043f000001bb01000041000000c40010043f000001f501000041000006c200010430000013890050008c000003180000413d0000004402100039000001c503000041000000000032043500000024021000390000001c030000390000000000320435000001bc020000410000000000210435000000040210003900000020030000390000035f0000013d000001f901000041000000000010043f0000003201000039000000040010043f000001fa01000041000006c200010430000000a005000039000001f70300004100000000040000190000000006050019000000000503041a000000000556043600000001033000390000000104400039000000000014004b000002de0000413d000000410160008a0000021104100197000001f80040009c000000700000213d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002fa0000613d000000a00400003900000000050000190000000046040434000001b40660019700000000026204360000000105500039000000000035004b000002f40000413d0000000002120049000001b10020009c000001b1020080410000006002200210000001b10010009c000001b1010080410000004001100210000000000112019f000006c10001042e000001bc01000041000000c00010043f0000002001000039000000c40010043f000000e40010043f000001bb01000041000001040010043f000001fb01000041000006c200010430000001bc01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f0000020101000041000000c40010043f0000020201000041000000e40010043f0000020301000041000006c2000104300000000003450019000013890030008c000003300000413d0000006402100039000001c20300004100000000003204350000004402100039000001c303000041000000000032043500000024021000390000002a03000039000001120000013d000013890010008c000003b60000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000001c01000039000000e40010043f000001c501000041000001040010043f000001fb01000041000006c2000104300000000603000039000000000043041b0000000703000039000000000053041b000000000341043600000000020204330000000000230435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d000000000100041a000001b4011001970000000002000411000000000021004b000003550000c13d0000000401000029000001b402100198000000400100043d000005ad0000c13d0000004402100039000001c103000041000000000032043500000024021000390000001803000039000002cf0000013d000000400100043d0000004402100039000001bb030000410000000000320435000001bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000001b10010009c000001b1010080410000004001100210000001bd011001c7000006c200010430000000000301001900000000030220190000000002018019000000000002004b000004710000c13d000001bc01000041000000800010043f0000002001000039000000840010043f0000001901000039000000a40010043f000001f401000041000000c40010043f000001f501000041000006c200010430000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d00000003030000290000138802300089000000000101043b0000000101100039000000000101041a000000000412004b000002620000a13d000200000004001d000100000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402100039000000000202041a000000ff00200190000000020110c0390000000601006039000000000101041a0000000204000029000000000041004b000000000401a01900000003030000290000000102000029000000000032001a0000026c0000413d000002650000013d0000000202000039000000000302041a000001b503300197000000000313019f000000000032041b000000800010043f0000000001000414000001b10010009c000001b101008041000000c00110021000000200011001c70000800d020000390000000103000039000001bf04000041000005a80000013d0000000003210019000013890030008c0000059a0000413d000001bc01000041000000c00010043f0000002001000039000000c40010043f0000002a01000039000000e40010043f000001c301000041000001040010043f000001c201000041000001240010043f000001fd01000041000006c200010430000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000003011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000212022001970000000303000029000000000003004b000001000220c1bf000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020504000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000046a0000613d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000002011000390000000202000029000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000401100039000000000201041a00000213022001970000000303000029000000000232019f000000000021041b000000400100043d0000002002100039000000000032043500000002020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d0200003900000002030000390000020c04000041000006170000013d000200000003001d0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b000005c70000c13d000000400100043d00000044021000390000020d03000041000000000032043500000024021000390000001a03000039000002cf0000013d000400000003001d000300000002001d000000000020043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000400300043d000000000101043b000000000101041a000001b400100198000005d30000c13d000200000003001d000001e90030009c000000700000213d0000000203000029000000c001300039000000400010043f0000004401300039000001ea02000041000000000021043500000084010000390000000001130436000100000001001d00000003010000290000006003100210000000400100043d00000020021000390000000000320435000000040300002900000060033002100000003404100039000000000034043500000028030000390000000000310435000001eb0010009c000000700000213d0000006003100039000000400030043f000001b10020009c000001b10200804100000040022002100000000001010433000001b10010009c000001b1010080410000006001100210000000000121019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000020600002900000000020604330000000003000414000001ec04000041000000010700002900000000004704350000008404600039000000840520008a000000000054043500000064046000390000006005000039000000000054043500000024046000390000000000140435000001b10070009c000001b1070080410000004001700210000001b10020009c000001b1020080410000006002200210000000000112019f000001b10030009c000001b103008041000000c002300210000000000112019f000001b6011001c7000080060200003906c006b60000040f0000000100200190000200000000001d000004e00000613d000000000101043b000201b40010019b000001ed010000410000000000100443000000020100002900000004001004430000000001000414000001b10010009c000001b101008041000000c001100210000001ee011001c7000080020200003906c006bb0000040f00000001002001900000061b0000613d000000000101043b000000000001004b000006190000613d000000400300043d000000240130003900000004020000290000000000210435000001ef010000410000000000130435000100000003001d00000004013000390000000302000029000000000021043500000000010004140000000202000029000000040020008c0000050b0000613d0000000102000029000001b10020009c000001b1020080410000004002200210000001b10010009c000001b101008041000000c001100210000000000121019f000001f0011001c7000000020200002906c006b60000040f00000001002001900000061c0000613d0000000101000029000001f10010009c000000700000213d0000000101000029000000400010043f0000000301000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000002022001af000000000021041b0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000302000029000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b5022001970000000203000029000000000232019f000000000021041b000000000030043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000101041a000000000001004b0000057a0000c13d0000000401000039000000000101041a000001f10010009c000000700000213d00000001021000390000000403000039000000000023041b000001f20110009a0000000202000029000000000021041b000000000103041a000100000001001d000000000020043f0000000501000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b0000000102000029000000000021041b0000000401000039000000000101041a000000400200043d0000002003200039000000000013043500000002010000290000000000120435000001b10020009c000001b10200804100000040012002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d020000390000000303000039000001f3040000410000000305000029000000040600002906c006b60000040f0000000100200190000006190000613d000000400100043d00000002020000290000000000210435000001b10010009c000001b1010080410000004001100210000001e6011001c7000006c10001042e0000000603000039000000000023041b0000000703000039000000000013041b000000c00020043f000000e00010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001fc011001c70000800d020000390000000103000039000001ba0400004106c006b60000040f0000000100200190000006190000613d0000000001000019000006c10001042e0000000203000039000000000403041a000001b504400197000000000424019f000000000043041b0000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001be011001c70000800d020000390000000103000039000001bf0400004106c006b60000040f0000000100200190000006190000613d000000200100003900000100001004430000012000000443000001c001000041000006c10001042e000000030000006b000005e30000c13d000000400100043d00000064021000390000020803000041000000000032043500000044021000390000020903000041000000000032043500000024021000390000002103000039000001120000013d0000004401300039000001e8020000410000000000210435000000240130003900000018020000390000000000210435000001bc010000410000000000130435000000040130003900000020020000390000000000210435000001b10030009c000001b1030080410000004001300210000001bd011001c7000006c2000104300000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b000000000201041a000001b50220019700000003022001af000000000021041b0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f0000000100200190000006190000613d000000000101043b00000001011000390000000203000029000000000031041b000000400100043d0000002002100039000000000032043500000003020000290000000000210435000001b10010009c000001b10100804100000040011002100000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b9011001c70000800d02000039000000020300003900000207040000410000000405000029000005a80000013d0000000001000019000006c200010430000000000001042f000000000201001900000060062002700000001f0460018f000001b305600198000000400200043d0000000003520019000006290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000006250000c13d000001b106600197000000000004004b000006370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001b10020009c000001b1020080410000004002200210000000000112019f000006c200010430000001b402200197000000000020043f000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000064b0000613d000000000101043b000000000001042d0000000001000019000006c2000104300004000000000002000001b401100197000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a0000ff0000200190000000030110c0390000000701006039000000000101041a000013880010008c000006680000413d000013880400003900000000020000190000069b0000013d000300000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d00000003040000290000138802400089000000000101043b0000000101100039000000000101041a000000000312004b0000069b0000a13d000100000003001d000200000001001d0000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001b10010009c000001b101008041000000c001100210000001b9011001c7000080100200003906c006bb0000040f00000001002001900000069e0000613d000000000101043b0000000402100039000000000202041a000000ff002001900000000304000029000000020110c039000000060100603900000002020000290000000103000029000000000101041a000000000031004b0000069c0000213d00000000030100190000000001040019000000000001042d00000000030000190000000001040019000000000001042d0000000001000019000006c200010430000000000001042f000001b10010009c000001b1010080410000004001100210000001b10020009c000001b1020080410000006002200210000000000112019f0000000002000414000001b10020009c000001b102008041000000c002200210000000000112019f000001b6011001c7000080100200003906c006bb0000040f0000000100200190000006b40000613d000000000101043b000000000001042d0000000001000019000006c200010430000006b9002104210000000102000039000000000001042d0000000002000019000000000001042d000006be002104230000000102000039000000000001042d0000000002000019000000000001042d000006c000000432000006c10001042e000006c200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000ffffffffffffffbf0200000000000000000000000000000000000040000000000000000000000000ddf8083b55465587b48c2695a2ae37f430a30a016f339945497267abadf235b74f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657208c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000200000000000000000000000000000000000020000000000000000000000000867c1344c5717824d9f22c4ee0800bee4e221458de6fdf3f3769bd2c87b58c0300000002000000000000000000000000000000400000010000000000000000004d616769637377617056323a2042454e45464943494152590000000000000000203e204d41585f464545000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565202b206c7046656500000000000000000000000000000000000000840000000000000000000000004d616769637377617056323a206c70466565203e204d41585f4645450000000045450000000000000000000000000000000000000000000000000000000000004d616769637377617056323a2070726f746f636f6c466565203e204d41585f46000000000000000000000000000000000000000000000000000000009585b0bd00000000000000000000000000000000000000000000000000000000c97682f700000000000000000000000000000000000000000000000000000000e30c397700000000000000000000000000000000000000000000000000000000e30c397800000000000000000000000000000000000000000000000000000000e6a4390500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000c97682f800000000000000000000000000000000000000000000000000000000c9c6539600000000000000000000000000000000000000000000000000000000ceb80df2000000000000000000000000000000000000000000000000000000009d836a6d000000000000000000000000000000000000000000000000000000009d836a6e00000000000000000000000000000000000000000000000000000000b8f5421000000000000000000000000000000000000000000000000000000000bc063e1a000000000000000000000000000000000000000000000000000000009585b0be000000000000000000000000000000000000000000000000000000009af608c9000000000000000000000000000000000000000000000000000000006d587a3c0000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008c232838000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006d587a3d000000000000000000000000000000000000000000000000000000006d771c5400000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003e158b90000000000000000000000000000000000000000000000000000000003e158b91000000000000000000000000000000000000000000000000000000004cc25b8800000000000000000000000000000000000000000000000000000000574f2ba300000000000000000000000000000000000000000000000000000000118b48e5000000000000000000000000000000000000000000000000000000001e3dd18b38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000008000000000000000004d616769637377617056323a20504149525f4558495354530000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43000000000000000000000000000000000000000000000000ffffffffffffff9f3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000485cc955000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e650d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e94d616769637377617056323a205a45524f5f414444524553530000000000000000000000000000000000000000000000000000640000008000000000000000004d616769637377617056323a204944454e544943414c5f4144445245535345538a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000064000000c000000000000000000200000000000000000000000000000000000040000000c000000000000000000000000000000000000000000000000000000084000000c0000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000c0000000800000000000000000ceba5185d0d459a90b443835ac388283f704e04596669f81310b9cfb4ad476fe4d616769637377617056323a205f6c70466565203e204d41585f4645450000003ca180d6c1ab216bb10fa647672355a43d0e0b12b035777f92e6fe7bf246a44264000000000000000000000000000000000000000000000000000000000000004d616769637377617056323a205f62656e656669636961727920696e76616c694d616769637377617056323a205f726f79616c74696573466565203e204d41585f4645450000000000000000000000000000000000000000000000000000000034d0d465daa88a90f6160d083195007eeca7c820e34e112d635e8281adb3321f4d616769637377617056323a205f7061697220696e76616c69640000000000004d616769637377617056323a205f70726f746f636f6c466565203e204d41585f46454500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c0934eab6d0c4ffa4ae85b441d953cd8bf6dabcd278dba29fb1fa83c9c865498" + ] +} \ No newline at end of file diff --git a/deployments/zkSyncSepolia/solcInputs/181d48130aaa3abca6e09907dd1b3e94.json b/deployments/zkSyncSepolia/solcInputs/181d48130aaa3abca6e09907dd1b3e94.json new file mode 100644 index 0000000..32cd046 --- /dev/null +++ b/deployments/zkSyncSepolia/solcInputs/181d48130aaa3abca6e09907dd1b3e94.json @@ -0,0 +1,277 @@ +{ + "language": "Solidity", + "sources": { + "contracts/Router/IMagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol\";\nimport \"../Vault/INftVault.sol\";\n\n/// @title Router contract for swapping, managing liquidity and interacting with vaults\ninterface IMagicSwapV2Router is IUniswapV2Router01 {\n /// @dev Amounts does not match\n error MagicSwapV2WrongAmounts();\n error MagicSwapV2WrongAmountDeposited();\n error MagicSwapV2WrongAmountADeposited();\n error MagicSwapV2WrongAmountBDeposited();\n error MagicSwapV2InvalidPath();\n\n /// @notice Struct that specifies data for liquidity-related operations on vault.\n /// @param token address of NFT vault\n /// @param collection list of NFT addresses\n /// @param tokenId list of token IDs\n /// @param amount list of token amounts. For ERC721 amount is always 1.\n struct NftVaultLiquidityData {\n INftVault token;\n address[] collection;\n uint256[] tokenId;\n uint256[] amount;\n }\n\n /// @notice Emitted when NFT-ERC20 liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vault vault data of deposited NFTs\n event NFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vaultA vault data of deposited NFTs for first side\n /// @param vaultB vault data of deposited NFTs for second side\n event NFTNFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Emitted when NFT-ERC20 liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vault vault data of withdrawn NFTs\n event NFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vaultA vault data of withdrawn NFTs for first side\n /// @param vaultB vault data of withdrawn NFTs for second side\n event NFTNFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Deposit NFTs to vault\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to deposit\n /// @param _tokenId list of token IDs to deposit\n /// @param _amount list of token amounts to deposit. For ERC721 amount is always 1.\n /// @param _vault address of the vault where NFTs are deposited\n /// @param _to address that gets ERC20 for deposited NFTs\n /// @return amountMinted amount of ERC20 minted for deposited NFTs\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted);\n\n /// @dev Withdraw NFTs from vault\n /// @dev Vault token must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to withdraw\n /// @param _tokenId list of token IDs to withdraw\n /// @param _amount list of token amounts to withdraw. For ERC721 amount is always 1.\n /// @param _vault address of the vault to withdraw NFTs from\n /// @param _to address that gets withdrawn NFTs\n /// @return amountBurned amount of ERC20 redeemed for NFTs\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and second ERC20 token\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _tokenB address of token B\n /// @param _amountBDesired desired amount of token B to be added as liquidity\n /// @param _amountBMin minimum amount of token B to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and ETH\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _amountETHMin desired amount of ETH to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountToken amount of vault token added as liquidity\n /// @return amountETH amount of ETH added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using two NFT vaults\n /// @dev All NFTs must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to deposit as liquidity for first side\n /// @param _vaultB vault data for NFTs to deposit as liquidity for second side\n /// @param _amountAMin minimum amount of token A to be deposited\n /// @param _amountBMin minimum amount of token B to be deposited\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ERC20 token\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _tokenB address of token B\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to Token B\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ETH\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountTokenMin minimum amount of vault token to be redeemed\n /// @param _amountETHMin minimum amount of ETH to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to ETH\n /// @return amountToken amount of vault token redeemed\n /// @return amountETH amount of ETH redeemed\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs\n /// @dev Lp token must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to withdraw from liquidity for first side\n /// @param _vaultB vault data for NFTs to withdraw from liquidity for second side\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Swap NFTs for ERC20\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for token\n /// @param _tokenId list of token IDs to swap for token\n /// @param _amount list of token amounts to swap for token. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of output token expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets output token\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for ETH\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for ETH\n /// @param _tokenId list of token IDs to swap for ETH\n /// @param _amount list of token amounts to swap for ETH. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of ETH expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets ETH\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap ERC20 for NFTs\n /// @dev ERC20 must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for tokens\n /// @param _tokenId list of token IDs to receive for tokens\n /// @param _amount list of token amounts to receive for tokens. For ERC721 amount is always 1.\n /// @param _amountInMax maximum acceptable amount of token to swap for NFTs\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap ETH for NFTs\n /// @dev Does not require any approvals. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for ETH\n /// @param _tokenId list of token IDs to receive for ETH\n /// @param _amount list of token amounts to receive for ETH. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for NFTs\n /// @dev All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover\n /// during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn`\n /// as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.\n /// @param _collectionIn list of input NFT addresses\n /// @param _tokenIdIn list of input token IDs\n /// @param _amountIn list of input token amounts. For ERC721 amount is always 1.\n /// @param _collectionOut list of output NFT addresses\n /// @param _tokenIdOut list of output token IDs\n /// @param _amountOut list of output token amounts. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n}\n" + }, + "contracts/Router/MagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"./IMagicSwapV2Router.sol\";\nimport \"../UniswapV2/periphery/UniswapV2Router02.sol\";\nimport \"../UniswapV2/core/interfaces/IUniswapV2Pair.sol\";\n\n// ▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▒░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓\n\ncontract MagicSwapV2Router is IMagicSwapV2Router, UniswapV2Router02 {\n uint256 public constant ONE = 1e18;\n address public constant BURN_ADDRESS = address(0xdead);\n\n constructor(address _factory, address _WETH) UniswapV2Router02(_factory, _WETH) {}\n\n /// @inheritdoc IMagicSwapV2Router\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted) {\n amountMinted = _depositVault(_collection, _tokenId, _amount, _vault, _to);\n }\n\n function _depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) internal returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n INftVault.CollectionData memory collectionData = _vault.getAllowedCollectionData(_collection[i]);\n if (collectionData.nftType == INftVault.NftType.ERC721) {\n IERC721(_collection[i]).safeTransferFrom(msg.sender, address(_vault), _tokenId[i]);\n } else if (collectionData.nftType == INftVault.NftType.ERC1155) {\n IERC1155(_collection[i]).safeTransferFrom(\n msg.sender, address(_vault), _tokenId[i], _amount[i], bytes(\"\")\n );\n } else {\n revert INftVault.UnsupportedNft();\n }\n }\n\n amountMinted = _vault.depositBatch(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned) {\n amountBurned = _withdrawVault(_collection, _tokenId, _amount, _vault, msg.sender, _to);\n }\n\n function _withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _from,\n address _to\n ) internal returns (uint256 amountBurned) {\n IERC20 vaultToken = IERC20(address(_vault));\n uint256 amountToBurn = nftAmountToERC20(_amount);\n uint256 fromBalance = vaultToken.balanceOf(_from);\n uint256 totalSupply = vaultToken.totalSupply();\n\n /// @dev if user withdraws all NFT tokens but does not have totalSupply of ERC20 tokens (some are locked\n /// in UniV2 pool), we optimistically assume that user has enough and adjust `amountToBurn`\n /// to user balance. If user balance does not meet required minimum then Vault will revert anyway.\n if (amountToBurn == totalSupply && fromBalance < totalSupply) {\n amountToBurn = fromBalance;\n }\n\n if (_from == address(this)) _approveIfNeeded(address(_vault), amountToBurn);\n\n vaultToken.transferFrom(_from, address(_vault), amountToBurn);\n amountBurned = _vault.withdrawBatch(_to, _collection, _tokenId, _amount);\n\n if (amountToBurn != amountBurned) revert MagicSwapV2WrongAmounts();\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vault.token), _tokenB, amountAMinted, _amountBDesired, amountAMinted, _amountBMin);\n\n if(amountAMinted != amountA) revert MagicSwapV2WrongAmountDeposited();\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n TransferHelper.safeTransfer(address(_vault.token), pair, amountA);\n TransferHelper.safeTransferFrom(_tokenB, msg.sender, pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount) {\n uint256 amountMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n _approveIfNeeded(address(_vault.token), amountMinted);\n\n (amountToken, amountETH, lpAmount) =\n _addLiquidityETH(address(_vault.token), amountMinted, amountMinted, _amountETHMin, address(this), _to, _deadline);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this));\n uint256 amountBMinted = _depositVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vaultA.token), address(_vaultB.token), amountAMinted, amountBMinted, _amountAMin, _amountBMin);\n\n if (amountAMinted != amountA) {\n if (amountAMinted < amountA) {\n revert MagicSwapV2WrongAmountADeposited();\n }\n \n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountAMinted - amountA);\n }\n\n if (amountBMinted != amountB) {\n if (amountBMinted < amountB) {\n revert MagicSwapV2WrongAmountBDeposited();\n }\n\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountBMinted - amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n TransferHelper.safeTransfer(address(_vaultA.token), pair, amountA);\n TransferHelper.safeTransfer(address(_vaultB.token), pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTNFTLiquidityAdded(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vault.token), _tokenB, _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountA -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), _tokenB, amountA);\n\n amountA = 0;\n amountB += amountOut;\n } else if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountA);\n }\n\n TransferHelper.safeTransfer(_tokenB, _to, amountB);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(address(_vault.token), WETH, _lpAmount, _amountTokenMin, _amountETHMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountToken -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), WETH, amountToken);\n\n amountToken = 0;\n amountETH += amountOut;\n } else if (amountToken > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountToken);\n }\n\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(_to, amountETH);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vaultA.token), address(_vaultB.token), _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurnedA = _withdrawVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this), _to);\n uint256 amountBurnedB = _withdrawVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this), _to);\n\n amountA -= amountBurnedA;\n amountB -= amountBurnedB;\n\n if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountA);\n }\n\n if (amountB > 0) {\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n \n emit NFTNFTLiquidityRemoved(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), _to, _deadline);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n if(_path[_path.length - 1] != WETH) revert MagicSwapV2InvalidPath();\n\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), address(this), _deadline);\n\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(_to, amounts[amounts.length - 1]);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = _swapTokensForExactTokens(amountOut, _amountInMax, _path, msg.sender, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = swapETHForExactTokens(amountOut, _path, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collectionIn, _tokenIdIn, _amountIn, INftVault(_path[0]), address(this));\n address vaultOut = _path[_path.length - 1];\n uint256 amountOutMin = nftAmountToERC20(_amountOut);\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, _path, address(this), address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collectionOut, _tokenIdOut, _amountOut, INftVault(vaultOut), address(this), _to);\n\n uint256 dust = amounts[amounts.length - 1] - amountOutMin;\n\n // send leftover of input token back to the pool and sync\n if (dust > 0) {\n // refund user unused token\n address pair = UniswapV2Library.pairFor(factory, _path[_path.length - 2], vaultOut);\n TransferHelper.safeTransfer(vaultOut, pair, dust);\n IUniswapV2Pair(pair).sync();\n }\n }\n\n function swapLeftover(address _tokenA, address _tokenB, uint256 _amountIn) internal returns (uint256 amountOut) {\n if (_amountIn == 0) return 0;\n\n address[] memory path = new address[](2);\n path[0] = _tokenA;\n path[1] = _tokenB;\n\n _approveIfNeeded(_tokenA, _amountIn);\n\n // swap leftover to tokenB\n // TODO: can be front-run, issue?\n uint256[] memory amounts =\n _swapExactTokensForTokens(_amountIn, 1, path, address(this), address(this), block.timestamp);\n\n return amounts[1];\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal pure returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function _approveIfNeeded(address _token, uint256 _amount) internal {\n if (IERC20(_token).allowance(address(this), address(this)) < _amount) {\n SafeERC20.safeApprove(IERC20(_token), address(this), 0);\n SafeERC20.safeApprove(IERC20(_token), address(this), type(uint256).max);\n }\n }\n}\n" + }, + "contracts/Router/test/MagicSwapV2Router.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"./mock/WETH.sol\";\nimport \"../MagicSwapV2Router.sol\";\nimport \"../../UniswapV2/core/UniswapV2Factory.sol\";\nimport \"../../Vault/NftVaultFactory.sol\";\n\ncontract MagicSwapV2RouterTest is Test {\n WETH weth;\n UniswapV2Factory factory;\n MagicSwapV2Router magicSwapV2Router;\n NftVaultFactory nftVaultFactory;\n ERC721Mintable nft1;\n ERC1155Mintable nft2;\n\n uint256 ONE;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData[] public collections1;\n INftVault.CollectionData[] public collections2;\n\n INftVault vault1;\n INftVault vault2;\n\n address[] public collectionArray;\n uint256[] public tokenIdArray;\n uint256[] public amountArray;\n\n address[] public collectionArray1;\n uint256[] public tokenIdArray1;\n uint256[] public amountArray1;\n\n function setUp() public {\n weth = new WETH();\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n magicSwapV2Router = new MagicSwapV2Router(address(factory), address(weth));\n\n nftVaultFactory = new NftVaultFactory();\n\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections1.push(collectionERC721all);\n vault1 = nftVaultFactory.createVault(collections1);\n nft1 = ERC721Mintable(collectionERC721all.addr);\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections2.push(collectionERC721all);\n collections2.push(collectionERC1155all);\n vault2 = nftVaultFactory.createVault(collections2);\n nft2 = ERC1155Mintable(collectionERC1155all.addr);\n\n ONE = vault1.ONE();\n }\n\n function _dealWeth(address _user, uint256 _amount) public {\n vm.deal(_user, _amount);\n vm.prank(_user);\n weth.deposit{value: _amount}();\n vm.prank(_user);\n weth.approve(address(magicSwapV2Router), _amount);\n }\n\n function _copyStorage()\n public\n view\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n _collection = collectionArray;\n _tokenId = tokenIdArray;\n _amount = amountArray;\n }\n\n function _mintTokens(address _user)\n public\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n (_collection, _tokenId, _amount) = _copyStorage();\n\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n nft1.mint(_user, _tokenId[i]);\n vm.prank(_user);\n nft1.setApprovalForAll(address(magicSwapV2Router), true);\n } else {\n nft2.mint(_user, _tokenId[i], _amount[i]);\n vm.prank(_user);\n nft2.setApprovalForAll(address(magicSwapV2Router), true);\n }\n }\n }\n\n function _checkNftBalances(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address _owner\n ) public {\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n assertEq(nft1.ownerOf(_tokenId[i]), _owner);\n } else {\n assertEq(nft2.balanceOf(_owner, _tokenId[i]), _amount[i]);\n }\n }\n }\n\n function _checkERC20Balances(\n address[] memory _collection,\n uint256[] memory,\n uint256[] memory _amount,\n address _vault,\n address _owner,\n uint256 _prevBalance\n ) public {\n uint256 totalAmount;\n\n for (uint256 i = 0; i < _collection.length; i++) {\n totalAmount += _amount[i];\n }\n\n assertEq(IERC20(_vault).balanceOf(_owner), totalAmount * ONE + _prevBalance);\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal view returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function testDepositWithdrawVault(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 50);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint64).max);\n\n // deposit 1\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n vm.prank(user1);\n uint256 amountMinted1 = magicSwapV2Router.depositVault(_collection1, _tokenId1, _amount1, vault1, user1);\n\n assertEq(amountMinted1, nftAmountToERC20(_amount1));\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault1));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault1), user1, 0);\n\n // deposit 2\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n vm.prank(user2);\n uint256 amountMinted2 = magicSwapV2Router.depositVault(_collection2, _tokenId2, _amount2, vault2, user2);\n\n assertEq(amountMinted2, nftAmountToERC20(_amount2));\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), user2, 0);\n\n // withdraw 1\n vm.startPrank(user1);\n IERC20(address(vault1)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount1));\n\n uint256 amountBurned1 = magicSwapV2Router.withdrawVault(_collection1, _tokenId1, _amount1, vault1, user3);\n vm.stopPrank();\n\n assertEq(amountBurned1, amountMinted1);\n assertEq(IERC20(address(vault1)).balanceOf(user1), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(vault1)), 0);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user3);\n\n // withdraw 2\n\n collectionArray = [address(nft1), address(nft1), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n (address[] memory _collection3,,) = _mintTokens(user2);\n\n vm.startPrank(user2);\n IERC20(address(vault2)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount2));\n\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2WrongAmounts.selector);\n magicSwapV2Router.withdrawVault(_collection3, _tokenId2, _amount2, vault2, user4);\n\n uint256 leftover = vault2.ONE() - vault2.LAST_NFT_AMOUNT();\n IERC20(address(vault2)).transfer(user4, leftover + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n vm.stopPrank();\n\n vm.prank(user4);\n IERC20(address(vault2)).transfer(user2, 1);\n\n vm.prank(user2);\n uint256 amountBurned2 = magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n\n assertEq(amountBurned2 + leftover, amountMinted2);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(vault2)), 0);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, user4);\n }\n\n function testAddLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n // UniswapV2Pair balance is using uint112\n // and amount of NFTs is multiplied by 1e18 when transformed to ERC20\n // and we are depositing multple NFTs\n // so trying to avoid overflow revert\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testAddLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n console2.logBytes32(keccak256(type(UniswapV2Pair).creationCode));\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n vm.deal(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired1\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n vm.deal(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFTETH{value: amountBDesired2}(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired2\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testAddLiquidityNFTNFT(uint256 _tokenId) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1, 1, 1];\n\n (address[] memory _collectionA1, uint256[] memory _tokenIdA1, uint256[] memory _amountA1) = _mintTokens(user1);\n\n collectionArray = [address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++];\n amountArray = [5, 5];\n \n (address[] memory _collectionB1, uint256[] memory _tokenIdB1, uint256[] memory _amountB1) = _mintTokens(user1);\n\n vm.prank(user1);\n\n address pair;\n uint256 amountA1;\n uint256 amountB1;\n {\n (uint256 __amountA1, uint256 __amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA1,\n tokenId: _tokenIdA1,\n amount: _amountA1\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB1,\n tokenId: _tokenIdB1,\n amount: _amountB1\n }),\n nftAmountToERC20(_amountA1),\n nftAmountToERC20(_amountB1),\n user1,\n block.timestamp\n );\n\n amountA1 = __amountA1;\n amountB1 = __amountB1;\n\n // All amounts were used\n assertEq(amountA1, nftAmountToERC20(_amountA1));\n assertEq(amountB1, nftAmountToERC20(_amountB1));\n\n // All vault tokens were transferred to the pair\n pair = UniswapV2Library.pairFor(address(factory), address(vault1), address(vault2));\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA1, _tokenIdA1, _amountA1, address(vault1));\n _checkNftBalances(_collectionB1, _tokenIdB1, _amountB1, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n }\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1];\n\n (address[] memory _collectionA2, uint256[] memory _tokenIdA2, uint256[] memory _amountA2) = _mintTokens(user2);\n\n collectionArray = [address(nft2)];\n tokenIdArray = [_tokenId++];\n amountArray = [5];\n \n (address[] memory _collectionB2, uint256[] memory _tokenIdB2, uint256[] memory _amountB2) = _mintTokens(user2);\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA2,\n tokenId: _tokenIdA2,\n amount: _amountA2\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB2,\n tokenId: _tokenIdB2,\n amount: _amountB2\n }),\n nftAmountToERC20(_amountA2) - ONE,\n nftAmountToERC20(_amountB2),\n user2,\n block.timestamp\n );\n\n // Optimal amounts where used\n assertEq(amountA2, 2.5 * 10 ** 18);\n assertEq(amountB2, nftAmountToERC20(_amountB2));\n\n // Optimal vault tokens were transferred to the pair\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1 + amountA2);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1 + amountB2);\n\n // Leftover vault tokens were transferred to the burn address\n assertEq(IERC20(address(vault1)).balanceOf(address(0xdead)), nftAmountToERC20(_amountA2) - amountA2);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA2, _tokenIdA2, _amountA2, address(vault1));\n _checkNftBalances(_collectionB2, _tokenIdB2, _amountB2, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testRemoveLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevWETHBalance = weth.balanceOf(user1);\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, weth.balanceOf(user1) - prevWETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testRemoveLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevETHBalance = user1.balance;\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, user1.balance - prevETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(weth.balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function _seedLiquidity1(uint256 _tokenId) public returns (uint256 tokenId) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1)\n ];\n collectionArray1 = collectionArray;\n\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n tokenIdArray1 = tokenIdArray;\n\n amountArray = [uint256(1), 1, 1, 1, uint256(1), 1, 1, 1];\n amountArray1 = amountArray;\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18 / 2;\n uint256 amountBMin1 = 9500e18 / 2;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return _tokenId;\n }\n\n function _seedLiquidity2(uint256 _tokenId, uint256 _amount) public returns (uint256 tokenId, uint256 amount) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft2),\n address(nft2),\n address(nft2),\n address(nft2)\n ];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1, _amount++, _amount++, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18;\n uint256 amountBMin1 = 9500e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return (_tokenId, _amount);\n }\n\n function testSwapNftForTokens(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForTokens(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), amountOut);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n address[] memory wrongPath = new address[](2);\n wrongPath[0] = address(vault2);\n wrongPath[1] = address(vault1);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2InvalidPath.selector);\n magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, wrongPath, user2, block.timestamp\n );\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance + amountOut);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapTokensForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n uint256 amountInMax = amountIn;\n\n _dealWeth(user2, amountIn);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapTokensForNft(\n _collection1, _tokenId1, _amount1, amountInMax, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapETHForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n\n uint256 dust = 1e18;\n vm.deal(user2, amountIn + dust);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapETHForNft{value: amountIn + dust}(\n _collection1, _tokenId1, _amount1, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance - amountIn);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n _tokenId = _seedLiquidity1(_tokenId);\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[7]];\n tokenIdArray = [tokenIdArray[7]];\n amountArray = [amountArray[7]];\n\n address[] memory _collectionOut = collectionArray;\n uint256[] memory _tokenIdOut = tokenIdArray;\n uint256[] memory _amountOut = amountArray;\n\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1];\n\n (address[] memory _collectionIn, uint256[] memory _tokenIdIn, uint256[] memory _amountIn) = _mintTokens(user2);\n\n address[] memory path = new address[](3);\n path[0] = address(vault1);\n path[1] = address(weth);\n path[2] = address(vault2);\n\n uint256 amountIn;\n uint256 amountOut;\n {\n amountIn = nftAmountToERC20(_amountIn);\n uint256[] memory amounts = UniswapV2Library.getAmountsOut(address(factory), amountIn, path);\n amountOut = amounts[amounts.length - 1];\n console2.log(\"amountOut\", amountOut);\n }\n\n _amountOut[0] = amountOut / ONE;\n\n assertTrue(nftAmountToERC20(_amountOut) < amountOut);\n assertEq(nftAmountToERC20(_amountOut) / ONE, amountOut / ONE);\n\n uint256 prevPairVault2Balance;\n {\n address pair = UniswapV2Library.pairFor(address(factory), path[1], path[2]);\n prevPairVault2Balance = IERC20(address(vault2)).balanceOf(pair);\n }\n\n vm.prank(user2);\n uint256[] memory swapAmounts = magicSwapV2Router.swapNftForNft(\n _collectionIn, _tokenIdIn, _amountIn, _collectionOut, _tokenIdOut, _amountOut, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collectionIn, _tokenIdIn, _amountIn, address(vault1));\n _checkNftBalances(_collectionOut, _tokenIdOut, _amountOut, user2);\n assertEq(swapAmounts[0], amountIn);\n assertEq(swapAmounts[2], amountOut);\n\n uint256 dust = swapAmounts[swapAmounts.length - 1] - amountOut / ONE * ONE;\n console2.log(\"dust\", dust);\n assertTrue(dust > 0);\n assertEq(\n IERC20(address(vault2)).balanceOf(UniswapV2Library.pairFor(address(factory), path[1], path[2])),\n prevPairVault2Balance - amountOut + dust\n );\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(IERC20(address(vault1)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n}\n" + }, + "contracts/Router/test/mock/WETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ncontract WETH {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed src, address indexed guy, uint256 wad);\n event Transfer(address indexed src, address indexed dst, uint256 wad);\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n receive() external payable {\n deposit();\n }\n\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n emit Deposit(msg.sender, msg.value);\n }\n\n function withdraw(uint256 wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n (bool success,) = payable(msg.sender).call{value: wad}(\"\");\n require(success, \"Transfer failed\");\n emit Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint256) {\n return address(this).balance;\n }\n\n function approve(address guy, uint256 wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n emit Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint256 wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint256 wad) public returns (bool) {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n emit Transfer(src, dst, wad);\n\n return true;\n }\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Callee {\n function uniswapV2Call(address sender, uint256 amount0, uint256 amount1, bytes calldata data) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external pure returns (string memory);\n function symbol() external pure returns (string memory);\n function decimals() external pure returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint256);\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Factory {\n struct DefaultFees {\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n }\n\n struct Fees {\n address royaltiesBeneficiary;\n /// @dev in basis point, denominated by 10000\n uint256 royaltiesFee;\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n /// @dev if true, Fees.protocolFee is used even if set to 0\n bool protocolFeeOverride;\n /// @dev if true, Fees.lpFee is used even if set to 0\n bool lpFeeOverride;\n }\n\n event PairCreated(address indexed token0, address indexed token1, address pair, uint256);\n event DefaultFeesSet(DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(address indexed pair, address beneficiary, uint256 royaltiesFee);\n event ProtocolFeesSet(address indexed pair, uint256 protocolFee, bool overrideFee);\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n /// @notice Returns total fee pair charges\n /// @dev Fee is capped at MAX_FEE\n /// @param pair address of pair for which to calculate fees\n /// @return totalFee total fee amount denominated in basis points\n function getTotalFee(address pair) external view returns (uint256 totalFee);\n\n /// @notice Returns all fees for pair\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFees(address _pair) external view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee);\n\n /// @notice Returns all fees for pair and beneficiaries\n /// @dev Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract\n /// does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied\n /// by priority:\n /// 1. lp fee\n /// 2. royalties\n /// 3. protocol fee\n /// If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then\n /// effective fees will be allocated acording to the fee priority up to MAX_FEE value.\n /// In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.\n /// @param pair address of pair for which to calculate fees and beneficiaries\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesBeneficiary address that gets royalties\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolBeneficiary address that gets protocol fees\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFeesAndRecipients(address pair)\n external\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n );\n\n /// @return protocolFeeBeneficiary address that gets protocol fees\n function protocolFeeBeneficiary() external view returns (address protocolFeeBeneficiary);\n\n /// @notice Internal mapping to store fees for pair. It is exposed for advanced integrations\n /// and in most cases contracts should use fee getters.\n function pairFees(address pair) external view returns (address, uint256, uint256, uint256, bool, bool);\n\n function getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs() external view returns (address[] memory pairs);\n function allPairs(uint256) external view returns (address pair);\n function allPairsLength() external view returns (uint256);\n\n function createPair(address tokenA, address tokenB) external returns (address pair);\n\n /// @notice Sets default fees for all pairs\n /// @param fees struct with default fees\n function setDefaultFees(DefaultFees memory fees) external;\n\n /// @notice Sets royalties fee and beneficiary for pair\n /// @param pair address of pair for which to set fee\n /// @param beneficiary address that gets royalties\n /// @param royaltiesFee amount of royalties fee denominated in basis points\n function setRoyaltiesFee(address pair, address beneficiary, uint256 royaltiesFee) external;\n\n /// @notice Sets protocol fee for pair\n /// @param pair address of pair for which to set fee\n /// @param protocolFee amount of protocol fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setProtocolFee(address pair, uint256 protocolFee, bool overrideFee) external;\n\n /// @notice Sets lp fee for pair\n /// @param pair address of pair for which to set fee\n /// @param lpFee amount of lp fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setLpFee(address pair, uint256 lpFee, bool overrideFee) external;\n\n /// @notice Sets protocol fee beneficiary\n /// @param _beneficiary address that gets protocol fees\n function setProtocolFeeBeneficiary(address _beneficiary) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Pair {\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n /// @notice Emitted by the pool for increases to the number of observations that can be stored\n /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n /// just before a mint/swap/burn.\n /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n event IncreaseObservationCardinalityNext(\n uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew\n );\n\n function MINIMUM_LIQUIDITY() external pure returns (uint256);\n function factory() external view returns (address);\n function token0() external view returns (address);\n function token1() external view returns (address);\n function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\n function observations(uint256 index)\n external\n view\n returns (uint32 blockTimestamp, uint256 priceCumulative, bool initialized);\n\n function observe(uint32[] calldata secondsAgos) external view returns (uint256[] memory tickCumulatives);\n function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n\n function mint(address to) external returns (uint256 liquidity);\n function burn(address to) external returns (uint256 amount0, uint256 amount1);\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;\n function skim(address to) external;\n function sync() external;\n\n function initialize(address, address) external;\n}\n" + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Oracle (modifier version of Oracle.sol from UniswapV3)\n/// @notice Provides price data useful for a wide variety of system designs\n/// @dev Instances of stored oracle data, \"observations\", are collected in the oracle array\n/// Every pool is initialized with an oracle array length of 1. Anyone can pay the SSTOREs to increase the\n/// maximum length of the oracle array. New slots will be added when the array is fully populated.\n/// Observations are overwritten when the full length of the oracle array is populated.\n/// The most recent observation is available, independent of the length of the oracle array, by passing 0 to observe()\nlibrary Oracle {\n struct Observation {\n // the block timestamp of the observation\n uint32 blockTimestamp;\n // the price accumulator, i.e. price * time elapsed since the pool was first initialized\n uint256 priceCumulative;\n // whether or not the observation is initialized\n bool initialized;\n }\n\n /// @notice Transforms a previous observation into a new observation, given the passage of time and the current price values\n /// @dev blockTimestamp _must_ be chronologically equal to or greater than last.blockTimestamp, safe for 0 or 1 overflows\n /// @param last The specified observation to be transformed\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @return Observation The newly populated observation\n function transform(Observation memory last, uint32 blockTimestamp, uint256 lastPrice)\n private\n pure\n returns (Observation memory)\n {\n uint32 delta = blockTimestamp - last.blockTimestamp;\n return Observation({\n blockTimestamp: blockTimestamp,\n priceCumulative: last.priceCumulative + lastPrice * delta,\n initialized: true\n });\n }\n\n /// @notice Initialize the oracle array by writing the first slot. Called once for the lifecycle of the observations array\n /// @param self The stored oracle array\n /// @param time The time of the oracle initialization, via block.timestamp truncated to uint32\n /// @return cardinality The number of populated elements in the oracle array\n /// @return cardinalityNext The new length of the oracle array, independent of population\n function initialize(Observation[65535] storage self, uint32 time)\n internal\n returns (uint16 cardinality, uint16 cardinalityNext)\n {\n self[0] = Observation({blockTimestamp: time, priceCumulative: 0, initialized: true});\n return (1, 1);\n }\n\n /// @notice Writes an oracle observation to the array\n /// @dev Writable at most once per block. Index represents the most recently written element. cardinality and index must be tracked externally.\n /// If the index is at the end of the allowable array length (according to cardinality), and the next cardinality\n /// is greater than the current one, cardinality may be increased. This restriction is created to preserve ordering.\n /// @param self The stored oracle array\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @param cardinality The number of populated elements in the oracle array\n /// @param cardinalityNext The new length of the oracle array, independent of population\n /// @return indexUpdated The new index of the most recently written element in the oracle array\n /// @return cardinalityUpdated The new cardinality of the oracle array\n function write(\n Observation[65535] storage self,\n uint16 index,\n uint32 blockTimestamp,\n uint256 lastPrice,\n uint16 cardinality,\n uint16 cardinalityNext\n ) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated) {\n Observation memory last = self[index];\n\n // early return if we've already written an observation this block\n if (last.blockTimestamp == blockTimestamp) return (index, cardinality);\n\n // if the conditions are right, we can bump the cardinality\n if (cardinalityNext > cardinality && index == (cardinality - 1)) {\n cardinalityUpdated = cardinalityNext;\n } else {\n cardinalityUpdated = cardinality;\n }\n\n indexUpdated = (index + 1) % cardinalityUpdated;\n self[indexUpdated] = transform(last, blockTimestamp, lastPrice);\n }\n\n /// @notice Prepares the oracle array to store up to `next` observations\n /// @param self The stored oracle array\n /// @param current The current next cardinality of the oracle array\n /// @param next The proposed next cardinality which will be populated in the oracle array\n /// @return next The next cardinality which will be populated in the oracle array\n function grow(Observation[65535] storage self, uint16 current, uint16 next) internal returns (uint16) {\n require(current > 0, \"I\");\n // no-op if the passed next value isn't greater than the current next value\n if (next <= current) return current;\n // store in each slot to prevent fresh SSTOREs in swaps\n // this data will not be used because the initialized boolean is still false\n for (uint16 i = current; i < next; i++) {\n self[i].blockTimestamp = 1;\n }\n return next;\n }\n\n /// @notice comparator for 32-bit timestamps\n /// @dev safe for 0 or 1 overflows, a and b _must_ be chronologically before or equal to time\n /// @param time A timestamp truncated to 32 bits\n /// @param a A comparison timestamp from which to determine the relative position of `time`\n /// @param b From which to determine the relative position of `time`\n /// @return bool Whether `a` is chronologically <= `b`\n function lte(uint32 time, uint32 a, uint32 b) private pure returns (bool) {\n // if there hasn't been overflow, no need to adjust\n if (a <= time && b <= time) return a <= b;\n\n uint256 aAdjusted = a > time ? a : a + 2 ** 32;\n uint256 bAdjusted = b > time ? b : b + 2 ** 32;\n\n return aAdjusted <= bAdjusted;\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a target, i.e. where [beforeOrAt, atOrAfter] is satisfied.\n /// The result may be the same observation, or adjacent observations.\n /// @dev The answer must be contained in the array, used when the target is located within the stored observation\n /// boundaries: older than the most recent observation and younger, or the same age as, the oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation recorded before, or at, the target\n /// @return atOrAfter The observation recorded at, or after, the target\n function binarySearch(Observation[65535] storage self, uint32 time, uint32 target, uint16 index, uint16 cardinality)\n private\n view\n returns (Observation memory beforeOrAt, Observation memory atOrAfter)\n {\n uint256 l = (index + 1) % cardinality; // oldest observation\n uint256 r = l + cardinality - 1; // newest observation\n uint256 i;\n while (true) {\n i = (l + r) / 2;\n\n beforeOrAt = self[i % cardinality];\n\n // we've landed on an uninitialized price, keep searching higher (more recently)\n if (!beforeOrAt.initialized) {\n l = i + 1;\n continue;\n }\n\n atOrAfter = self[(i + 1) % cardinality];\n\n bool targetAtOrAfter = lte(time, beforeOrAt.blockTimestamp, target);\n\n // check if we've found the answer!\n if (targetAtOrAfter && lte(time, target, atOrAfter.blockTimestamp)) break;\n\n if (!targetAtOrAfter) r = i - 1;\n else l = i + 1;\n }\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a given target, i.e. where [beforeOrAt, atOrAfter] is satisfied\n /// @dev Assumes there is at least 1 initialized observation.\n /// Used by observeSingle() to compute the counterfactual accumulator values as of a given block timestamp.\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param lastPrice The active price at the time of the returned or simulated observation\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation which occurred at, or before, the given timestamp\n /// @return atOrAfter The observation which occurred at, or after, the given timestamp\n function getSurroundingObservations(\n Observation[65535] storage self,\n uint32 time,\n uint32 target,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n // optimistically set before to the newest observation\n beforeOrAt = self[index];\n\n // if the target is chronologically at or after the newest observation, we can early return\n if (lte(time, beforeOrAt.blockTimestamp, target)) {\n if (beforeOrAt.blockTimestamp == target) {\n // if newest observation equals target, we're in the same block, so we can ignore atOrAfter\n return (beforeOrAt, atOrAfter);\n } else {\n // otherwise, we need to transform\n return (beforeOrAt, transform(beforeOrAt, target, lastPrice));\n }\n }\n\n // now, set before to the oldest observation\n beforeOrAt = self[(index + 1) % cardinality];\n if (!beforeOrAt.initialized) beforeOrAt = self[0];\n\n // ensure that the target is chronologically at or after the oldest observation\n require(lte(time, beforeOrAt.blockTimestamp, target), \"OLD\");\n\n // if we've reached this point, we have to binary search\n return binarySearch(self, time, target, index, cardinality);\n }\n\n /// @dev Reverts if an observation at or before the desired observation timestamp does not exist.\n /// 0 may be passed as `secondsAgo' to return the current cumulative values.\n /// If called with a timestamp falling between two observations, returns the counterfactual accumulator values\n /// at exactly the timestamp between the two observations.\n /// @param self The stored oracle array\n /// @param time The current block timestamp\n /// @param secondsAgo The amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulative The price * time elapsed since the pool was first initialized, as of `secondsAgo`\n function observeSingle(\n Observation[65535] storage self,\n uint32 time,\n uint32 secondsAgo,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256 priceCumulative) {\n if (secondsAgo == 0) {\n Observation memory last = self[index];\n if (last.blockTimestamp != time) last = transform(last, time, lastPrice);\n return last.priceCumulative;\n }\n\n uint32 target = time - secondsAgo;\n\n (Observation memory beforeOrAt, Observation memory atOrAfter) =\n getSurroundingObservations(self, time, target, lastPrice, index, cardinality);\n\n if (target == beforeOrAt.blockTimestamp) {\n // we're at the left boundary\n return beforeOrAt.priceCumulative;\n } else if (target == atOrAfter.blockTimestamp) {\n // we're at the right boundary\n return atOrAfter.priceCumulative;\n } else {\n // we're in the middle\n uint32 observationTimeDelta = atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp;\n uint32 targetDelta = target - beforeOrAt.blockTimestamp;\n return beforeOrAt.priceCumulative\n + ((atOrAfter.priceCumulative - beforeOrAt.priceCumulative) / observationTimeDelta) * targetDelta;\n }\n }\n\n /// @notice Returns the accumulator values as of each time seconds ago from the given time in the array of `secondsAgos`\n /// @dev Reverts if `secondsAgos` > oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param secondsAgos Each amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulatives The price * time elapsed since the pool was first initialized, as of each `secondsAgo`\n function observe(\n Observation[65535] storage self,\n uint32 time,\n uint32[] memory secondsAgos,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256[] memory priceCumulatives) {\n require(cardinality > 0, \"I\");\n\n priceCumulatives = new uint256[](secondsAgos.length);\n for (uint256 i = 0; i < secondsAgos.length; i++) {\n priceCumulatives[i] = observeSingle(self, time, secondsAgos[i], lastPrice, index, cardinality);\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, \"ds-math-add-overflow\");\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, \"ds-math-sub-underflow\");\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, \"ds-math-mul-overflow\");\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing various math operations\n\nlibrary UniswapV2Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UQ112x112.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../../interfaces/IUniswapV2Pair.sol\";\nimport \"../../interfaces/IUniswapV2Callee.sol\";\nimport \"../../interfaces/IUniswapV2Factory.sol\";\n\nimport \"../../libraries/UniswapV2Math.sol\";\nimport \"../../libraries/UQ112x112.sol\";\nimport \"../../libraries/Oracle.sol\";\n\nimport \"../../UniswapV2ERC20.sol\";\n\n/// @dev Minimally adjusted vanilla UniswapV2Pair implementation for testing\n/// @dev CHANGELOG:\n/// - remove body of _mintFee function\n/// - refactor uint112(-1) to type(uint112).max\ncontract UniswapV2PairOriginal is UniswapV2ERC20 {\n using SafeMath for uint256;\n using UQ112x112 for uint224;\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"UniswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"UniswapV2: TRANSFER_FAILED\");\n }\n\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"UniswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"UniswapV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)\n function _mintFee(uint112, uint112) private pure returns (bool) {\n return false;\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Mint(msg.sender, amount0, amount1);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"UniswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"UniswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"UniswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));\n uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(1000 ** 2),\n \"UniswapV2: K\"\n );\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n // force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n // force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/Oracle.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../../periphery/libraries/OracleLibrary.sol\";\nimport \"../UniswapV2Factory.sol\";\n\ncontract OracleImpl {\n function consult(address pair, uint32 period) public view returns (uint256) {\n return OracleLibrary.consult(pair, period);\n }\n}\n\ncontract OracleTest is Test {\n uint256 public constant TIMESTAMP = 1668642357;\n uint256 public constant BLOCKTIME = 15;\n uint256 public START_PRICE;\n\n UniswapV2Pair public pair;\n UniswapV2Factory factory;\n\n ERC20Mintable public DAI = new ERC20Mintable();\n ERC20Mintable public WETH = new ERC20Mintable();\n OracleImpl public oracleImpl = new OracleImpl();\n\n address user1 = address(10000001);\n\n address protocolFeeBeneficiary = address(10000005);\n\n function setUp() public {\n vm.warp(TIMESTAMP);\n\n factory = new UniswapV2Factory(150, 30, protocolFeeBeneficiary);\n\n pair = UniswapV2Pair(factory.createPair(address(WETH), address(DAI)));\n WETH.mint(address(pair), 1000e18);\n DAI.mint(address(pair), 1500000e18);\n pair.mint(user1);\n\n START_PRICE = 1500000e18 * 1e18 / 1000e18;\n }\n\n function _mineBlock(uint256 _time) public {\n vm.roll(block.number + 1);\n vm.warp(block.timestamp + _time);\n }\n\n function _swap(uint256 _wethIn, uint256 _daiIn) public returns (uint256 amountOut) {\n _mineBlock(BLOCKTIME);\n\n (uint112 reserve0, uint112 reserve1,) = pair.getReserves();\n if (_wethIn > 0) {\n uint256 amount1Out =\n UniswapV2Library.getAmountOut(_wethIn, reserve0, reserve1, address(pair), address(factory));\n WETH.mint(address(pair), _wethIn);\n pair.swap(0, amount1Out, user1, bytes(\"\"));\n amountOut = amount1Out;\n } else if (_daiIn > 0) {\n uint256 amount0Out =\n UniswapV2Library.getAmountOut(_daiIn, reserve1, reserve0, address(pair), address(factory));\n DAI.mint(address(pair), _daiIn);\n pair.swap(amount0Out, 0, user1, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testTokensOrder() public {\n assertEq(address(WETH), pair.token0());\n assertEq(address(DAI), pair.token1());\n }\n\n function testConsultOld() public {\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1800);\n\n assertEq(pair.lastPrice(), 0);\n\n _swap(0.01e18, 0);\n vm.warp(block.timestamp + BLOCKTIME);\n assertEq(oracleImpl.consult(address(pair), 15), START_PRICE);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 16);\n\n vm.warp(block.timestamp + 1800 - BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 1800), START_PRICE);\n\n _swap(1e18, 0);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n struct TestAction {\n uint256 wethIn;\n uint256 daiIn;\n uint256 timetravelBefore;\n uint256 timetravelAfter;\n uint32 period;\n uint256 TWAP;\n uint16 observationCardinalityNext;\n uint256 observationIndex;\n }\n\n // workaround for \"UnimplementedFeatureError: Copying of type struct memory to storage not yet supported.\"\n uint256 public constant depositTestCasesLength = 22;\n\n function getTestAction(uint256 _index) public view returns (TestAction memory) {\n TestAction[depositTestCasesLength] memory testSwapCases = [\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 60,\n period: 60,\n TWAP: START_PRICE,\n observationCardinalityNext: 120,\n observationIndex: 0\n }),\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 1800,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1499970495435267142183,\n observationCardinalityNext: 120,\n observationIndex: 1\n }),\n TestAction({\n wethIn: 100e18, // big trade\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 45,\n period: 1800,\n TWAP: 1499969511978807824364,\n observationCardinalityNext: 120,\n observationIndex: 2\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 1363107217423634267487,\n observationCardinalityNext: 120,\n observationIndex: 3\n }),\n TestAction({\n wethIn: 0,\n daiIn: 1000000e18, // huge trade\n timetravelBefore: 900,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1243352310158670807355,\n observationCardinalityNext: 120,\n observationIndex: 4\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1263646160072652749974,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 60 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1344821559728580520453,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 120 sec since huge trade\n timetravelAfter: 330, // 450 sec since huge trade\n period: 1800,\n TWAP: 1872461657492111028567,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 510 sec since huge trade\n timetravelAfter: 390, // 900 sec since huge trade\n period: 1800,\n TWAP: 2481277154911569307160,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 960 sec since huge trade\n timetravelAfter: 390, // 1350 sec since huge trade\n period: 1800,\n TWAP: 3090092652331027585753,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 15, // 1380 sec since huge trade\n timetravelAfter: 400, // 1780 sec since huge trade\n period: 1800,\n TWAP: 3671849683198509940853,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 5, // 1800 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 1860 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 145, // 2020 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 250e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921715,\n observationCardinalityNext: 120,\n observationIndex: 6\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 2783849579014797350624,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 500000e18,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290057,\n observationCardinalityNext: 120,\n observationIndex: 8\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 2554290763490825493524,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n })\n ];\n\n return testSwapCases[_index];\n }\n\n function testConsult() public {\n for (uint256 i = 0; i < depositTestCasesLength; i++) {\n TestAction memory testCase = getTestAction(i);\n\n vm.warp(block.timestamp + testCase.timetravelBefore);\n _swap(testCase.wethIn, testCase.daiIn);\n vm.warp(block.timestamp + testCase.timetravelAfter);\n\n assertEq(oracleImpl.consult(address(pair), testCase.period), testCase.TWAP);\n\n if (testCase.observationCardinalityNext > pair.observationCardinalityNext()) {\n pair.increaseObservationCardinalityNext(testCase.observationCardinalityNext);\n }\n\n assertEq(pair.observationIndex(), testCase.observationIndex);\n }\n }\n\n function testObservationsSingleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, 0);\n assertEq(initialized, true);\n\n _swap(0.01e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME);\n assertEq(initialized, true);\n\n _swap(1e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n function _assertCardinality(\n uint16 observationIndex,\n uint16 observationCardinality,\n uint16 observationCardinalityNext\n ) public {\n assertEq(pair.observationIndex(), observationIndex);\n assertEq(pair.observationCardinality(), observationCardinality);\n assertEq(pair.observationCardinalityNext(), observationCardinalityNext);\n }\n\n function testIncreaseObservationCardinalityNext() public {\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n pair.increaseObservationCardinalityNext(3);\n _assertCardinality(0, 1, 3);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(0, 3, 3);\n\n pair.increaseObservationCardinalityNext(10);\n _assertCardinality(0, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(3, 10, 10);\n\n for (uint256 i = 0; i < 6; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 10);\n\n _swap(1e18, 0);\n _assertCardinality(0, 10, 10);\n\n pair.increaseObservationCardinalityNext(15);\n _assertCardinality(0, 10, 15);\n\n for (uint256 i = 0; i < 9; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 15);\n\n _swap(1e18, 0);\n _assertCardinality(10, 15, 15);\n\n for (uint256 i = 0; i < 4; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(14, 15, 15);\n\n _swap(1e18, 0);\n _assertCardinality(0, 15, 15);\n }\n\n function testObservationsMultipleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n _swap(0.01e18, 0);\n assertEq(pair.lastPrice(), START_PRICE);\n\n (uint32 blockTimestamp0, uint256 priceCumulative0, bool initialized0) = pair.observations(0);\n assertEq(blockTimestamp0, block.timestamp);\n assertEq(priceCumulative0, START_PRICE * BLOCKTIME);\n assertEq(initialized0, true);\n\n pair.increaseObservationCardinalityNext(3);\n\n _swap(100e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(0);\n assertEq(blockTimestamp, blockTimestamp0);\n assertEq(priceCumulative, priceCumulative0);\n assertEq(initialized, initialized0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(1);\n assertEq(blockTimestamp, blockTimestamp0 + BLOCKTIME);\n assertEq(priceCumulative, priceCumulative0 + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Factory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Factory.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\n\ncontract UniswapV2FactoryTest is Test {\n UniswapV2Factory factory;\n\n address pool1;\n address hacker = address(10000004);\n address owner = address(10000005);\n\n address tokenA = address(10000006);\n address tokenB = address(10000007);\n\n address protocolFeeBeneficiary = address(10000005);\n\n uint256 tooBigFee;\n uint256 MAX_FEE;\n\n event PairCreated(\n address indexed token0,\n address indexed token1,\n address pair,\n uint256\n );\n event DefaultFeesSet(IUniswapV2Factory.DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(\n address indexed pair,\n address beneficiary,\n uint256 royaltiesFee\n );\n event ProtocolFeesSet(\n address indexed pair,\n uint256 protocolFee,\n bool overrideFee\n );\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n function setUp() public {\n vm.prank(owner);\n factory = new UniswapV2Factory(0, 0, protocolFeeBeneficiary);\n\n MAX_FEE = factory.MAX_FEE();\n tooBigFee = MAX_FEE + 1;\n\n pool1 = _createPair(tokenA, tokenB);\n }\n\n function _assertFees(\n address _expectedPool,\n address _expectedRoyaltiesBeneficiary,\n uint256 _expectedRoyaltiesFee,\n uint256 _expectedProtocolFee,\n uint256 _expectedLpFee,\n address _expectedProtocolFeeBeneficiary\n ) public {\n (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n ) = factory.getFeesAndRecipients(_expectedPool);\n\n assertEq(lpFee, _expectedLpFee);\n assertEq(royaltiesBeneficiary, _expectedRoyaltiesBeneficiary);\n assertEq(royaltiesFee, _expectedRoyaltiesFee);\n assertEq(protocolBeneficiary, _expectedProtocolFeeBeneficiary);\n assertEq(protocolFee, _expectedProtocolFee);\n }\n\n function _createPair(\n address _tokenA,\n address _tokenB\n ) public returns (address pair) {\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n pair = factory.createPair(_tokenA, _tokenB);\n }\n\n function testSetDefaultFees(uint256 _lpFee, uint256 _protocolFee) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_protocolFee + _lpFee <= MAX_FEE);\n\n (uint256 protocolFee, uint256 lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n\n _assertFees(pool1, address(0), 0, 0, 0, protocolFeeBeneficiary);\n\n IUniswapV2Factory.DefaultFees memory fees = IUniswapV2Factory\n .DefaultFees({protocolFee: _protocolFee, lpFee: _lpFee});\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setDefaultFees(fees);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit DefaultFeesSet(fees);\n factory.setDefaultFees(fees);\n\n (protocolFee, lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, _lpFee);\n\n _assertFees(\n pool1,\n address(0),\n 0,\n _protocolFee,\n _lpFee,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee,\n lpFee: _lpFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: _protocolFee,\n lpFee: tooBigFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee / 2 + 1,\n lpFee: tooBigFee / 2\n })\n );\n }\n\n function testSetLpFee(\n address _pair,\n uint256 _lpFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setLpFee(_pair, _lpFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setLpFee(_pair, _lpFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit LpFeesSet(_pair, _lpFee, true);\n factory.setLpFee(_pair, _lpFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n assertEq(lpFee, _lpFee);\n assertFalse(protocolFeeOverride);\n assertTrue(lpFeeOverride);\n\n _assertFees(_pair, address(0), 0, 0, _lpFee, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _lpFee > MAX_FEE\");\n factory.setLpFee(_pair, tooBigFee, true);\n }\n\n function testSetRoyaltiesFee(\n address _pair,\n address _royaltiesBeneficiary,\n uint256 _royaltiesFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_royaltiesFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _beneficiary invalid\");\n factory.setRoyaltiesFee(_pair, address(0), _royaltiesFee);\n\n vm.assume(_royaltiesBeneficiary != address(0));\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit RoyaltiesFeesSet(_pair, _royaltiesBeneficiary, _royaltiesFee);\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, _royaltiesBeneficiary);\n assertEq(royaltiesFee, _royaltiesFee);\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n assertFalse(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n _royaltiesBeneficiary,\n _royaltiesFee,\n 0,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _royaltiesFee > MAX_FEE\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, tooBigFee);\n }\n\n function testSetProtocolFee(\n address _pair,\n uint256 _protocolFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_pair != pool1);\n\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeesSet(_pair, _protocolFee, true);\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, 0);\n assertTrue(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n address(0),\n 0,\n _protocolFee,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _protocolFee > MAX_FEE\");\n factory.setProtocolFee(_pair, tooBigFee, true);\n }\n\n function testSetProtocolFeeBeneficiary(address _beneficiary) public {\n vm.assume(_beneficiary != address(0));\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n assertEq(factory.protocolFeeBeneficiary(), _beneficiary);\n _assertFees(pool1, address(0), 0, 0, 0, _beneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: BENEFICIARY\");\n factory.setProtocolFeeBeneficiary(address(0));\n }\n\n function testGetFees(\n uint256 _lpFee,\n uint256 _royaltiesFee,\n uint256 _protocolFee\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_royaltiesFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n\n vm.startPrank(owner);\n factory.setLpFee(pool1, _lpFee, true);\n factory.setRoyaltiesFee(pool1, owner, _royaltiesFee);\n factory.setProtocolFee(pool1, _protocolFee, true);\n vm.stopPrank();\n\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = factory\n .getFees(pool1);\n uint256 totalFee = lpFee + royaltiesFee + protocolFee;\n\n assertEq(lpFee, _lpFee);\n\n /// logic below should check that:\n /// - totalFee is never above MAX_FEE\n /// - if _lpFee + _royaltiesFee + _protocolFee > MAX_FEE\n /// then we fill totalFee with fees in following priority:\n /// 1. lpFee\n /// 2. royaltiesFee\n /// 3. protocolFee\n /// until we get to MAX_FEE\n\n if (_lpFee < MAX_FEE) {\n if (_lpFee + _royaltiesFee < MAX_FEE) {\n assertEq(royaltiesFee, _royaltiesFee);\n\n if (_lpFee + _royaltiesFee + _protocolFee <= MAX_FEE) {\n assertEq(protocolFee, _protocolFee);\n assertEq(\n _lpFee + _royaltiesFee + _protocolFee,\n factory.getTotalFee(pool1)\n );\n } else {\n assertEq(protocolFee, MAX_FEE - _lpFee - _royaltiesFee);\n }\n } else {\n assertEq(royaltiesFee, MAX_FEE - _lpFee);\n assertEq(protocolFee, 0);\n }\n } else {\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n }\n\n assertEq(totalFee, factory.getTotalFee(pool1));\n assertTrue(totalFee <= MAX_FEE);\n }\n\n function testCreatePair(address _tokenA, address _tokenB) public {\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n (address token0, address token1) = UniswapV2Library.sortTokens(\n _tokenA,\n _tokenB\n );\n address expectedPair = UniswapV2Library.pairFor(\n address(factory),\n _tokenA,\n _tokenB\n );\n\n vm.expectEmit(true, true, true, true);\n emit PairCreated(token0, token1, expectedPair, 2);\n address pair = factory.createPair(_tokenA, _tokenB);\n\n assertEq(pair, expectedPair);\n assertEq(factory.getPair(_tokenA, _tokenB), pair);\n assertEq(factory.getPair(_tokenB, _tokenA), pair);\n assertEq(factory.allPairs(1), pair);\n assertEq(factory.allPairsLength(), 2);\n\n address[] memory allPairs = factory.allPairs();\n assertEq(allPairs[0], pool1);\n assertEq(allPairs[1], pair);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Pair.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../UniswapV2Factory.sol\";\nimport \"./mock/UniswapV2PairOriginal.sol\";\n\ncontract UniswapV2PairTest is Test {\n UniswapV2Pair pair;\n UniswapV2Pair pairWithFees;\n UniswapV2PairOriginal pairOriginal;\n UniswapV2Factory factory;\n\n ERC20Mintable token0;\n ERC20Mintable token1;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n address royaltiesBeneficiary = address(10000006);\n\n uint256 royaltiesFee = 50;\n uint256 protocolFee = 50;\n\n function setUp() public {\n address tokenA = address(new ERC20Mintable());\n address tokenB = address(new ERC20Mintable());\n (tokenA, tokenB) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n token0 = ERC20Mintable(tokenA);\n token1 = ERC20Mintable(tokenB);\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n vm.startPrank(address(factory));\n\n pair = new UniswapV2Pair();\n pair.initialize(address(token0), address(token1));\n\n pairOriginal = new UniswapV2PairOriginal();\n pairOriginal.initialize(address(token0), address(token1));\n\n pairWithFees = UniswapV2Pair(factory.createPair(address(token0), address(token1)));\n\n vm.stopPrank();\n\n factory.setRoyaltiesFee(address(pairWithFees), royaltiesBeneficiary, royaltiesFee);\n factory.setProtocolFee(address(pairWithFees), protocolFee, true);\n factory.setProtocolFeeBeneficiary(protocolFeeBeneficiary);\n }\n\n function _assertPairs(UniswapV2Pair _pair, UniswapV2PairOriginal _pairOriginal) public {\n assertEq(_pair.token0(), _pairOriginal.token0());\n assertEq(_pair.token1(), _pairOriginal.token1());\n\n (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _pair.getReserves();\n (uint112 _reserve0Org, uint112 _reserve1Org, uint32 _blockTimestampLastOrg) = _pairOriginal.getReserves();\n\n assertEq(_reserve0, _reserve0Org);\n assertEq(_reserve1, _reserve1Org);\n assertEq(_blockTimestampLast, _blockTimestampLastOrg);\n\n assertEq(_pair.factory(), _pairOriginal.factory());\n\n assertEq(token0.balanceOf(address(_pair)), token0.balanceOf(address(_pairOriginal)));\n assertEq(token1.balanceOf(address(_pair)), token1.balanceOf(address(_pairOriginal)));\n }\n\n function _addLiquidity(address _pair, uint256 _amount0, uint256 _amount1, address _to)\n public\n returns (uint256 liquidity)\n {\n token0.mint(_pair, _amount0);\n token1.mint(_pair, _amount1);\n\n liquidity = UniswapV2Pair(_pair).mint(_to);\n }\n\n function testMintBurnRegression(uint112 _amount0, uint112 _amount1) public {\n vm.assume(_amount0 > pair.MINIMUM_LIQUIDITY());\n vm.assume(_amount1 > pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidity = _addLiquidity(address(pair), _amount0, _amount1, user1);\n assertEq(liquidity, pair.totalSupply() - pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidityOriginal = _addLiquidity(address(pairOriginal), _amount0, _amount1, user1);\n assertEq(liquidityOriginal, pairOriginal.totalSupply() - pairOriginal.MINIMUM_LIQUIDITY());\n\n assertEq(liquidity, liquidityOriginal);\n\n _assertPairs(pair, pairOriginal);\n\n vm.prank(user1);\n pair.transfer(address(pair), liquidity);\n (uint256 amount0, uint256 amount1) = pair.burn(user1);\n\n vm.prank(user1);\n pairOriginal.transfer(address(pairOriginal), liquidity);\n (uint256 amount0Org, uint256 amount1Org) = pairOriginal.burn(user2);\n\n assertEq(amount0, amount0Org);\n assertEq(amount1, amount1Org);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function _swap(address _pair, uint256 _amount0In, uint256 _amount1In, address _to)\n public\n returns (uint256 amountOut)\n {\n (uint112 reserve0, uint112 reserve1,) = UniswapV2Pair(_pair).getReserves();\n token0.mint(_pair, _amount0In);\n token1.mint(_pair, _amount1In);\n\n if (_amount0In > _amount1In) {\n uint256 amount1Out = UniswapV2Library.getAmountOut(_amount0In, reserve0, reserve1, _pair, address(factory));\n UniswapV2Pair(_pair).swap(0, amount1Out, _to, bytes(\"\"));\n amountOut = amount1Out;\n } else {\n uint256 amount0Out = UniswapV2Library.getAmountOut(_amount1In, reserve1, reserve0, _pair, address(factory));\n UniswapV2Pair(_pair).swap(amount0Out, 0, _to, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testSwapRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n uint256 amount1Out = _swap(address(pair), _amount0In, 0, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n assertEq(amount1Out, amount1OutOrg);\n _assertPairs(pair, pairOriginal);\n\n for (uint256 i = 0; i < 20; i++) {\n if (i % 2 == 0) {\n _swap(address(pair), _amount0In, 0, user1);\n _swap(address(pairOriginal), _amount0In, 0, user2);\n } else {\n _swap(address(pair), 0, _amount1In, user1);\n _swap(address(pairOriginal), 0, _amount1In, user2);\n }\n }\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSkimRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n pair.skim(user1);\n assertEq(token0.balanceOf(user1), _amount0In);\n assertEq(token1.balanceOf(user1), _amount1In);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n pairOriginal.skim(user2);\n assertEq(token0.balanceOf(user2), _amount0In);\n assertEq(token1.balanceOf(user2), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSyncRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n\n pair.sync();\n pairOriginal.sync();\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSwapWithFees(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In, uint256 _hijackAmount) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n vm.assume(_amount0In > _hijackAmount);\n\n _addLiquidity(address(pairWithFees), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pairWithFees, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n (, address beneficiary, uint256 royalties, address protocolBeneficiary, uint256 protocolBeneficiaryFee) =\n factory.getFeesAndRecipients(address(pairWithFees));\n\n assertEq(beneficiary, royaltiesBeneficiary);\n assertEq(royalties, royaltiesFee);\n assertEq(token0.balanceOf(beneficiary), 0);\n uint256 royaltiesAmount = _amount0In * royalties / 10000;\n\n assertEq(protocolBeneficiary, protocolFeeBeneficiary);\n assertEq(protocolBeneficiaryFee, protocolFee);\n assertEq(token0.balanceOf(protocolBeneficiary), 0);\n uint256 protocolFeeAmount = _amount0In * protocolBeneficiaryFee / 10000;\n\n uint256 amount1Out = _swap(address(pairWithFees), _amount0In, _hijackAmount, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n assertEq(token0.balanceOf(beneficiary), royaltiesAmount);\n assertEq(token0.balanceOf(protocolBeneficiary), protocolFeeAmount);\n assertEq(token1.balanceOf(beneficiary), _hijackAmount * royalties / 10000);\n assertEq(token1.balanceOf(protocolBeneficiary), _hijackAmount * protocolBeneficiaryFee / 10000);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n uint256 maxPercentDelta = (royaltiesFee + protocolFee + 1) * 1e18 / 10000;\n assertApproxEqRel(amount1Out, amount1OutOrg, maxPercentDelta);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./interfaces/IUniswapV2ERC20.sol\";\nimport \"./libraries/SafeMath.sol\";\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using SafeMath for uint256;\n\n string public constant name = \"Magicswap V2\";\n string public constant symbol = \"MAGIC-V2\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH =\n 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint256) public nonces;\n\n constructor() {\n uint256 chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(bytes(\"1\")),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint256 value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint256 value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external\n {\n require(deadline >= block.timestamp, \"MagicswapV2: EXPIRED\");\n bytes32 digest = keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"MagicswapV2: INVALID_SIGNATURE\");\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\n\nimport \"./interfaces/IUniswapV2Factory.sol\";\nimport \"./UniswapV2Pair.sol\";\n\ncontract UniswapV2Factory is IUniswapV2Factory, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n\n /// @dev Fee is denominated in basis points so 5000 / 10000 = 50%\n uint256 public constant MAX_FEE = 5000;\n\n address public protocolFeeBeneficiary;\n\n mapping(address => mapping(address => address)) public getPair;\n EnumerableSet.AddressSet private _allPairs;\n\n DefaultFees public defaultFees;\n mapping(address => Fees) public pairFees;\n\n constructor(uint256 _defaultProtocolFee, uint256 _defaultLpFee, address _protocolFeeBeneficiary) {\n DefaultFees memory startFees = DefaultFees({protocolFee: _defaultProtocolFee, lpFee: _defaultLpFee});\n\n setDefaultFees(startFees);\n setProtocolFeeBeneficiary(_protocolFeeBeneficiary);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getTotalFee(address _pair) public view returns (uint256) {\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = _getFees(_pair);\n return lpFee + royaltiesFee + protocolFee;\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFees(address _pair) public view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n return _getFees(_pair);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFeesAndRecipients(address _pair)\n public\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n )\n {\n (lpFee, royaltiesFee, protocolFee) = _getFees(_pair);\n\n royaltiesBeneficiary = pairFees[_pair].royaltiesBeneficiary;\n protocolBeneficiary = protocolFeeBeneficiary;\n }\n\n function allPairs() external view returns (address[] memory) {\n return _allPairs.values();\n }\n\n function allPairs(uint256 _index) external view returns (address) {\n return _allPairs.at(_index);\n }\n\n function allPairsLength() external view returns (uint256) {\n return _allPairs.length();\n }\n\n function createPair(address tokenA, address tokenB) external returns (address pair) {\n require(tokenA != tokenB, \"MagicswapV2: IDENTICAL_ADDRESSES\");\n (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"MagicswapV2: ZERO_ADDRESS\");\n require(getPair[token0][token1] == address(0), \"MagicswapV2: PAIR_EXISTS\"); // single check is sufficient\n bytes memory bytecode = type(UniswapV2Pair).creationCode;\n bytes32 salt = keccak256(abi.encodePacked(token0, token1));\n assembly {\n pair := create2(0, add(bytecode, 32), mload(bytecode), salt)\n }\n IUniswapV2Pair(pair).initialize(token0, token1);\n getPair[token0][token1] = pair;\n getPair[token1][token0] = pair; // populate mapping in the reverse direction\n _allPairs.add(pair);\n emit PairCreated(token0, token1, pair, _allPairs.length());\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setDefaultFees(DefaultFees memory _fees) public onlyOwner {\n require(_fees.protocolFee <= MAX_FEE, \"MagicswapV2: protocolFee > MAX_FEE\");\n require(_fees.lpFee <= MAX_FEE, \"MagicswapV2: lpFee > MAX_FEE\");\n require(_fees.protocolFee + _fees.lpFee <= MAX_FEE, \"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n\n defaultFees = _fees;\n\n emit DefaultFeesSet(_fees);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setLpFee(address _pair, uint256 _lpFee, bool _overrideFee) external onlyOwner {\n require(_lpFee <= MAX_FEE, \"MagicswapV2: _lpFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].lpFee = _lpFee;\n pairFees[_pair].lpFeeOverride = _overrideFee;\n\n emit LpFeesSet(_pair, _lpFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setRoyaltiesFee(address _pair, address _beneficiary, uint256 _royaltiesFee) external onlyOwner {\n require(_royaltiesFee <= MAX_FEE, \"MagicswapV2: _royaltiesFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n require(_beneficiary != address(0), \"MagicswapV2: _beneficiary invalid\");\n\n pairFees[_pair].royaltiesBeneficiary = _beneficiary;\n pairFees[_pair].royaltiesFee = _royaltiesFee;\n\n emit RoyaltiesFeesSet(_pair, _beneficiary, _royaltiesFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFee(address _pair, uint256 _protocolFee, bool _overrideFee) external onlyOwner {\n require(_protocolFee <= MAX_FEE, \"MagicswapV2: _protocolFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].protocolFee = _protocolFee;\n pairFees[_pair].protocolFeeOverride = _overrideFee;\n\n emit ProtocolFeesSet(_pair, _protocolFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFeeBeneficiary(address _beneficiary) public onlyOwner {\n require(_beneficiary != address(0), \"MagicswapV2: BENEFICIARY\");\n protocolFeeBeneficiary = _beneficiary;\n\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n }\n\n function _getLpFee(address _pair) internal view returns (uint256 lpFee) {\n if (pairFees[_pair].lpFeeOverride) {\n return pairFees[_pair].lpFee;\n } else {\n return defaultFees.lpFee;\n }\n }\n\n function _getRoyaltiesFee(address _pair) internal view returns (uint256 royaltiesFee) {\n return pairFees[_pair].royaltiesFee;\n }\n\n function _getProtocolFee(address _pair) internal view returns (uint256 protocolFee) {\n if (pairFees[_pair].protocolFeeOverride) {\n return pairFees[_pair].protocolFee;\n } else {\n return defaultFees.protocolFee;\n }\n }\n\n function _getFees(address _pair) internal view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n lpFee = _getLpFee(_pair);\n /// lpFee should never be above MAX_FEE but never too safe.\n /// If lpFee is set to MAX_FEE then we know there's no more space for other fees\n if (lpFee >= MAX_FEE) {\n return (MAX_FEE, 0, 0);\n }\n\n royaltiesFee = _getRoyaltiesFee(_pair);\n /// if royaltiesFee + lpFee is greater than MAX_FEE, then decrease royaltiesFee\n /// and return as we know there's no more space for other fees\n if (royaltiesFee >= MAX_FEE - lpFee) {\n return (lpFee, MAX_FEE - lpFee, 0);\n }\n\n protocolFee = _getProtocolFee(_pair);\n /// if protocolFee + royaltiesFee + lpFee is greater than MAX_FEE, then decrease protocolFee\n if (protocolFee > MAX_FEE - lpFee - royaltiesFee) {\n protocolFee = MAX_FEE - lpFee - royaltiesFee;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"./interfaces/IUniswapV2Pair.sol\";\nimport \"./interfaces/IUniswapV2Factory.sol\";\n\nimport \"./libraries/UniswapV2Math.sol\";\nimport \"./libraries/Oracle.sol\";\n\nimport \"./UniswapV2ERC20.sol\";\n\ncontract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {\n using SafeMath for uint256;\n using Oracle for Oracle.Observation[65535];\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n uint256 public constant BASIS_POINTS = 10000;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n // decimal points of token0\n uint256 public TOKEN0_DECIMALS;\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n // the most recent price of token1/token0. Inherits decimals of token1.\n uint256 public lastPrice;\n // the most-recently updated index of the observations array\n uint16 public observationIndex;\n // the current maximum number of observations that are being stored\n uint16 public observationCardinality;\n // the next maximum number of observations to store, triggered in observations.write\n uint16 public observationCardinalityNext;\n\n Oracle.Observation[65535] public override observations;\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"MagicswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"MagicswapV2: TRANSFER_FAILED\");\n }\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"MagicswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n\n TOKEN0_DECIMALS = UniswapV2ERC20(_token0).decimals();\n\n (uint16 cardinality, uint16 cardinalityNext) = observations.initialize(_blockTimestamp());\n\n observationIndex = 0;\n observationCardinality = cardinality;\n observationCardinalityNext = cardinalityNext;\n }\n\n function _blockTimestamp() internal view virtual returns (uint32) {\n return uint32(block.timestamp); // truncation is desired\n }\n\n /// @dev update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"MagicswapV2: OVERFLOW\");\n\n uint32 blockTimestamp;\n uint32 timeElapsed;\n unchecked {\n blockTimestamp = uint32(block.timestamp % 2 ** 32);\n timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n }\n\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // this is first trade of the block and reserves are not yet updated\n lastPrice = 10 ** TOKEN0_DECIMALS * _reserve1 / _reserve0;\n\n // write an oracle entry\n (observationIndex, observationCardinality) = observations.write(\n observationIndex, _blockTimestamp(), lastPrice, observationCardinality, observationCardinalityNext\n );\n }\n\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n /// @dev Calculates fees and sends them to beneficiaries\n function _takeFees(uint256 balance0Adjusted, uint256 balance1Adjusted, uint256 amount0In, uint256 amount1In)\n internal\n returns (uint256 balance0, uint256 balance1)\n {\n (, address royaltiesBeneficiary, uint256 royaltiesFee, address protocolFeeBeneficiary, uint256 protocolFee) =\n IUniswapV2Factory(factory).getFeesAndRecipients(address(this));\n\n address _token0 = token0;\n address _token1 = token1;\n\n for (uint8 i = 0; i < 2; i++) {\n address feeToken = i == 0 ? _token0 : _token1;\n uint256 swapAmount = i == 0 ? amount0In : amount1In;\n\n if (swapAmount > 0) {\n uint256 royaltiesFeeAmount = swapAmount * royaltiesFee / BASIS_POINTS;\n\n // send royalties\n if (royaltiesFeeAmount > 0) {\n _safeTransfer(feeToken, royaltiesBeneficiary, royaltiesFeeAmount);\n }\n\n uint256 protocolFeeAmount = swapAmount * protocolFee / BASIS_POINTS;\n\n // send protocol fee\n if (protocolFeeAmount > 0) {\n _safeTransfer(feeToken, protocolFeeBeneficiary, protocolFeeAmount);\n }\n }\n }\n\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n // Make sure that either balance does not go below adjusted balance used for K calcualtions.\n // If balances after fee transfers are above or equal adjusted balances then K still holds.\n require(balance0 >= balance0Adjusted / BASIS_POINTS, \"MagicswapV2: balance0Adjusted\");\n require(balance1 >= balance1Adjusted / BASIS_POINTS, \"MagicswapV2: balance1Adjusted\");\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Mint(msg.sender, amount0, amount1);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n /// @dev keeping bytes parameter for backward compatibility of the interface\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"MagicswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"MagicswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"MagicswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"MagicswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(address(this));\n uint256 balance0Adjusted = balance0.mul(BASIS_POINTS).sub(amount0In.mul(totalFee));\n uint256 balance1Adjusted = balance1.mul(BASIS_POINTS).sub(amount1In.mul(totalFee));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(BASIS_POINTS ** 2),\n \"MagicswapV2: K\"\n );\n (balance0, balance1) = _takeFees(balance0Adjusted, balance1Adjusted, amount0In, amount1In);\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n /// @dev Read TWAP price\n function observe(uint32[] calldata secondsAgos)\n external\n view\n override\n returns (uint256[] memory priceCumulatives)\n {\n return observations.observe(_blockTimestamp(), secondsAgos, lastPrice, observationIndex, observationCardinality);\n }\n\n /// @dev Increase number of data points for price history\n function increaseObservationCardinalityNext(uint16 _observationCardinalityNext) external override lock {\n uint16 observationCardinalityNextOld = observationCardinalityNext; // for the event\n uint16 observationCardinalityNextNew =\n observations.grow(observationCardinalityNextOld, _observationCardinalityNext);\n observationCardinalityNext = observationCardinalityNextNew;\n if (observationCardinalityNextOld != observationCardinalityNextNew) {\n emit IncreaseObservationCardinalityNext(observationCardinalityNextOld, observationCardinalityNextNew);\n }\n }\n\n /// @dev force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n /// @dev force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false\nlibrary TransferHelper {\n function safeApprove(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('approve(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeApprove: approve failed\"\n );\n }\n\n function safeTransfer(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transfer(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeTransfer: transfer failed\"\n );\n }\n\n function safeTransferFrom(address token, address from, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))),\n \"TransferHelper::transferFrom: transferFrom failed\"\n );\n }\n\n function safeTransferETH(address to, uint256 value) internal {\n (bool success,) = to.call{value: value}(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n }\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Router01 {\n\n error UniswapV2RouterExpired();\n error UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n error UniswapV2RouterInsufficientBAmount();\n error UniswapV2RouterInsufficientAAmount();\n error UniswapV2RouterInsufficientOutputAmount();\n error UniswapV2RouterExcessiveInputAmount();\n error UniswapV2RouterInvalidPath();\n\n function factory() external view returns (address);\n function WETH() external view returns (address);\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountToken, uint256 amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountToken, uint256 amountETH);\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountOut);\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountIn);\n function getAmountsOut(uint256 amountIn, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n function getAmountsIn(uint256 amountOut, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IWETH {\n function deposit() external payable;\n function transfer(address to, uint value) external returns (bool);\n function withdraw(uint) external;\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/OracleLibrary.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\n\n/// @title Oracle library\n/// @notice Provides functions to integrate with MagicswapV2 pool oracle\nlibrary OracleLibrary {\n /// @notice Fetches time-weighted average price using MagicswapV2 oracle\n /// @param pool Address of Uniswap V3 pool that we want to observe\n /// @param period Number of seconds in the past to start calculating time-weighted average\n /// @return timeWeightedAveragePrice The time-weighted average tick from (block.timestamp - period) to block.timestamp\n function consult(address pool, uint32 period) internal view returns (uint256 timeWeightedAveragePrice) {\n require(period != 0, \"BP\");\n\n uint32[] memory secondAgos = new uint32[](2);\n secondAgos[0] = period;\n secondAgos[1] = 0;\n\n uint256[] memory priceCumulatives = IUniswapV2Pair(pool).observe(secondAgos);\n uint256 priceCumulativesDelta = priceCumulatives[1] - priceCumulatives[0];\n\n timeWeightedAveragePrice = priceCumulativesDelta / period;\n }\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\nimport \"../../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../../core/libraries/SafeMath.sol\";\n\n/**\n * @notice Modified UniswapV2 to work with zksync stack based CREATE2\n **/\nlibrary UniswapV2Library {\n using SafeMath for uint256;\n\n /// @dev returns sorted token addresses, used to handle return values from pairs sorted in this order\n function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {\n require(tokenA != tokenB, \"UniswapV2Library: IDENTICAL_ADDRESSES\");\n (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"UniswapV2Library: ZERO_ADDRESS\");\n }\n\n // calculates the CREATE2 address for a pair without making any external calls\n function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {\n (address token0, address token1) = sortTokens(tokenA, tokenB);\n pair = address(uint160(\n uint256(\n keccak256(\n abi.encodePacked(\n bytes32(0x2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494), // keccak256(\"zksyncCreate2\")\n bytes32(uint256(uint160(factory))), // sender\n keccak256(abi.encodePacked(token0, token1)), // salt\n hex'010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43', // init code hash\n bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) // constructor input hash: keccak256(\"\")\n )\n )\n )\n ));\n }\n\n /// @dev fetches and sorts the reserves for a pair\n function getReserves(address factory, address tokenA, address tokenB)\n internal\n view\n returns (uint256 reserveA, uint256 reserveB)\n {\n (address token0,) = sortTokens(tokenA, tokenB);\n (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();\n (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);\n }\n\n /// @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) {\n require(amountA > 0, \"UniswapV2Library: INSUFFICIENT_AMOUNT\");\n require(reserveA > 0 && reserveB > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n amountB = amountA.mul(reserveB) / reserveA;\n }\n\n /// @dev given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountOut)\n {\n require(amountIn > 0, \"UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 amountInWithFee = amountIn.mul(10000 - totalFee);\n uint256 numerator = amountInWithFee.mul(reserveOut);\n uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);\n amountOut = numerator / denominator;\n }\n\n /// @dev given an output amount of an asset and pair reserves, returns a required input amount of the other asset\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountIn)\n {\n require(amountOut > 0, \"UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 numerator = reserveIn.mul(amountOut).mul(10000);\n uint256 denominator = reserveOut.sub(amountOut).mul(10000 - totalFee);\n amountIn = (numerator / denominator).add(1);\n }\n\n /// @dev performs chained getAmountOut calculations on any number of pairs\n function getAmountsOut(address factory, uint256 amountIn, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[0] = amountIn;\n for (uint256 i; i < path.length - 1; i++) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);\n amounts[i + 1] =\n getAmountOut(amounts[i], reserveIn, reserveOut, pairFor(factory, path[i], path[i + 1]), factory);\n }\n }\n\n /// @dev performs chained getAmountIn calculations on any number of pairs\n function getAmountsIn(address factory, uint256 amountOut, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[amounts.length - 1] = amountOut;\n for (uint256 i = path.length - 1; i > 0; i--) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);\n address pair = pairFor(factory, path[i - 1], path[i]);\n amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, pair, factory);\n }\n }\n}\n" + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../core/interfaces/IUniswapV2ERC20.sol\";\nimport \"../core/libraries/SafeMath.sol\";\nimport \"../libraries/TransferHelper.sol\";\n\nimport \"./interfaces/IUniswapV2Router01.sol\";\nimport \"./libraries/UniswapV2Library.sol\";\nimport \"./interfaces/IWETH.sol\";\n\ncontract UniswapV2Router02 is IUniswapV2Router01 {\n using SafeMath for uint256;\n\n address public immutable override factory;\n address public immutable override WETH;\n\n \n modifier ensure(uint256 deadline) {\n if(deadline < block.timestamp) revert UniswapV2RouterExpired();\n _;\n }\n\n constructor(address _factory, address _WETH) {\n factory = _factory;\n WETH = _WETH;\n }\n\n receive() external payable {\n if(msg.sender != WETH) revert UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n }\n\n // **** ADD LIQUIDITY ****\n function _addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin\n ) internal virtual returns (uint256 amountA, uint256 amountB) {\n // create the pair if it doesn't exist yet\n if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {\n IUniswapV2Factory(factory).createPair(tokenA, tokenB);\n }\n (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);\n if (reserveA == 0 && reserveB == 0) {\n (amountA, amountB) = (amountADesired, amountBDesired);\n } else {\n uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);\n if (amountBOptimal <= amountBDesired) {\n if(amountBOptimal < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n (amountA, amountB) = (amountADesired, amountBOptimal);\n } else {\n uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);\n assert(amountAOptimal <= amountADesired);\n if(amountAOptimal < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n (amountA, amountB) = (amountAOptimal, amountBDesired);\n }\n }\n }\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) {\n (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);\n TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);\n liquidity = IUniswapV2Pair(pair).mint(to);\n }\n\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable virtual override returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH, liquidity) =\n _addLiquidityETH(token, amountTokenDesired, amountTokenMin, amountETHMin, msg.sender, to, deadline);\n }\n\n function _addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH) =\n _addLiquidity(token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n TransferHelper.safeTransferFrom(token, from, pair, amountToken);\n IWETH(WETH).deposit{value: amountETH}();\n assert(IWETH(WETH).transfer(pair, amountETH));\n liquidity = IUniswapV2Pair(pair).mint(to);\n // refund dust eth, if any\n if (msg.value > amountETH) TransferHelper.safeTransferETH(to, msg.value - amountETH);\n }\n\n // **** REMOVE LIQUIDITY ****\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n IUniswapV2ERC20(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair\n (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);\n (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);\n (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);\n if(amountA < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n if(amountB < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n }\n\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);\n TransferHelper.safeTransfer(token, to, amountToken);\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(to, amountETH);\n }\n\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);\n }\n\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountToken, uint256 amountETH) {\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);\n }\n\n // **** SWAP ****\n // requires the initial amount to have already been sent to the first pair\n function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual {\n for (uint256 i; i < path.length - 1; i++) {\n (address input, address output) = (path[i], path[i + 1]);\n (address token0,) = UniswapV2Library.sortTokens(input, output);\n uint256 amountOut = amounts[i + 1];\n (uint256 amount0Out, uint256 amount1Out) =\n input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));\n address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;\n IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(\n amount0Out, amount1Out, to, new bytes(0)\n );\n }\n }\n\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address to,\n uint256 deadline\n ) public virtual override returns (uint256[] memory amounts) {\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, path, msg.sender, to, deadline);\n }\n\n function _swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override returns (uint256[] memory amounts) {\n amounts = _swapTokensForExactTokens(amountOut, amountInMax, path, msg.sender, to, deadline);\n }\n\n function _swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n public\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > msg.value) revert UniswapV2RouterExcessiveInputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n // refund dust eth, if any\n if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);\n }\n\n // **** LIBRARY FUNCTIONS ****\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB)\n public\n pure\n virtual\n override\n returns (uint256 amountB)\n {\n return UniswapV2Library.quote(amountA, reserveA, reserveB);\n }\n\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountOut)\n {\n return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountIn)\n {\n return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountsOut(uint256 amountIn, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsOut(factory, amountIn, path);\n }\n\n function getAmountsIn(uint256 amountOut, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsIn(factory, amountOut, path);\n }\n}\n" + }, + "contracts/Vault/INftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVault {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Collection already added\n error DuplicateCollection();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice amount of token required for last NFT to be redeemed\n function LAST_NFT_AMOUNT() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n}\n" + }, + "contracts/Vault/INftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVault.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactory {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVault indexed vault,\n uint256 indexed vaultId,\n INftVault.CollectionData[] collections,\n address creator\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVault vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param index vaultId or index in NftVaultFactory.vaults array\n /// @return vault address\n function getVaultAt(uint256 index) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n /// @return true if vault is deployed by the factory\n function isVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVault.CollectionData[] memory collections) external view returns (INftVault vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVault.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVault.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function reverts\n /// @param collections vault's config\n /// @return vault address of deployed vault\n function createVault(INftVault.CollectionData[] memory collections) external returns (INftVault vault);\n}\n" + }, + "contracts/Vault/NftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVault.sol\";\nimport \"./INftVaultFactory.sol\";\n\ncontract NftVault is INftVault, ERC20, ERC721Holder, ERC1155Holder {\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice amount of token required for last NFT to be redeemed\n uint256 public immutable LAST_NFT_AMOUNT;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n /// @dev last NFT can be redeemed for 99.9%\n LAST_NFT_AMOUNT = ONE * 999 / 1000;\n }\n\n /// @inheritdoc INftVault\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n if (!allowedCollections.set(collection.addr, nftType)) revert DuplicateCollection();\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n emit CollectionAllowed(collection);\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n }\n }\n\n /// @inheritdoc INftVault\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVault\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVault\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVault\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVault\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n uint256 totalSupply_ = totalSupply();\n\n /// @dev If vault ERC20 supply is \"0 < totalSupply <= 0.01\" it means that vault has been emptied and there\n /// is leftover ERC20 token (most likely) locked in the univ2 pair. To prevent minting small amounts\n /// of unbacked ERC20 tokens in a loop, which can lead to unexpected behaviour, vault mints\n /// `ONE - totalSupply` amount of ERC20 token for the first NFT that is deposited after the vault was\n /// emptied. This allows for the vault and univ2 pair to be reused safely.\n if (totalSupply_ > 0 && totalSupply_ <= ONE - LAST_NFT_AMOUNT) {\n amountMinted -= totalSupply_;\n }\n\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVault\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow redeemeing for LAST_NFT_AMOUNT instead of ONE\n if (totalSupply() == amountBurned && balanceOf(address(this)) >= amountBurned - ONE + LAST_NFT_AMOUNT) {\n amountBurned = balanceOf(address(this));\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVault\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n}\n" + }, + "contracts/Vault/NftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactory.sol\";\nimport \"./NftVault.sol\";\n\ncontract NftVaultFactory is INftVaultFactory {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n\n mapping(bytes32 => INftVault) public vaultHashMap;\n mapping(INftVault => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactory\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultAt(uint256 _index) external view returns (address) {\n return vaults.at(_index);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactory\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVault(INftVault.CollectionData[] memory _collections) public view returns (INftVault vault) {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactory\n function exists(INftVault.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactory\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactory\n function createVault(INftVault.CollectionData[] memory _collections) external returns (INftVault vault) {\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVault(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists, revert\n if (address(vault) != address(0)) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n\n vault = INftVault(address(new NftVault(name, symbol)));\n vault.init(_collections);\n\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender);\n }\n}\n" + }, + "forge-std/Base.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {StdStorage} from \"./StdStorage.sol\";\nimport {Vm, VmSafe} from \"./Vm.sol\";\n\nabstract contract CommonBase {\n // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.\n address internal constant VM_ADDRESS = address(uint160(uint256(keccak256(\"hevm cheat code\"))));\n // console.sol and console2.sol work by executing a staticcall to this address.\n address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;\n // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.\n address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256(\"foundry default caller\"))));\n // Address of the test contract, deployed by the DEFAULT_SENDER.\n address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;\n // Deterministic deployment address of the Multicall3 contract.\n address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;\n // The order of the secp256k1 curve.\n uint256 internal constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n\n uint256 internal constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n Vm internal constant vm = Vm(VM_ADDRESS);\n StdStorage internal stdstore;\n}\n\nabstract contract TestBase is CommonBase {}\n\nabstract contract ScriptBase is CommonBase {\n VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);\n}\n" + }, + "forge-std/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\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(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", 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, int256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,int256)\", 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" + }, + "forge-std/console2.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {console as console2} from \"./console.sol\";\n" + }, + "forge-std/interfaces/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\ninterface IERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n" + }, + "forge-std/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\n/// @dev Interface of the ERC20 standard as defined in the EIP.\n/// @dev This includes the optional name, symbol, and decimals metadata.\ninterface IERC20 {\n /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`\n /// is the new allowance.\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /// @notice Returns the amount of tokens in existence.\n function totalSupply() external view returns (uint256);\n\n /// @notice Returns the amount of tokens owned by `account`.\n function balanceOf(address account) external view returns (uint256);\n\n /// @notice Moves `amount` tokens from the caller's account to `to`.\n function transfer(address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the remaining number of tokens that `spender` is allowed\n /// to spend on behalf of `owner`\n function allowance(address owner, address spender) external view returns (uint256);\n\n /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.\n /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n function approve(address spender, uint256 amount) external returns (bool);\n\n /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.\n /// `amount` is then deducted from the caller's allowance.\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the name of the token.\n function name() external view returns (string memory);\n\n /// @notice Returns the symbol of the token.\n function symbol() external view returns (string memory);\n\n /// @notice Returns the decimals places of the token.\n function decimals() external view returns (uint8);\n}\n" + }, + "forge-std/interfaces/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\nimport \"./IERC165.sol\";\n\n/// @title ERC-721 Non-Fungible Token Standard\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.\ninterface IERC721 is IERC165 {\n /// @dev This emits when ownership of any NFT changes by any mechanism.\n /// This event emits when NFTs are created (`from` == 0) and destroyed\n /// (`to` == 0). Exception: during contract creation, any number of NFTs\n /// may be created and assigned without emitting Transfer. At the time of\n /// any transfer, the approved address for that NFT (if any) is reset to none.\n event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);\n\n /// @dev This emits when the approved address for an NFT is changed or\n /// reaffirmed. The zero address indicates there is no approved address.\n /// When a Transfer event emits, this also indicates that the approved\n /// address for that NFT (if any) is reset to none.\n event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);\n\n /// @dev This emits when an operator is enabled or disabled for an owner.\n /// The operator can manage all NFTs of the owner.\n event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n /// @notice Count all NFTs assigned to an owner\n /// @dev NFTs assigned to the zero address are considered invalid, and this\n /// function throws for queries about the zero address.\n /// @param _owner An address for whom to query the balance\n /// @return The number of NFTs owned by `_owner`, possibly zero\n function balanceOf(address _owner) external view returns (uint256);\n\n /// @notice Find the owner of an NFT\n /// @dev NFTs assigned to zero address are considered invalid, and queries\n /// about them do throw.\n /// @param _tokenId The identifier for an NFT\n /// @return The address of the owner of the NFT\n function ownerOf(uint256 _tokenId) external view returns (address);\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT. When transfer is complete, this function\n /// checks if `_to` is a smart contract (code size > 0). If so, it calls\n /// `onERC721Received` on `_to` and throws if the return value is not\n /// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n /// @param data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev This works identically to the other function with an extra data parameter,\n /// except this function just sets data to \"\".\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n /// THEY MAY BE PERMANENTLY LOST\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function transferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Change or reaffirm the approved address for an NFT\n /// @dev The zero address indicates there is no approved address.\n /// Throws unless `msg.sender` is the current NFT owner, or an authorized\n /// operator of the current owner.\n /// @param _approved The new approved NFT controller\n /// @param _tokenId The NFT to approve\n function approve(address _approved, uint256 _tokenId) external payable;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage\n /// all of `msg.sender`'s assets\n /// @dev Emits the ApprovalForAll event. The contract MUST allow\n /// multiple operators per owner.\n /// @param _operator Address to add to the set of authorized operators\n /// @param _approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address _operator, bool _approved) external;\n\n /// @notice Get the approved address for a single NFT\n /// @dev Throws if `_tokenId` is not a valid NFT.\n /// @param _tokenId The NFT to find the approved address for\n /// @return The approved address for this NFT, or the zero address if there is none\n function getApproved(uint256 _tokenId) external view returns (address);\n\n /// @notice Query if an address is an authorized operator for another address\n /// @param _owner The address that owns the NFTs\n /// @param _operator The address that acts on behalf of the owner\n /// @return True if `_operator` is an approved operator for `_owner`, false otherwise\n function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n}\n\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\ninterface IERC721TokenReceiver {\n /// @notice Handle the receipt of an NFT\n /// @dev The ERC721 smart contract calls this function on the recipient\n /// after a `transfer`. This function MAY throw to revert and reject the\n /// transfer. Return of other than the magic value MUST result in the\n /// transaction being reverted.\n /// Note: the contract address is always the message sender.\n /// @param _operator The address which called `safeTransferFrom` function\n /// @param _from The address which previously owned the token\n /// @param _tokenId The NFT identifier which is being transferred\n /// @param _data Additional data with no specified format\n /// @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n /// unless throwing\n function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)\n external\n returns (bytes4);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.\ninterface IERC721Metadata is IERC721 {\n /// @notice A descriptive name for a collection of NFTs in this contract\n function name() external view returns (string memory _name);\n\n /// @notice An abbreviated name for NFTs in this contract\n function symbol() external view returns (string memory _symbol);\n\n /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\n /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC\n /// 3986. The URI may point to a JSON file that conforms to the \"ERC721\n /// Metadata JSON Schema\".\n function tokenURI(uint256 _tokenId) external view returns (string memory);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x780e9d63.\ninterface IERC721Enumerable is IERC721 {\n /// @notice Count NFTs tracked by this contract\n /// @return A count of valid NFTs tracked by this contract, where each one of\n /// them has an assigned and queryable owner not equal to the zero address\n function totalSupply() external view returns (uint256);\n\n /// @notice Enumerate valid NFTs\n /// @dev Throws if `_index` >= `totalSupply()`.\n /// @param _index A counter less than `totalSupply()`\n /// @return The token identifier for the `_index`th NFT,\n /// (sort order not specified)\n function tokenByIndex(uint256 _index) external view returns (uint256);\n\n /// @notice Enumerate NFTs assigned to an owner\n /// @dev Throws if `_index` >= `balanceOf(_owner)` or if\n /// `_owner` is the zero address, representing invalid NFTs.\n /// @param _owner An address where we are interested in NFTs owned by them\n /// @param _index A counter less than `balanceOf(_owner)`\n /// @return The token identifier for the `_index`th NFT assigned to `_owner`,\n /// (sort order not specified)\n function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);\n}\n" + }, + "forge-std/interfaces/IMulticall3.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\ninterface IMulticall3 {\n struct Call {\n address target;\n bytes callData;\n }\n\n struct Call3 {\n address target;\n bool allowFailure;\n bytes callData;\n }\n\n struct Call3Value {\n address target;\n bool allowFailure;\n uint256 value;\n bytes callData;\n }\n\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes[] memory returnData);\n\n function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);\n\n function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);\n\n function blockAndAggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n\n function getBasefee() external view returns (uint256 basefee);\n\n function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);\n\n function getBlockNumber() external view returns (uint256 blockNumber);\n\n function getChainId() external view returns (uint256 chainid);\n\n function getCurrentBlockCoinbase() external view returns (address coinbase);\n\n function getCurrentBlockDifficulty() external view returns (uint256 difficulty);\n\n function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);\n\n function getCurrentBlockTimestamp() external view returns (uint256 timestamp);\n\n function getEthBalance(address addr) external view returns (uint256 balance);\n\n function getLastBlockHash() external view returns (bytes32 blockHash);\n\n function tryAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (Result[] memory returnData);\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n}\n" + }, + "forge-std/mocks/MockERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC20} from \"../interfaces/IERC20.sol\";\n\n/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol\ncontract MockERC20 is IERC20 {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n uint8 internal _decimals;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function decimals() external view override returns (uint8) {\n return _decimals;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal _totalSupply;\n\n mapping(address => uint256) internal _balanceOf;\n\n mapping(address => mapping(address => uint256)) internal _allowance;\n\n function totalSupply() external view override returns (uint256) {\n return _totalSupply;\n }\n\n function balanceOf(address owner) external view override returns (uint256) {\n return _balanceOf[owner];\n }\n\n function allowance(address owner, address spender) external view override returns (uint256) {\n return _allowance[owner][spender];\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal INITIAL_CHAIN_ID;\n\n bytes32 internal INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_, uint8 decimals_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n _decimals = decimals_;\n\n INITIAL_CHAIN_ID = _pureChainId();\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount);\n\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n public\n virtual\n {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n _allowance[recoveredAddress][spender] = value;\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(_name)),\n keccak256(\"1\"),\n _pureChainId(),\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n _totalSupply = _add(_totalSupply, amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _totalSupply = _sub(_totalSupply, amount);\n\n emit Transfer(from, address(0), amount);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MATH LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"ERC20: addition overflow\");\n return c;\n }\n\n function _sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(a >= b, \"ERC20: subtraction underflow\");\n return a - b;\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n" + }, + "forge-std/mocks/MockERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC721Metadata, IERC721TokenReceiver} from \"../interfaces/IERC721.sol\";\n\n/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol\ncontract MockERC721 is IERC721Metadata {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE/LOGIC\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function tokenURI(uint256 id) public view virtual override returns (string memory) {}\n\n /*//////////////////////////////////////////////////////////////\n ERC721 BALANCE/OWNER STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _ownerOf;\n\n mapping(address => uint256) internal _balanceOf;\n\n function ownerOf(uint256 id) public view virtual override returns (address owner) {\n require((owner = _ownerOf[id]) != address(0), \"NOT_MINTED\");\n }\n\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ZERO_ADDRESS\");\n\n return _balanceOf[owner];\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 APPROVAL STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _getApproved;\n\n mapping(address => mapping(address => bool)) internal _isApprovedForAll;\n\n function getApproved(uint256 id) public view virtual override returns (address) {\n return _getApproved[id];\n }\n\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _isApprovedForAll[owner][operator];\n }\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 id) public payable virtual override {\n address owner = _ownerOf[id];\n\n require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], \"NOT_AUTHORIZED\");\n\n _getApproved[id] = spender;\n\n emit Approval(owner, spender, id);\n }\n\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _isApprovedForAll[msg.sender][operator] = approved;\n\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function transferFrom(address from, address to, uint256 id) public payable virtual override {\n require(from == _ownerOf[id], \"WRONG_FROM\");\n\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(\n msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id],\n \"NOT_AUTHORIZED\"\n );\n\n // Underflow of the sender's balance is impossible because we check for\n // ownership above and the recipient's balance can't realistically overflow.\n _balanceOf[from]--;\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n delete _getApproved[id];\n\n emit Transfer(from, to, id);\n }\n\n function safeTransferFrom(address from, address to, uint256 id) public payable virtual override {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function safeTransferFrom(address from, address to, uint256 id, bytes memory data)\n public\n payable\n virtual\n override\n {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC165 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721\n || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 id) internal virtual {\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(_ownerOf[id] == address(0), \"ALREADY_MINTED\");\n\n // Counter overflow is incredibly unrealistic.\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n emit Transfer(address(0), to, id);\n }\n\n function _burn(uint256 id) internal virtual {\n address owner = _ownerOf[id];\n\n require(owner != address(0), \"NOT_MINTED\");\n\n _balanceOf[owner]--;\n\n delete _ownerOf[id];\n\n delete _getApproved[id];\n\n emit Transfer(owner, address(0), id);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MINT LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _safeMint(address to, uint256 id) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function _safeMint(address to, uint256 id, bytes memory data) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n function _isContract(address _addr) private view returns (bool) {\n uint256 codeLength;\n\n // Assembly required for versions < 0.8.0 to check extcodesize.\n assembly {\n codeLength := extcodesize(_addr)\n }\n\n return codeLength > 0;\n }\n}\n" + }, + "forge-std/safeconsole.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\n/// @author philogy \n/// @dev Code generated automatically by script.\nlibrary safeconsole {\n uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;\n\n // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)\n // for the view-to-pure log trick.\n function _sendLogPayload(uint256 offset, uint256 size) private pure {\n function(uint256, uint256) internal view fnIn = _sendLogPayloadView;\n function(uint256, uint256) internal pure pureSendLogPayload;\n /// @solidity memory-safe-assembly\n assembly {\n pureSendLogPayload := fnIn\n }\n pureSendLogPayload(offset, size);\n }\n\n function _sendLogPayloadView(uint256 offset, uint256 size) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))\n }\n }\n\n function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {\n function(uint256, uint256, uint256) internal view fnIn = _memcopyView;\n function(uint256, uint256, uint256) internal pure pureMemcopy;\n /// @solidity memory-safe-assembly\n assembly {\n pureMemcopy := fnIn\n }\n pureMemcopy(fromOffset, toOffset, length);\n }\n\n function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))\n }\n }\n\n function logMemory(uint256 offset, uint256 length) internal pure {\n if (offset >= 0x60) {\n // Sufficient memory before slice to prepare call header.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(sub(offset, 0x60))\n m1 := mload(sub(offset, 0x40))\n m2 := mload(sub(offset, 0x20))\n // Selector of `log(bytes)`.\n mstore(sub(offset, 0x60), 0x0be77f56)\n mstore(sub(offset, 0x40), 0x20)\n mstore(sub(offset, 0x20), length)\n }\n _sendLogPayload(offset - 0x44, length + 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(sub(offset, 0x60), m0)\n mstore(sub(offset, 0x40), m1)\n mstore(sub(offset, 0x20), m2)\n }\n } else {\n // Insufficient space, so copy slice forward, add header and reverse.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n uint256 endOffset = offset + length;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(add(endOffset, 0x00))\n m1 := mload(add(endOffset, 0x20))\n m2 := mload(add(endOffset, 0x40))\n }\n _memcopy(offset, offset + 0x60, length);\n /// @solidity memory-safe-assembly\n assembly {\n // Selector of `log(bytes)`.\n mstore(add(offset, 0x00), 0x0be77f56)\n mstore(add(offset, 0x20), 0x20)\n mstore(add(offset, 0x40), length)\n }\n _sendLogPayload(offset + 0x1c, length + 0x44);\n _memcopy(offset + 0x60, offset, length);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(endOffset, 0x00), m0)\n mstore(add(endOffset, 0x20), m1)\n mstore(add(endOffset, 0x40), m2)\n }\n }\n }\n\n function log(address p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(address)`.\n mstore(0x00, 0x2c2ecbc2)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bool p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(bool)`.\n mstore(0x00, 0x32458eed)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(uint256 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(uint256)`.\n mstore(0x00, 0xf82c50f1)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bytes32 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(string)`.\n mstore(0x00, 0x41304fac)\n mstore(0x20, 0x20)\n writeString(0x40, p0)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,address)`.\n mstore(0x00, 0xdaf0d4aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,bool)`.\n mstore(0x00, 0x75b605d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,uint256)`.\n mstore(0x00, 0x8309e8a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,string)`.\n mstore(0x00, 0x759f86bb)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,address)`.\n mstore(0x00, 0x853c4849)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,bool)`.\n mstore(0x00, 0x2a110e83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,uint256)`.\n mstore(0x00, 0x399174d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,string)`.\n mstore(0x00, 0x8feac525)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,address)`.\n mstore(0x00, 0x69276c86)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,bool)`.\n mstore(0x00, 0x1c9d7eb3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,uint256)`.\n mstore(0x00, 0xf666715a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,string)`.\n mstore(0x00, 0x643fd0df)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,address)`.\n mstore(0x00, 0x319af333)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,bool)`.\n mstore(0x00, 0xc3b55635)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,uint256)`.\n mstore(0x00, 0xb60e72cc)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,string)`.\n mstore(0x00, 0x4b5c4277)\n mstore(0x20, 0x40)\n mstore(0x40, 0x80)\n writeString(0x60, p0)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,address)`.\n mstore(0x00, 0x018c84c2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,bool)`.\n mstore(0x00, 0xf2a66286)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,uint256)`.\n mstore(0x00, 0x17fe6185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,address,string)`.\n mstore(0x00, 0x007150be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,address)`.\n mstore(0x00, 0xf11699ed)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,bool)`.\n mstore(0x00, 0xeb830c92)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,uint256)`.\n mstore(0x00, 0x9c4f99fb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,bool,string)`.\n mstore(0x00, 0x212255cc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,address)`.\n mstore(0x00, 0x7bc0d848)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,bool)`.\n mstore(0x00, 0x678209a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,uint256)`.\n mstore(0x00, 0xb69bcaf6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,uint256,string)`.\n mstore(0x00, 0xa1f2e8aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,address)`.\n mstore(0x00, 0xf08744e8)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,bool)`.\n mstore(0x00, 0xcf020fb1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,uint256)`.\n mstore(0x00, 0x67dd6ff1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(address,string,string)`.\n mstore(0x00, 0xfb772265)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,address)`.\n mstore(0x00, 0xd2763667)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,bool)`.\n mstore(0x00, 0x18c9c746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,uint256)`.\n mstore(0x00, 0x5f7b9afb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,address,string)`.\n mstore(0x00, 0xde9a9270)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,address)`.\n mstore(0x00, 0x1078f68d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,bool)`.\n mstore(0x00, 0x50709698)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,uint256)`.\n mstore(0x00, 0x12f21602)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,bool,string)`.\n mstore(0x00, 0x2555fa46)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,address)`.\n mstore(0x00, 0x088ef9d2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,bool)`.\n mstore(0x00, 0xe8defba9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,uint256)`.\n mstore(0x00, 0x37103367)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,uint256,string)`.\n mstore(0x00, 0xc3fc3970)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,address)`.\n mstore(0x00, 0x9591b953)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,bool)`.\n mstore(0x00, 0xdbb4c247)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,uint256)`.\n mstore(0x00, 0x1093ee11)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(bool,string,string)`.\n mstore(0x00, 0xb076847f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,address)`.\n mstore(0x00, 0xbcfd9be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,bool)`.\n mstore(0x00, 0x9b6ec042)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,uint256)`.\n mstore(0x00, 0x5a9b5ed5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,address,string)`.\n mstore(0x00, 0x63cb41f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,address)`.\n mstore(0x00, 0x35085f7b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,bool)`.\n mstore(0x00, 0x20718650)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,uint256)`.\n mstore(0x00, 0x20098014)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,bool,string)`.\n mstore(0x00, 0x85775021)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,address)`.\n mstore(0x00, 0x5c96b331)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,bool)`.\n mstore(0x00, 0x4766da72)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,uint256)`.\n mstore(0x00, 0xd1ed7a3c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,uint256,string)`.\n mstore(0x00, 0x71d04af2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,address)`.\n mstore(0x00, 0x7afac959)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,bool)`.\n mstore(0x00, 0x4ceda75a)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,uint256)`.\n mstore(0x00, 0x37aa7d4c)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(uint256,string,string)`.\n mstore(0x00, 0xb115611f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,address)`.\n mstore(0x00, 0xfcec75e0)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,bool)`.\n mstore(0x00, 0xc91d5ed4)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,uint256)`.\n mstore(0x00, 0x0d26b925)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,address,string)`.\n mstore(0x00, 0xe0e9ad4f)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,address)`.\n mstore(0x00, 0x932bbb38)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,bool)`.\n mstore(0x00, 0x850b7ad6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,uint256)`.\n mstore(0x00, 0xc95958d6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,bool,string)`.\n mstore(0x00, 0xe298f47d)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,address)`.\n mstore(0x00, 0x1c7ec448)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,bool)`.\n mstore(0x00, 0xca7733b1)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,uint256)`.\n mstore(0x00, 0xca47c4eb)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,uint256,string)`.\n mstore(0x00, 0x5970e089)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,address)`.\n mstore(0x00, 0x95ed0195)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,bool)`.\n mstore(0x00, 0xb0e0f9b5)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,uint256)`.\n mstore(0x00, 0x5821efa1)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n // Selector of `log(string,string,string)`.\n mstore(0x00, 0x2ced7cef)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, 0xe0)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n writeString(0x100, p2)\n }\n _sendLogPayload(0x1c, 0x124);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n }\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,address)`.\n mstore(0x00, 0x665bf134)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,bool)`.\n mstore(0x00, 0x0e378994)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,uint256)`.\n mstore(0x00, 0x94250d77)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,address,string)`.\n mstore(0x00, 0xf808da20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,address)`.\n mstore(0x00, 0x9f1bc36e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,bool)`.\n mstore(0x00, 0x2cd4134a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,uint256)`.\n mstore(0x00, 0x3971e78c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,bool,string)`.\n mstore(0x00, 0xaa6540c8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,address)`.\n mstore(0x00, 0x8da6def5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,bool)`.\n mstore(0x00, 0x9b4254e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,uint256)`.\n mstore(0x00, 0xbe553481)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,uint256,string)`.\n mstore(0x00, 0xfdb4f990)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,address)`.\n mstore(0x00, 0x8f736d16)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,bool)`.\n mstore(0x00, 0x6f1a594e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,uint256)`.\n mstore(0x00, 0xef1cefe7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,address,string,string)`.\n mstore(0x00, 0x21bdaf25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,address)`.\n mstore(0x00, 0x660375dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,bool)`.\n mstore(0x00, 0xa6f50b0f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,uint256)`.\n mstore(0x00, 0xa75c59de)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,address,string)`.\n mstore(0x00, 0x2dd778e6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,address)`.\n mstore(0x00, 0xcf394485)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,bool)`.\n mstore(0x00, 0xcac43479)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,uint256)`.\n mstore(0x00, 0x8c4e5de6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,bool,string)`.\n mstore(0x00, 0xdfc4a2e8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,address)`.\n mstore(0x00, 0xccf790a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,bool)`.\n mstore(0x00, 0xc4643e20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,uint256)`.\n mstore(0x00, 0x386ff5f4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,uint256,string)`.\n mstore(0x00, 0x0aa6cfad)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,address)`.\n mstore(0x00, 0x19fd4956)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,bool)`.\n mstore(0x00, 0x50ad461d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,uint256)`.\n mstore(0x00, 0x80e6a20b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,bool,string,string)`.\n mstore(0x00, 0x475c5c33)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,address)`.\n mstore(0x00, 0x478d1c62)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,bool)`.\n mstore(0x00, 0xa1bcc9b3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,uint256)`.\n mstore(0x00, 0x100f650e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,address,string)`.\n mstore(0x00, 0x1da986ea)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,address)`.\n mstore(0x00, 0xa31bfdcc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,bool)`.\n mstore(0x00, 0x3bf5e537)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,uint256)`.\n mstore(0x00, 0x22f6b999)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,bool,string)`.\n mstore(0x00, 0xc5ad85f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,address)`.\n mstore(0x00, 0x20e3984d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,bool)`.\n mstore(0x00, 0x66f1bc67)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,uint256)`.\n mstore(0x00, 0x34f0e636)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,uint256,string)`.\n mstore(0x00, 0x4a28c017)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,address)`.\n mstore(0x00, 0x5c430d47)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,bool)`.\n mstore(0x00, 0xcf18105c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,uint256)`.\n mstore(0x00, 0xbf01f891)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,uint256,string,string)`.\n mstore(0x00, 0x88a8c406)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,address)`.\n mstore(0x00, 0x0d36fa20)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,bool)`.\n mstore(0x00, 0x0df12b76)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,uint256)`.\n mstore(0x00, 0x457fe3cf)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,address,string)`.\n mstore(0x00, 0xf7e36245)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,address)`.\n mstore(0x00, 0x205871c2)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,bool)`.\n mstore(0x00, 0x5f1d5c9f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,uint256)`.\n mstore(0x00, 0x515e38b6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,bool,string)`.\n mstore(0x00, 0xbc0b61fe)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,address)`.\n mstore(0x00, 0x63183678)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,bool)`.\n mstore(0x00, 0x0ef7e050)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,uint256)`.\n mstore(0x00, 0x1dc8e1b8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,uint256,string)`.\n mstore(0x00, 0x448830a8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,address)`.\n mstore(0x00, 0xa04e2f87)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,bool)`.\n mstore(0x00, 0x35a5071f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,uint256)`.\n mstore(0x00, 0x159f8927)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(address,string,string,string)`.\n mstore(0x00, 0x5d02c50b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,address)`.\n mstore(0x00, 0x1d14d001)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,bool)`.\n mstore(0x00, 0x46600be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,uint256)`.\n mstore(0x00, 0x0c66d1be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,address,string)`.\n mstore(0x00, 0xd812a167)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,address)`.\n mstore(0x00, 0x1c41a336)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,bool)`.\n mstore(0x00, 0x6a9c478b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,uint256)`.\n mstore(0x00, 0x07831502)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,bool,string)`.\n mstore(0x00, 0x4a66cb34)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,address)`.\n mstore(0x00, 0x136b05dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,bool)`.\n mstore(0x00, 0xd6019f1c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,uint256)`.\n mstore(0x00, 0x7bf181a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,uint256,string)`.\n mstore(0x00, 0x51f09ff8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,address)`.\n mstore(0x00, 0x6f7c603e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,bool)`.\n mstore(0x00, 0xe2bfd60b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,uint256)`.\n mstore(0x00, 0xc21f64c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,address,string,string)`.\n mstore(0x00, 0xa73c1db6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,address)`.\n mstore(0x00, 0xf4880ea4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,bool)`.\n mstore(0x00, 0xc0a302d8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,uint256)`.\n mstore(0x00, 0x4c123d57)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,address,string)`.\n mstore(0x00, 0xa0a47963)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,address)`.\n mstore(0x00, 0x8c329b1a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,bool)`.\n mstore(0x00, 0x3b2a5ce0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,uint256)`.\n mstore(0x00, 0x6d7045c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,bool,string)`.\n mstore(0x00, 0x2ae408d4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,address)`.\n mstore(0x00, 0x54a7a9a0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,bool)`.\n mstore(0x00, 0x619e4d0e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,uint256)`.\n mstore(0x00, 0x0bb00eab)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,uint256,string)`.\n mstore(0x00, 0x7dd4d0e0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,address)`.\n mstore(0x00, 0xf9ad2b89)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,bool)`.\n mstore(0x00, 0xb857163a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,uint256)`.\n mstore(0x00, 0xe3a9ca2f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,bool,string,string)`.\n mstore(0x00, 0x6d1e8751)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,address)`.\n mstore(0x00, 0x26f560a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,bool)`.\n mstore(0x00, 0xb4c314ff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,uint256)`.\n mstore(0x00, 0x1537dc87)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,address,string)`.\n mstore(0x00, 0x1bb3b09a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,address)`.\n mstore(0x00, 0x9acd3616)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,bool)`.\n mstore(0x00, 0xceb5f4d7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,uint256)`.\n mstore(0x00, 0x7f9bbca2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,bool,string)`.\n mstore(0x00, 0x9143dbb1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,address)`.\n mstore(0x00, 0x00dd87b9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,bool)`.\n mstore(0x00, 0xbe984353)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,uint256)`.\n mstore(0x00, 0x374bb4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,uint256,string)`.\n mstore(0x00, 0x8e69fb5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,address)`.\n mstore(0x00, 0xfedd1fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,bool)`.\n mstore(0x00, 0xe5e70b2b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,uint256)`.\n mstore(0x00, 0x6a1199e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,uint256,string,string)`.\n mstore(0x00, 0xf5bc2249)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,address)`.\n mstore(0x00, 0x2b2b18dc)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,bool)`.\n mstore(0x00, 0x6dd434ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,uint256)`.\n mstore(0x00, 0xa5cada94)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,address,string)`.\n mstore(0x00, 0x12d6c788)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,address)`.\n mstore(0x00, 0x538e06ab)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,bool)`.\n mstore(0x00, 0xdc5e935b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,uint256)`.\n mstore(0x00, 0x1606a393)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,bool,string)`.\n mstore(0x00, 0x483d0416)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,address)`.\n mstore(0x00, 0x1596a1ce)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,bool)`.\n mstore(0x00, 0x6b0e5d53)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,uint256)`.\n mstore(0x00, 0x28863fcb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,uint256,string)`.\n mstore(0x00, 0x1ad96de6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,address)`.\n mstore(0x00, 0x97d394d8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,bool)`.\n mstore(0x00, 0x1e4b87e5)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,uint256)`.\n mstore(0x00, 0x7be0c3eb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(bool,string,string,string)`.\n mstore(0x00, 0x1762e32a)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,address)`.\n mstore(0x00, 0x2488b414)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,bool)`.\n mstore(0x00, 0x091ffaf5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,uint256)`.\n mstore(0x00, 0x736efbb6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,address,string)`.\n mstore(0x00, 0x031c6f73)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,address)`.\n mstore(0x00, 0xef72c513)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,bool)`.\n mstore(0x00, 0xe351140f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,uint256)`.\n mstore(0x00, 0x5abd992a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,bool,string)`.\n mstore(0x00, 0x90fb06aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,address)`.\n mstore(0x00, 0x15c127b5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,bool)`.\n mstore(0x00, 0x5f743a7c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,uint256)`.\n mstore(0x00, 0x0c9cd9c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,uint256,string)`.\n mstore(0x00, 0xddb06521)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,address)`.\n mstore(0x00, 0x9cba8fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,bool)`.\n mstore(0x00, 0xcc32ab07)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,uint256)`.\n mstore(0x00, 0x46826b5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,address,string,string)`.\n mstore(0x00, 0x3e128ca3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,address)`.\n mstore(0x00, 0xa1ef4cbb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,bool)`.\n mstore(0x00, 0x454d54a5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,uint256)`.\n mstore(0x00, 0x078287f5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,address,string)`.\n mstore(0x00, 0xade052c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,address)`.\n mstore(0x00, 0x69640b59)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,bool)`.\n mstore(0x00, 0xb6f577a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,uint256)`.\n mstore(0x00, 0x7464ce23)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,bool,string)`.\n mstore(0x00, 0xdddb9561)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,address)`.\n mstore(0x00, 0x88cb6041)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,bool)`.\n mstore(0x00, 0x91a02e2a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,uint256)`.\n mstore(0x00, 0xc6acc7a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,uint256,string)`.\n mstore(0x00, 0xde03e774)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,address)`.\n mstore(0x00, 0xef529018)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,bool)`.\n mstore(0x00, 0xeb928d7f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,uint256)`.\n mstore(0x00, 0x2c1d0746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,bool,string,string)`.\n mstore(0x00, 0x68c8b8bd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,address)`.\n mstore(0x00, 0x56a5d1b1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,bool)`.\n mstore(0x00, 0x15cac476)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,uint256)`.\n mstore(0x00, 0x88f6e4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,address,string)`.\n mstore(0x00, 0x6cde40b8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,address)`.\n mstore(0x00, 0x9a816a83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,bool)`.\n mstore(0x00, 0xab085ae6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,uint256)`.\n mstore(0x00, 0xeb7f6fd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,bool,string)`.\n mstore(0x00, 0xa5b4fc99)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,address)`.\n mstore(0x00, 0xfa8185af)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,bool)`.\n mstore(0x00, 0xc598d185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,uint256)`.\n mstore(0x00, 0x193fb800)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,uint256,string)`.\n mstore(0x00, 0x59cfcbe3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,address)`.\n mstore(0x00, 0x42d21db7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,bool)`.\n mstore(0x00, 0x7af6ab25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,uint256)`.\n mstore(0x00, 0x5da297eb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,uint256,string,string)`.\n mstore(0x00, 0x27d8afd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,address)`.\n mstore(0x00, 0x6168ed61)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,bool)`.\n mstore(0x00, 0x90c30a56)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,uint256)`.\n mstore(0x00, 0xe8d3018d)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,address,string)`.\n mstore(0x00, 0x9c3adfa1)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,address)`.\n mstore(0x00, 0xae2ec581)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,bool)`.\n mstore(0x00, 0xba535d9c)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,uint256)`.\n mstore(0x00, 0xcf009880)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,bool,string)`.\n mstore(0x00, 0xd2d423cd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,address)`.\n mstore(0x00, 0x3b2279b4)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,bool)`.\n mstore(0x00, 0x691a8f74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,uint256)`.\n mstore(0x00, 0x82c25b74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,uint256,string)`.\n mstore(0x00, 0xb7b914ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,address)`.\n mstore(0x00, 0xd583c602)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,bool)`.\n mstore(0x00, 0xb3a6b6bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,uint256)`.\n mstore(0x00, 0xb028c9bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(uint256,string,string,string)`.\n mstore(0x00, 0x21ad0683)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,address)`.\n mstore(0x00, 0xed8f28f6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,bool)`.\n mstore(0x00, 0xb59dbd60)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,uint256)`.\n mstore(0x00, 0x8ef3f399)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,address,string)`.\n mstore(0x00, 0x800a1c67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,address)`.\n mstore(0x00, 0x223603bd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,bool)`.\n mstore(0x00, 0x79884c2b)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,uint256)`.\n mstore(0x00, 0x3e9f866a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,bool,string)`.\n mstore(0x00, 0x0454c079)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,address)`.\n mstore(0x00, 0x63fb8bc5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,bool)`.\n mstore(0x00, 0xfc4845f0)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,uint256)`.\n mstore(0x00, 0xf8f51b1e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,uint256,string)`.\n mstore(0x00, 0x5a477632)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,address)`.\n mstore(0x00, 0xaabc9a31)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,bool)`.\n mstore(0x00, 0x5f15d28c)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,uint256)`.\n mstore(0x00, 0x91d1112e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,address,string,string)`.\n mstore(0x00, 0x245986f2)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,address)`.\n mstore(0x00, 0x33e9dd1d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,bool)`.\n mstore(0x00, 0x958c28c6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,uint256)`.\n mstore(0x00, 0x5d08bb05)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,address,string)`.\n mstore(0x00, 0x2d8e33a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,address)`.\n mstore(0x00, 0x7190a529)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,bool)`.\n mstore(0x00, 0x895af8c5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,uint256)`.\n mstore(0x00, 0x8e3f78a9)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,bool,string)`.\n mstore(0x00, 0x9d22d5dd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,address)`.\n mstore(0x00, 0x935e09bf)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,bool)`.\n mstore(0x00, 0x8af7cf8a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,uint256)`.\n mstore(0x00, 0x64b5bb67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,uint256,string)`.\n mstore(0x00, 0x742d6ee7)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,address)`.\n mstore(0x00, 0xe0625b29)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,bool)`.\n mstore(0x00, 0x3f8a701d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,uint256)`.\n mstore(0x00, 0x24f91465)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,bool,string,string)`.\n mstore(0x00, 0xa826caeb)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,address)`.\n mstore(0x00, 0x5ea2b7ae)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,bool)`.\n mstore(0x00, 0x82112a42)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,uint256)`.\n mstore(0x00, 0x4f04fdc6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,address,string)`.\n mstore(0x00, 0x9ffb2f93)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,address)`.\n mstore(0x00, 0xe0e95b98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,bool)`.\n mstore(0x00, 0x354c36d6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,uint256)`.\n mstore(0x00, 0xe41b6f6f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,bool,string)`.\n mstore(0x00, 0xabf73a98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,address)`.\n mstore(0x00, 0xe21de278)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,bool)`.\n mstore(0x00, 0x7626db92)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,uint256)`.\n mstore(0x00, 0xa7a87853)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,uint256,string)`.\n mstore(0x00, 0x854b3496)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,address)`.\n mstore(0x00, 0x7c4632a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,bool)`.\n mstore(0x00, 0x7d24491d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,uint256)`.\n mstore(0x00, 0xc67ea9d1)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,uint256,string,string)`.\n mstore(0x00, 0x5ab84e1f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,address)`.\n mstore(0x00, 0x439c7bef)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,bool)`.\n mstore(0x00, 0x5ccd4e37)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,uint256)`.\n mstore(0x00, 0x7cc3c607)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,address,string)`.\n mstore(0x00, 0xeb1bff80)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,address)`.\n mstore(0x00, 0xc371c7db)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,bool)`.\n mstore(0x00, 0x40785869)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,uint256)`.\n mstore(0x00, 0xd6aefad2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,bool,string)`.\n mstore(0x00, 0x5e84b0ea)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,address)`.\n mstore(0x00, 0x1023f7b2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,bool)`.\n mstore(0x00, 0xc3a8a654)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,uint256)`.\n mstore(0x00, 0xf45d7d2c)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,uint256,string)`.\n mstore(0x00, 0x5d1a971a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,address)`.\n mstore(0x00, 0x6d572f44)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,bool)`.\n mstore(0x00, 0x2c1754ed)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,uint256)`.\n mstore(0x00, 0x8eafb02b)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n bytes32 m11;\n bytes32 m12;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n m11 := mload(0x160)\n m12 := mload(0x180)\n // Selector of `log(string,string,string,string)`.\n mstore(0x00, 0xde68f20a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, 0x140)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n writeString(0x160, p3)\n }\n _sendLogPayload(0x1c, 0x184);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n mstore(0x160, m11)\n mstore(0x180, m12)\n }\n }\n}\n" + }, + "forge-std/StdAssertions.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdAssertions {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n event log(string);\n event logs(bytes);\n\n event log_address(address);\n event log_bytes32(bytes32);\n event log_int(int256);\n event log_uint(uint256);\n event log_bytes(bytes);\n event log_string(string);\n\n event log_named_address(string key, address val);\n event log_named_bytes32(string key, bytes32 val);\n event log_named_decimal_int(string key, int256 val, uint256 decimals);\n event log_named_decimal_uint(string key, uint256 val, uint256 decimals);\n event log_named_int(string key, int256 val);\n event log_named_uint(string key, uint256 val);\n event log_named_bytes(string key, bytes val);\n event log_named_string(string key, string val);\n\n event log_array(uint256[] val);\n event log_array(int256[] val);\n event log_array(address[] val);\n event log_named_array(string key, uint256[] val);\n event log_named_array(string key, int256[] val);\n event log_named_array(string key, address[] val);\n\n bool private _failed;\n\n function failed() public view returns (bool) {\n if (_failed) {\n return _failed;\n } else {\n return vm.load(address(vm), bytes32(\"failed\")) != bytes32(0);\n }\n }\n\n function fail() internal virtual {\n vm.store(address(vm), bytes32(\"failed\"), bytes32(uint256(1)));\n _failed = true;\n }\n\n function assertTrue(bool data) internal pure virtual {\n vm.assertTrue(data);\n }\n\n function assertTrue(bool data, string memory err) internal pure virtual {\n vm.assertTrue(data, err);\n }\n\n function assertFalse(bool data) internal pure virtual {\n vm.assertFalse(data);\n }\n\n function assertFalse(bool data, string memory err) internal pure virtual {\n vm.assertFalse(data, err);\n }\n\n function assertEq(bool left, bool right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(int256 left, int256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(address left, address right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address left, address right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertEq(string memory left, string memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n // Legacy helper\n function assertEqUint(uint256 left, uint256 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertNotEq(bool left, bool right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(int256 left, int256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(address left, address right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address left, address right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertNotEq(string memory left, string memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertLt(uint256 left, uint256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertLt(int256 left, int256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertGt(uint256 left, uint256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertGt(int256 left, int256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertLe(uint256 left, uint256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertLe(int256 left, int256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertGe(uint256 left, uint256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertGe(int256 left, int256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n // Inherited from DSTest, not used but kept for backwards-compatibility\n function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {\n return keccak256(left) == keccak256(right);\n }\n\n function assertEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {\n assertEqCall(target, callDataA, target, callDataB, true);\n }\n\n function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)\n internal\n virtual\n {\n assertEqCall(targetA, callDataA, targetB, callDataB, true);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)\n internal\n virtual\n {\n assertEqCall(target, callDataA, target, callDataB, strictRevertData);\n }\n\n function assertEqCall(\n address targetA,\n bytes memory callDataA,\n address targetB,\n bytes memory callDataB,\n bool strictRevertData\n ) internal virtual {\n (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);\n (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);\n\n if (successA && successB) {\n assertEq(returnDataA, returnDataB, \"Call return data does not match\");\n }\n\n if (!successA && !successB && strictRevertData) {\n assertEq(returnDataA, returnDataB, \"Call revert data does not match\");\n }\n\n if (!successA && successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call revert data\", returnDataA);\n emit log_named_bytes(\" Right call return data\", returnDataB);\n revert(\"assertion failed\");\n }\n\n if (successA && !successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call return data\", returnDataA);\n emit log_named_bytes(\" Right call revert data\", returnDataB);\n revert(\"assertion failed\");\n }\n }\n}\n" + }, + "forge-std/StdChains.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n/**\n * StdChains provides information about EVM compatible chains that can be used in scripts/tests.\n * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are\n * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of\n * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the\n * alias used in this contract, which can be found as the first argument to the\n * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.\n *\n * There are two main ways to use this contract:\n * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or\n * `setChain(string memory chainAlias, Chain memory chain)`\n * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.\n *\n * The first time either of those are used, chains are initialized with the default set of RPC URLs.\n * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in\n * `defaultRpcUrls`.\n *\n * The `setChain` function is straightforward, and it simply saves off the given chain data.\n *\n * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say\n * we want to retrieve the RPC URL for `mainnet`:\n * - If you have specified data with `setChain`, it will return that.\n * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it\n * is valid (e.g. a URL is specified, or an environment variable is given and exists).\n * - If neither of the above conditions is met, the default data is returned.\n *\n * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.\n */\nabstract contract StdChains {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n bool private stdChainsInitialized;\n\n struct ChainData {\n string name;\n uint256 chainId;\n string rpcUrl;\n }\n\n struct Chain {\n // The chain name.\n string name;\n // The chain's Chain ID.\n uint256 chainId;\n // The chain's alias. (i.e. what gets specified in `foundry.toml`).\n string chainAlias;\n // A default RPC endpoint for this chain.\n // NOTE: This default RPC URL is included for convenience to facilitate quick tests and\n // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy\n // usage as you will be throttled and this is a disservice to others who need this endpoint.\n string rpcUrl;\n }\n\n // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.\n mapping(string => Chain) private chains;\n // Maps from the chain's alias to it's default RPC URL.\n mapping(string => string) private defaultRpcUrls;\n // Maps from a chain ID to it's alias.\n mapping(uint256 => string) private idToAlias;\n\n bool private fallbackToDefaultRpcUrls = true;\n\n // The RPC URL will be fetched from config or defaultRpcUrls if possible.\n function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {\n require(bytes(chainAlias).length != 0, \"StdChains getChain(string): Chain alias cannot be the empty string.\");\n\n initializeStdChains();\n chain = chains[chainAlias];\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(string): Chain with alias \\\"\", chainAlias, \"\\\" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {\n require(chainId != 0, \"StdChains getChain(uint256): Chain ID cannot be 0.\");\n initializeStdChains();\n string memory chainAlias = idToAlias[chainId];\n\n chain = chains[chainAlias];\n\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(uint256): Chain with ID \", vm.toString(chainId), \" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, ChainData memory chain) internal virtual {\n require(\n bytes(chainAlias).length != 0,\n \"StdChains setChain(string,ChainData): Chain alias cannot be the empty string.\"\n );\n\n require(chain.chainId != 0, \"StdChains setChain(string,ChainData): Chain ID cannot be 0.\");\n\n initializeStdChains();\n string memory foundAlias = idToAlias[chain.chainId];\n\n require(\n bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),\n string(\n abi.encodePacked(\n \"StdChains setChain(string,ChainData): Chain ID \",\n vm.toString(chain.chainId),\n \" already used by \\\"\",\n foundAlias,\n \"\\\".\"\n )\n )\n );\n\n uint256 oldChainId = chains[chainAlias].chainId;\n delete idToAlias[oldChainId];\n\n chains[chainAlias] =\n Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});\n idToAlias[chain.chainId] = chainAlias;\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, Chain memory chain) internal virtual {\n setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));\n }\n\n function _toUpper(string memory str) private pure returns (string memory) {\n bytes memory strb = bytes(str);\n bytes memory copy = new bytes(strb.length);\n for (uint256 i = 0; i < strb.length; i++) {\n bytes1 b = strb[i];\n if (b >= 0x61 && b <= 0x7A) {\n copy[i] = bytes1(uint8(b) - 32);\n } else {\n copy[i] = b;\n }\n }\n return string(copy);\n }\n\n // lookup rpcUrl, in descending order of priority:\n // current -> config (foundry.toml) -> environment variable -> default\n function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)\n private\n view\n returns (Chain memory)\n {\n if (bytes(chain.rpcUrl).length == 0) {\n try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {\n chain.rpcUrl = configRpcUrl;\n } catch (bytes memory err) {\n string memory envName = string(abi.encodePacked(_toUpper(chainAlias), \"_RPC_URL\"));\n if (fallbackToDefaultRpcUrls) {\n chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);\n } else {\n chain.rpcUrl = vm.envString(envName);\n }\n // Distinguish 'not found' from 'cannot read'\n // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions\n bytes memory oldNotFoundError =\n abi.encodeWithSignature(\"CheatCodeError\", string(abi.encodePacked(\"invalid rpc url \", chainAlias)));\n bytes memory newNotFoundError = abi.encodeWithSignature(\n \"CheatcodeError(string)\", string(abi.encodePacked(\"invalid rpc url: \", chainAlias))\n );\n bytes32 errHash = keccak256(err);\n if (\n (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))\n || bytes(chain.rpcUrl).length == 0\n ) {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, err), mload(err))\n }\n }\n }\n }\n return chain;\n }\n\n function setFallbackToDefaultRpcUrls(bool useDefault) internal {\n fallbackToDefaultRpcUrls = useDefault;\n }\n\n function initializeStdChains() private {\n if (stdChainsInitialized) return;\n\n stdChainsInitialized = true;\n\n // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`\n setChainWithDefaultRpcUrl(\"anvil\", ChainData(\"Anvil\", 31337, \"http://127.0.0.1:8545\"));\n setChainWithDefaultRpcUrl(\n \"mainnet\", ChainData(\"Mainnet\", 1, \"https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP\")\n );\n setChainWithDefaultRpcUrl(\n \"sepolia\", ChainData(\"Sepolia\", 11155111, \"https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001\")\n );\n setChainWithDefaultRpcUrl(\"holesky\", ChainData(\"Holesky\", 17000, \"https://rpc.holesky.ethpandaops.io\"));\n setChainWithDefaultRpcUrl(\"optimism\", ChainData(\"Optimism\", 10, \"https://mainnet.optimism.io\"));\n setChainWithDefaultRpcUrl(\n \"optimism_sepolia\", ChainData(\"Optimism Sepolia\", 11155420, \"https://sepolia.optimism.io\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_one\", ChainData(\"Arbitrum One\", 42161, \"https://arb1.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\n \"arbitrum_one_sepolia\", ChainData(\"Arbitrum One Sepolia\", 421614, \"https://sepolia-rollup.arbitrum.io/rpc\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_nova\", ChainData(\"Arbitrum Nova\", 42170, \"https://nova.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\"polygon\", ChainData(\"Polygon\", 137, \"https://polygon-rpc.com\"));\n setChainWithDefaultRpcUrl(\n \"polygon_amoy\", ChainData(\"Polygon Amoy\", 80002, \"https://rpc-amoy.polygon.technology\")\n );\n setChainWithDefaultRpcUrl(\"avalanche\", ChainData(\"Avalanche\", 43114, \"https://api.avax.network/ext/bc/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"avalanche_fuji\", ChainData(\"Avalanche Fuji\", 43113, \"https://api.avax-test.network/ext/bc/C/rpc\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain\", ChainData(\"BNB Smart Chain\", 56, \"https://bsc-dataseed1.binance.org\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain_testnet\",\n ChainData(\"BNB Smart Chain Testnet\", 97, \"https://rpc.ankr.com/bsc_testnet_chapel\")\n );\n setChainWithDefaultRpcUrl(\"gnosis_chain\", ChainData(\"Gnosis Chain\", 100, \"https://rpc.gnosischain.com\"));\n setChainWithDefaultRpcUrl(\"moonbeam\", ChainData(\"Moonbeam\", 1284, \"https://rpc.api.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\n \"moonriver\", ChainData(\"Moonriver\", 1285, \"https://rpc.api.moonriver.moonbeam.network\")\n );\n setChainWithDefaultRpcUrl(\"moonbase\", ChainData(\"Moonbase\", 1287, \"https://rpc.testnet.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\"base_sepolia\", ChainData(\"Base Sepolia\", 84532, \"https://sepolia.base.org\"));\n setChainWithDefaultRpcUrl(\"base\", ChainData(\"Base\", 8453, \"https://mainnet.base.org\"));\n setChainWithDefaultRpcUrl(\"blast_sepolia\", ChainData(\"Blast Sepolia\", 168587773, \"https://sepolia.blast.io\"));\n setChainWithDefaultRpcUrl(\"blast\", ChainData(\"Blast\", 81457, \"https://rpc.blast.io\"));\n setChainWithDefaultRpcUrl(\"fantom_opera\", ChainData(\"Fantom Opera\", 250, \"https://rpc.ankr.com/fantom/\"));\n setChainWithDefaultRpcUrl(\n \"fantom_opera_testnet\", ChainData(\"Fantom Opera Testnet\", 4002, \"https://rpc.ankr.com/fantom_testnet/\")\n );\n setChainWithDefaultRpcUrl(\"fraxtal\", ChainData(\"Fraxtal\", 252, \"https://rpc.frax.com\"));\n setChainWithDefaultRpcUrl(\"fraxtal_testnet\", ChainData(\"Fraxtal Testnet\", 2522, \"https://rpc.testnet.frax.com\"));\n setChainWithDefaultRpcUrl(\n \"berachain_bartio_testnet\", ChainData(\"Berachain bArtio Testnet\", 80084, \"https://bartio.rpc.berachain.com\")\n );\n setChainWithDefaultRpcUrl(\"flare\", ChainData(\"Flare\", 14, \"https://flare-api.flare.network/ext/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"flare_coston2\", ChainData(\"Flare Coston2\", 114, \"https://coston2-api.flare.network/ext/C/rpc\")\n );\n }\n\n // set chain info, with priority to chainAlias' rpc url in foundry.toml\n function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {\n string memory rpcUrl = chain.rpcUrl;\n defaultRpcUrls[chainAlias] = rpcUrl;\n chain.rpcUrl = \"\";\n setChain(chainAlias, chain);\n chain.rpcUrl = rpcUrl; // restore argument\n }\n}\n" + }, + "forge-std/StdCheats.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {console2} from \"./console2.sol\";\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdCheatsSafe {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n bool private gasMeteringOff;\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawTx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n // json value name = function\n string functionSig;\n bytes32 hash;\n // json value name = tx\n RawTx1559Detail txDetail;\n // json value name = type\n string opcode;\n }\n\n struct RawTx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n bytes gas;\n bytes nonce;\n address to;\n bytes txType;\n bytes value;\n }\n\n struct Tx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n bytes32 hash;\n Tx1559Detail txDetail;\n string opcode;\n }\n\n struct Tx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n uint256 gas;\n uint256 nonce;\n address to;\n uint256 txType;\n uint256 value;\n }\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct TxLegacy {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n string hash;\n string opcode;\n TxDetailLegacy transaction;\n }\n\n struct TxDetailLegacy {\n AccessList[] accessList;\n uint256 chainId;\n bytes data;\n address from;\n uint256 gas;\n uint256 gasPrice;\n bytes32 hash;\n uint256 nonce;\n bytes1 opcode;\n bytes32 r;\n bytes32 s;\n uint256 txType;\n address to;\n uint8 v;\n uint256 value;\n }\n\n struct AccessList {\n address accessAddress;\n bytes32[] storageKeys;\n }\n\n // Data structures to parse Receipt objects from the broadcast artifact.\n // The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawReceipt {\n bytes32 blockHash;\n bytes blockNumber;\n address contractAddress;\n bytes cumulativeGasUsed;\n bytes effectiveGasPrice;\n address from;\n bytes gasUsed;\n RawReceiptLog[] logs;\n bytes logsBloom;\n bytes status;\n address to;\n bytes32 transactionHash;\n bytes transactionIndex;\n }\n\n struct Receipt {\n bytes32 blockHash;\n uint256 blockNumber;\n address contractAddress;\n uint256 cumulativeGasUsed;\n uint256 effectiveGasPrice;\n address from;\n uint256 gasUsed;\n ReceiptLog[] logs;\n bytes logsBloom;\n uint256 status;\n address to;\n bytes32 transactionHash;\n uint256 transactionIndex;\n }\n\n // Data structures to parse the entire broadcast artifact, assuming the\n // transactions conform to EIP1559.\n\n struct EIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n Receipt[] receipts;\n uint256 timestamp;\n Tx1559[] transactions;\n TxReturn[] txReturns;\n }\n\n struct RawEIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n RawReceipt[] receipts;\n TxReturn[] txReturns;\n uint256 timestamp;\n RawTx1559[] transactions;\n }\n\n struct RawReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n bytes blockNumber;\n bytes data;\n bytes logIndex;\n bool removed;\n bytes32[] topics;\n bytes32 transactionHash;\n bytes transactionIndex;\n bytes transactionLogIndex;\n }\n\n struct ReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n uint256 blockNumber;\n bytes data;\n uint256 logIndex;\n bytes32[] topics;\n uint256 transactionIndex;\n uint256 transactionLogIndex;\n bool removed;\n }\n\n struct TxReturn {\n string internalType;\n string value;\n }\n\n struct Account {\n address addr;\n uint256 key;\n }\n\n enum AddressType {\n Payable,\n NonPayable,\n ZeroAddress,\n Precompile,\n ForgeAddress\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n function assumeNotBlacklisted(address token, address addr) internal view virtual {\n // Nothing to check if `token` is not a contract.\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.\");\n\n bool success;\n bytes memory returnData;\n\n // 4-byte selector for `isBlacklisted(address)`, used by USDC.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n\n // 4-byte selector for `isBlackListed(address)`, used by USDT.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for\n // backwards compatibility, since this name was used in the original PR which already has\n // a release. This function can be removed in a future release once we want a breaking change.\n function assumeNoBlacklisted(address token, address addr) internal view virtual {\n assumeNotBlacklisted(token, addr);\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {\n if (addressType == AddressType.Payable) {\n assumeNotPayable(addr);\n } else if (addressType == AddressType.NonPayable) {\n assumePayable(addr);\n } else if (addressType == AddressType.ZeroAddress) {\n assumeNotZeroAddress(addr);\n } else if (addressType == AddressType.Precompile) {\n assumeNotPrecompile(addr);\n } else if (addressType == AddressType.ForgeAddress) {\n assumeNotForgeAddress(addr);\n }\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3,\n AddressType addressType4\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n assumeAddressIsNot(addr, addressType4);\n }\n\n // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to\n // `addr` and checking the `success` return value.\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used.\n function _isPayable(address addr) private returns (bool) {\n require(\n addr.balance < UINT256_MAX,\n \"StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds\"\n );\n uint256 origBalanceTest = address(this).balance;\n uint256 origBalanceAddr = address(addr).balance;\n\n vm.deal(address(this), 1);\n (bool success,) = payable(addr).call{value: 1}(\"\");\n\n // reset balances\n vm.deal(address(this), origBalanceTest);\n vm.deal(addr, origBalanceAddr);\n\n return success;\n }\n\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used. See the\n // `_isPayable` method for more information.\n function assumePayable(address addr) internal virtual {\n vm.assume(_isPayable(addr));\n }\n\n function assumeNotPayable(address addr) internal virtual {\n vm.assume(!_isPayable(addr));\n }\n\n function assumeNotZeroAddress(address addr) internal pure virtual {\n vm.assume(addr != address(0));\n }\n\n function assumeNotPrecompile(address addr) internal pure virtual {\n assumeNotPrecompile(addr, _pureChainId());\n }\n\n function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {\n // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific\n // address), but the same rationale for excluding them applies so we include those too.\n\n // These are reserved by Ethereum and may be on all EVM-compatible chains.\n vm.assume(addr < address(0x1) || addr > address(0xff));\n\n // forgefmt: disable-start\n if (chainId == 10 || chainId == 420) {\n // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21\n vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));\n } else if (chainId == 42161 || chainId == 421613) {\n // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains\n vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));\n } else if (chainId == 43114 || chainId == 43113) {\n // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59\n vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));\n vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));\n vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));\n }\n // forgefmt: disable-end\n }\n\n function assumeNotForgeAddress(address addr) internal pure virtual {\n // vm, console, and Create2Deployer addresses\n vm.assume(\n addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67\n && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C\n );\n }\n\n function readEIP1559ScriptArtifact(string memory path)\n internal\n view\n virtual\n returns (EIP1559ScriptArtifact memory)\n {\n string memory data = vm.readFile(path);\n bytes memory parsedData = vm.parseJson(data);\n RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));\n EIP1559ScriptArtifact memory artifact;\n artifact.libraries = rawArtifact.libraries;\n artifact.path = rawArtifact.path;\n artifact.timestamp = rawArtifact.timestamp;\n artifact.pending = rawArtifact.pending;\n artifact.txReturns = rawArtifact.txReturns;\n artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);\n artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);\n return artifact;\n }\n\n function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {\n Tx1559[] memory txs = new Tx1559[](rawTxs.length);\n for (uint256 i; i < rawTxs.length; i++) {\n txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);\n }\n return txs;\n }\n\n function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {\n Tx1559 memory transaction;\n transaction.arguments = rawTx.arguments;\n transaction.contractName = rawTx.contractName;\n transaction.functionSig = rawTx.functionSig;\n transaction.hash = rawTx.hash;\n transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);\n transaction.opcode = rawTx.opcode;\n return transaction;\n }\n\n function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)\n internal\n pure\n virtual\n returns (Tx1559Detail memory)\n {\n Tx1559Detail memory txDetail;\n txDetail.data = rawDetail.data;\n txDetail.from = rawDetail.from;\n txDetail.to = rawDetail.to;\n txDetail.nonce = _bytesToUint(rawDetail.nonce);\n txDetail.txType = _bytesToUint(rawDetail.txType);\n txDetail.value = _bytesToUint(rawDetail.value);\n txDetail.gas = _bytesToUint(rawDetail.gas);\n txDetail.accessList = rawDetail.accessList;\n return txDetail;\n }\n\n function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".transactions\");\n RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));\n return rawToConvertedEIPTx1559s(rawTxs);\n }\n\n function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".transactions[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));\n return rawToConvertedEIPTx1559(rawTx);\n }\n\n // Analogous to readTransactions, but for receipts.\n function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".receipts\");\n RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));\n return rawToConvertedReceipts(rawReceipts);\n }\n\n function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".receipts[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));\n return rawToConvertedReceipt(rawReceipt);\n }\n\n function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {\n Receipt[] memory receipts = new Receipt[](rawReceipts.length);\n for (uint256 i; i < rawReceipts.length; i++) {\n receipts[i] = rawToConvertedReceipt(rawReceipts[i]);\n }\n return receipts;\n }\n\n function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {\n Receipt memory receipt;\n receipt.blockHash = rawReceipt.blockHash;\n receipt.to = rawReceipt.to;\n receipt.from = rawReceipt.from;\n receipt.contractAddress = rawReceipt.contractAddress;\n receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);\n receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);\n receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);\n receipt.status = _bytesToUint(rawReceipt.status);\n receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);\n receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);\n receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);\n receipt.logsBloom = rawReceipt.logsBloom;\n receipt.transactionHash = rawReceipt.transactionHash;\n return receipt;\n }\n\n function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)\n internal\n pure\n virtual\n returns (ReceiptLog[] memory)\n {\n ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);\n for (uint256 i; i < rawLogs.length; i++) {\n logs[i].logAddress = rawLogs[i].logAddress;\n logs[i].blockHash = rawLogs[i].blockHash;\n logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);\n logs[i].data = rawLogs[i].data;\n logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);\n logs[i].topics = rawLogs[i].topics;\n logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);\n logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);\n logs[i].removed = rawLogs[i].removed;\n }\n return logs;\n }\n\n // Deploy a contract by fetching the contract bytecode from\n // the artifacts directory\n // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`\n function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes): Deployment failed.\");\n }\n\n function deployCode(string memory what) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string): Deployment failed.\");\n }\n\n /// @dev deploy contract with value on construction\n function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes,uint256): Deployment failed.\");\n }\n\n function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,uint256): Deployment failed.\");\n }\n\n // creates a labeled address and the corresponding private key\n function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {\n privateKey = uint256(keccak256(abi.encodePacked(name)));\n addr = vm.addr(privateKey);\n vm.label(addr, name);\n }\n\n // creates a labeled address\n function makeAddr(string memory name) internal virtual returns (address addr) {\n (addr,) = makeAddrAndKey(name);\n }\n\n // Destroys an account immediately, sending the balance to beneficiary.\n // Destroying means: balance will be zero, code will be empty, and nonce will be 0\n // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce\n // only after tx ends, this will run immediately.\n function destroyAccount(address who, address beneficiary) internal virtual {\n uint256 currBalance = who.balance;\n vm.etch(who, abi.encode());\n vm.deal(who, 0);\n vm.resetNonce(who);\n\n uint256 beneficiaryBalance = beneficiary.balance;\n vm.deal(beneficiary, currBalance + beneficiaryBalance);\n }\n\n // creates a struct containing both a labeled address and the corresponding private key\n function makeAccount(string memory name) internal virtual returns (Account memory account) {\n (account.addr, account.key) = makeAddrAndKey(name);\n }\n\n function deriveRememberKey(string memory mnemonic, uint32 index)\n internal\n virtual\n returns (address who, uint256 privateKey)\n {\n privateKey = vm.deriveKey(mnemonic, index);\n who = vm.rememberKey(privateKey);\n }\n\n function _bytesToUint(bytes memory b) private pure returns (uint256) {\n require(b.length <= 32, \"StdCheats _bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n function isFork() internal view virtual returns (bool status) {\n try vm.activeFork() {\n status = true;\n } catch (bytes memory) {}\n }\n\n modifier skipWhenForking() {\n if (!isFork()) {\n _;\n }\n }\n\n modifier skipWhenNotForking() {\n if (isFork()) {\n _;\n }\n }\n\n modifier noGasMetering() {\n vm.pauseGasMetering();\n // To prevent turning gas monitoring back on with nested functions that use this modifier,\n // we check if gasMetering started in the off position. If it did, we don't want to turn\n // it back on until we exit the top level function that used the modifier\n //\n // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.\n // funcA will have `gasStartedOff` as false, funcB will have it as true,\n // so we only turn metering back on at the end of the funcA\n bool gasStartedOff = gasMeteringOff;\n gasMeteringOff = true;\n\n _;\n\n // if gas metering was on when this modifier was called, turn it back on at the end\n if (!gasStartedOff) {\n gasMeteringOff = false;\n vm.resumeGasMetering();\n }\n }\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n\n// Wrappers around cheatcodes to avoid footguns\nabstract contract StdCheats is StdCheatsSafe {\n using stdStorage for StdStorage;\n\n StdStorage private stdstore;\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n\n // Skip forward or rewind time by the specified number of seconds\n function skip(uint256 time) internal virtual {\n vm.warp(block.timestamp + time);\n }\n\n function rewind(uint256 time) internal virtual {\n vm.warp(block.timestamp - time);\n }\n\n // Setup a prank from an address that has some ether\n function hoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender, origin);\n }\n\n function hoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender, origin);\n }\n\n // Start perpetual prank from an address that has some ether\n function startHoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender);\n }\n\n function startHoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender);\n }\n\n // Start perpetual prank from an address that has some ether\n // tx.origin is set to the origin parameter\n function startHoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender, origin);\n }\n\n function startHoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender, origin);\n }\n\n function changePrank(address msgSender) internal virtual {\n console2_log_StdCheats(\"changePrank is deprecated. Please use vm.startPrank instead.\");\n vm.stopPrank();\n vm.startPrank(msgSender);\n }\n\n function changePrank(address msgSender, address txOrigin) internal virtual {\n vm.stopPrank();\n vm.startPrank(msgSender, txOrigin);\n }\n\n // The same as Vm's `deal`\n // Use the alternative signature for ERC20 tokens\n function deal(address to, uint256 give) internal virtual {\n vm.deal(to, give);\n }\n\n // Set the balance of an account for any ERC20 token\n // Use the alternative signature to update `totalSupply`\n function deal(address token, address to, uint256 give) internal virtual {\n deal(token, to, give, false);\n }\n\n // Set the balance of an account for any ERC1155 token\n // Use the alternative signature to update `totalSupply`\n function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {\n dealERC1155(token, to, id, give, false);\n }\n\n function deal(address token, address to, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0x18160ddd).checked_write(totSup);\n }\n }\n\n function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));\n require(\n totSupData.length != 0,\n \"StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply.\"\n );\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);\n }\n }\n\n function dealERC721(address token, address to, uint256 id) internal virtual {\n // check if token id is already minted and the actual owner.\n (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));\n require(successMinted, \"StdCheats deal(address,address,uint,bool): id not minted.\");\n\n // get owner current balance\n (, bytes memory fromBalData) =\n token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));\n uint256 fromPrevBal = abi.decode(fromBalData, (uint256));\n\n // get new user current balance\n (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 toPrevBal = abi.decode(toBalData, (uint256));\n\n // update balances\n stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);\n\n // update owner\n stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);\n }\n\n function deployCodeTo(string memory what, address where) internal virtual {\n deployCodeTo(what, \"\", 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {\n deployCodeTo(what, args, 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {\n bytes memory creationCode = vm.getCode(what);\n vm.etch(where, abi.encodePacked(creationCode, args));\n (bool success, bytes memory runtimeBytecode) = where.call{value: value}(\"\");\n require(success, \"StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.\");\n vm.etch(where, runtimeBytecode);\n }\n\n // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.\n function console2_log_StdCheats(string memory p0) private view {\n (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature(\"log(string)\", p0));\n status;\n }\n}\n" + }, + "forge-std/StdError.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdError {\n bytes public constant assertionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x01);\n bytes public constant arithmeticError = abi.encodeWithSignature(\"Panic(uint256)\", 0x11);\n bytes public constant divisionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x12);\n bytes public constant enumConversionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x21);\n bytes public constant encodeStorageError = abi.encodeWithSignature(\"Panic(uint256)\", 0x22);\n bytes public constant popError = abi.encodeWithSignature(\"Panic(uint256)\", 0x31);\n bytes public constant indexOOBError = abi.encodeWithSignature(\"Panic(uint256)\", 0x32);\n bytes public constant memOverflowError = abi.encodeWithSignature(\"Panic(uint256)\", 0x41);\n bytes public constant zeroVarError = abi.encodeWithSignature(\"Panic(uint256)\", 0x51);\n}\n" + }, + "forge-std/StdInvariant.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nabstract contract StdInvariant {\n struct FuzzSelector {\n address addr;\n bytes4[] selectors;\n }\n\n struct FuzzArtifactSelector {\n string artifact;\n bytes4[] selectors;\n }\n\n struct FuzzInterface {\n address addr;\n string[] artifacts;\n }\n\n address[] private _excludedContracts;\n address[] private _excludedSenders;\n address[] private _targetedContracts;\n address[] private _targetedSenders;\n\n string[] private _excludedArtifacts;\n string[] private _targetedArtifacts;\n\n FuzzArtifactSelector[] private _targetedArtifactSelectors;\n\n FuzzSelector[] private _excludedSelectors;\n FuzzSelector[] private _targetedSelectors;\n\n FuzzInterface[] private _targetedInterfaces;\n\n // Functions for users:\n // These are intended to be called in tests.\n\n function excludeContract(address newExcludedContract_) internal {\n _excludedContracts.push(newExcludedContract_);\n }\n\n function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {\n _excludedSelectors.push(newExcludedSelector_);\n }\n\n function excludeSender(address newExcludedSender_) internal {\n _excludedSenders.push(newExcludedSender_);\n }\n\n function excludeArtifact(string memory newExcludedArtifact_) internal {\n _excludedArtifacts.push(newExcludedArtifact_);\n }\n\n function targetArtifact(string memory newTargetedArtifact_) internal {\n _targetedArtifacts.push(newTargetedArtifact_);\n }\n\n function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {\n _targetedArtifactSelectors.push(newTargetedArtifactSelector_);\n }\n\n function targetContract(address newTargetedContract_) internal {\n _targetedContracts.push(newTargetedContract_);\n }\n\n function targetSelector(FuzzSelector memory newTargetedSelector_) internal {\n _targetedSelectors.push(newTargetedSelector_);\n }\n\n function targetSender(address newTargetedSender_) internal {\n _targetedSenders.push(newTargetedSender_);\n }\n\n function targetInterface(FuzzInterface memory newTargetedInterface_) internal {\n _targetedInterfaces.push(newTargetedInterface_);\n }\n\n // Functions for forge:\n // These are called by forge to run invariant tests and don't need to be called in tests.\n\n function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {\n excludedArtifacts_ = _excludedArtifacts;\n }\n\n function excludeContracts() public view returns (address[] memory excludedContracts_) {\n excludedContracts_ = _excludedContracts;\n }\n\n function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {\n excludedSelectors_ = _excludedSelectors;\n }\n\n function excludeSenders() public view returns (address[] memory excludedSenders_) {\n excludedSenders_ = _excludedSenders;\n }\n\n function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {\n targetedArtifacts_ = _targetedArtifacts;\n }\n\n function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {\n targetedArtifactSelectors_ = _targetedArtifactSelectors;\n }\n\n function targetContracts() public view returns (address[] memory targetedContracts_) {\n targetedContracts_ = _targetedContracts;\n }\n\n function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {\n targetedSelectors_ = _targetedSelectors;\n }\n\n function targetSenders() public view returns (address[] memory targetedSenders_) {\n targetedSenders_ = _targetedSenders;\n }\n\n function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {\n targetedInterfaces_ = _targetedInterfaces;\n }\n}\n" + }, + "forge-std/StdJson.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing JSON files\n// To parse:\n// ```\n// using stdJson for string;\n// string memory json = vm.readFile(\"\");\n// json.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdJson for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdJson {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory json, string memory key) internal view returns (bool) {\n return vm.keyExistsJson(json, key);\n }\n\n function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJson(json, key);\n }\n\n function readUint(string memory json, string memory key) internal pure returns (uint256) {\n return vm.parseJsonUint(json, key);\n }\n\n function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseJsonUintArray(json, key);\n }\n\n function readInt(string memory json, string memory key) internal pure returns (int256) {\n return vm.parseJsonInt(json, key);\n }\n\n function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {\n return vm.parseJsonIntArray(json, key);\n }\n\n function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {\n return vm.parseJsonBytes32(json, key);\n }\n\n function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseJsonBytes32Array(json, key);\n }\n\n function readString(string memory json, string memory key) internal pure returns (string memory) {\n return vm.parseJsonString(json, key);\n }\n\n function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {\n return vm.parseJsonStringArray(json, key);\n }\n\n function readAddress(string memory json, string memory key) internal pure returns (address) {\n return vm.parseJsonAddress(json, key);\n }\n\n function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {\n return vm.parseJsonAddressArray(json, key);\n }\n\n function readBool(string memory json, string memory key) internal pure returns (bool) {\n return vm.parseJsonBool(json, key);\n }\n\n function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {\n return vm.parseJsonBoolArray(json, key);\n }\n\n function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJsonBytes(json, key);\n }\n\n function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseJsonBytesArray(json, key);\n }\n\n function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(json, key) ? readUint(json, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(json, key) ? readUintArray(json, key) : defaultValue;\n }\n\n function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(json, key) ? readInt(json, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(json, key) ? readIntArray(json, key) : defaultValue;\n }\n\n function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(json, key) ? readBytes32(json, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;\n }\n\n function readStringOr(string memory json, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(json, key) ? readString(json, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(json, key) ? readStringArray(json, key) : defaultValue;\n }\n\n function readAddressOr(string memory json, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(json, key) ? readAddress(json, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;\n }\n\n function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(json, key) ? readBool(json, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;\n }\n\n function readBytesOr(string memory json, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(json, key) ? readBytes(json, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeJson(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeJson(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdMath {\n int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;\n\n function abs(int256 a) internal pure returns (uint256) {\n // Required or it will fail when `a = type(int256).min`\n if (a == INT256_MIN) {\n return 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n }\n\n return uint256(a > 0 ? a : -a);\n }\n\n function delta(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a - b : b - a;\n }\n\n function delta(int256 a, int256 b) internal pure returns (uint256) {\n // a and b are of the same sign\n // this works thanks to two's complement, the left-most bit is the sign bit\n if ((a ^ b) > -1) {\n return delta(abs(a), abs(b));\n }\n\n // a and b are of opposite signs\n return abs(a) + abs(b);\n }\n\n function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n\n return absDelta * 1e18 / b;\n }\n\n function percentDelta(int256 a, int256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n uint256 absB = abs(b);\n\n return absDelta * 1e18 / absB;\n }\n}\n" + }, + "forge-std/StdStorage.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {Vm} from \"./Vm.sol\";\n\nstruct FindData {\n uint256 slot;\n uint256 offsetLeft;\n uint256 offsetRight;\n bool found;\n}\n\nstruct StdStorage {\n mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;\n bytes32[] _keys;\n bytes4 _sig;\n uint256 _depth;\n address _target;\n bytes32 _set;\n bool _enable_packed_slots;\n bytes _calldata;\n}\n\nlibrary stdStorageSafe {\n event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);\n event WARNING_UninitedSlot(address who, uint256 slot);\n\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return bytes4(keccak256(bytes(sigStr)));\n }\n\n function getCallParams(StdStorage storage self) internal view returns (bytes memory) {\n if (self._calldata.length == 0) {\n return flatten(self._keys);\n } else {\n return self._calldata;\n }\n }\n\n // Calls target contract with configured parameters\n function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {\n bytes memory cald = abi.encodePacked(self._sig, getCallParams(self));\n (bool success, bytes memory rdat) = self._target.staticcall(cald);\n bytes32 result = bytesToBytes32(rdat, 32 * self._depth);\n\n return (success, result);\n }\n\n // Tries mutating slot value to determine if the targeted value is stored in it.\n // If current value is 0, then we are setting slot value to type(uint256).max\n // Otherwise, we set it to 0. That way, return value should always be affected.\n function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n (bool success, bytes32 prevReturnValue) = callTarget(self);\n\n bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);\n vm.store(self._target, slot, testVal);\n\n (, bytes32 newReturnValue) = callTarget(self);\n\n vm.store(self._target, slot, prevSlotValue);\n\n return (success && (prevReturnValue != newReturnValue));\n }\n\n // Tries setting one of the bits in slot to 1 until return value changes.\n // Index of resulted bit is an offset packed slot has from left/right side\n function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {\n for (uint256 offset = 0; offset < 256; offset++) {\n uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);\n vm.store(self._target, slot, bytes32(valueToPut));\n\n (bool success, bytes32 data) = callTarget(self);\n\n if (success && (uint256(data) > 0)) {\n return (true, offset);\n }\n }\n return (false, 0);\n }\n\n function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n\n (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);\n (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);\n\n // `findOffset` may mutate slot value, so we are setting it to initial value\n vm.store(self._target, slot, prevSlotValue);\n return (foundLeft && foundRight, offsetLeft, offsetRight);\n }\n\n function find(StdStorage storage self) internal returns (FindData storage) {\n return find(self, true);\n }\n\n /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against\n // slot complexity:\n // if flat, will be bytes32(uint256(uint));\n // if map, will be keccak256(abi.encode(key, uint(slot)));\n // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));\n // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);\n function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = getCallParams(self);\n\n // calldata to test against\n if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n vm.record();\n (, bytes32 callResult) = callTarget(self);\n (bytes32[] memory reads,) = vm.accesses(address(who));\n\n if (reads.length == 0) {\n revert(\"stdStorage find(StdStorage): No storage use detected for target.\");\n } else {\n for (uint256 i = reads.length; --i >= 0;) {\n bytes32 prev = vm.load(who, reads[i]);\n if (prev == bytes32(0)) {\n emit WARNING_UninitedSlot(who, uint256(reads[i]));\n }\n\n if (!checkSlotMutatesCall(self, reads[i])) {\n continue;\n }\n\n (uint256 offsetLeft, uint256 offsetRight) = (0, 0);\n\n if (self._enable_packed_slots) {\n bool found;\n (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);\n if (!found) {\n continue;\n }\n }\n\n // Check that value between found offsets is equal to the current call result\n uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;\n\n if (uint256(callResult) != curVal) {\n continue;\n }\n\n emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =\n FindData(uint256(reads[i]), offsetLeft, offsetRight, true);\n break;\n }\n }\n\n require(\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,\n \"stdStorage find(StdStorage): Slot(s) not found.\"\n );\n\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n self._target = _target;\n return self;\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n self._sig = _sig;\n return self;\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n self._sig = sigs(_sig);\n return self;\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n self._calldata = _calldata;\n return self;\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n self._keys.push(bytes32(uint256(uint160(who))));\n return self;\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n self._keys.push(bytes32(amt));\n return self;\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n self._keys.push(key);\n return self;\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n self._enable_packed_slots = true;\n return self;\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n self._depth = _depth;\n return self;\n }\n\n function read(StdStorage storage self) private returns (bytes memory) {\n FindData storage data = find(self, false);\n uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);\n uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;\n clear(self);\n return abi.encode(value);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return abi.decode(read(self), (bytes32));\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n int256 v = read_int(self);\n if (v == 0) return false;\n if (v == 1) return true;\n revert(\"stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.\");\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return abi.decode(read(self), (address));\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return abi.decode(read(self), (uint256));\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return abi.decode(read(self), (int256));\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n return (uint256(parent_slot), key);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n bool found;\n bytes32 root_slot;\n bytes32 parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n while (found) {\n root_slot = parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));\n }\n return uint256(root_slot);\n }\n\n function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {\n bytes32 out;\n\n uint256 max = b.length > 32 ? 32 : b.length;\n for (uint256 i = 0; i < max; i++) {\n out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);\n }\n return out;\n }\n\n function flatten(bytes32[] memory b) private pure returns (bytes memory) {\n bytes memory result = new bytes(b.length * 32);\n for (uint256 i = 0; i < b.length; i++) {\n bytes32 k = b[i];\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(result, add(32, mul(32, i))), k)\n }\n }\n\n return result;\n }\n\n function clear(StdStorage storage self) internal {\n delete self._target;\n delete self._sig;\n delete self._keys;\n delete self._depth;\n delete self._enable_packed_slots;\n delete self._calldata;\n }\n\n // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`\n // (slotValue & mask) >> offsetRight will be the value of the given packed variable\n function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {\n // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;\n // using assembly because (1 << 256) causes overflow\n assembly {\n mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))\n }\n }\n\n // Returns slot value with updated packed variable.\n function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)\n internal\n pure\n returns (bytes32 newValue)\n {\n return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));\n }\n}\n\nlibrary stdStorage {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return stdStorageSafe.sigs(sigStr);\n }\n\n function find(StdStorage storage self) internal returns (uint256) {\n return find(self, true);\n }\n\n function find(StdStorage storage self, bool _clear) internal returns (uint256) {\n return stdStorageSafe.find(self, _clear).slot;\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n return stdStorageSafe.target(self, _target);\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, who);\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, amt);\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, key);\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n return stdStorageSafe.with_calldata(self, _calldata);\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n return stdStorageSafe.enable_packed_slots(self);\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n return stdStorageSafe.depth(self, _depth);\n }\n\n function clear(StdStorage storage self) internal {\n stdStorageSafe.clear(self);\n }\n\n function checked_write(StdStorage storage self, address who) internal {\n checked_write(self, bytes32(uint256(uint160(who))));\n }\n\n function checked_write(StdStorage storage self, uint256 amt) internal {\n checked_write(self, bytes32(amt));\n }\n\n function checked_write_int(StdStorage storage self, int256 val) internal {\n checked_write(self, bytes32(uint256(val)));\n }\n\n function checked_write(StdStorage storage self, bool write) internal {\n bytes32 t;\n /// @solidity memory-safe-assembly\n assembly {\n t := write\n }\n checked_write(self, t);\n }\n\n function checked_write(StdStorage storage self, bytes32 set) internal {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = stdStorageSafe.getCallParams(self);\n\n if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n find(self, false);\n }\n FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n if ((data.offsetLeft + data.offsetRight) > 0) {\n uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));\n require(\n uint256(set) < maxVal,\n string(\n abi.encodePacked(\n \"stdStorage find(StdStorage): Packed slot. We can't fit value greater than \",\n vm.toString(maxVal)\n )\n )\n );\n }\n bytes32 curVal = vm.load(who, bytes32(data.slot));\n bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);\n\n vm.store(who, bytes32(data.slot), valToSet);\n\n (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);\n\n if (!success || callResult != set) {\n vm.store(who, bytes32(data.slot), curVal);\n revert(\"stdStorage find(StdStorage): Failed to write value.\");\n }\n clear(self);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return stdStorageSafe.read_bytes32(self);\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n return stdStorageSafe.read_bool(self);\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return stdStorageSafe.read_address(self);\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.read_uint(self);\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return stdStorageSafe.read_int(self);\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n return stdStorageSafe.parent(self);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.root(self);\n }\n}\n" + }, + "forge-std/StdStyle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\nlibrary StdStyle {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n string constant RED = \"\\u001b[91m\";\n string constant GREEN = \"\\u001b[92m\";\n string constant YELLOW = \"\\u001b[93m\";\n string constant BLUE = \"\\u001b[94m\";\n string constant MAGENTA = \"\\u001b[95m\";\n string constant CYAN = \"\\u001b[96m\";\n string constant BOLD = \"\\u001b[1m\";\n string constant DIM = \"\\u001b[2m\";\n string constant ITALIC = \"\\u001b[3m\";\n string constant UNDERLINE = \"\\u001b[4m\";\n string constant INVERSE = \"\\u001b[7m\";\n string constant RESET = \"\\u001b[0m\";\n\n function styleConcat(string memory style, string memory self) private pure returns (string memory) {\n return string(abi.encodePacked(style, self, RESET));\n }\n\n function red(string memory self) internal pure returns (string memory) {\n return styleConcat(RED, self);\n }\n\n function red(uint256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(int256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(address self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(bool self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes(bytes memory self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes32(bytes32 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function green(string memory self) internal pure returns (string memory) {\n return styleConcat(GREEN, self);\n }\n\n function green(uint256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(int256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(address self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(bool self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes(bytes memory self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes32(bytes32 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function yellow(string memory self) internal pure returns (string memory) {\n return styleConcat(YELLOW, self);\n }\n\n function yellow(uint256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(int256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(address self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(bool self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes(bytes memory self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes32(bytes32 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function blue(string memory self) internal pure returns (string memory) {\n return styleConcat(BLUE, self);\n }\n\n function blue(uint256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(int256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(address self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(bool self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes(bytes memory self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes32(bytes32 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function magenta(string memory self) internal pure returns (string memory) {\n return styleConcat(MAGENTA, self);\n }\n\n function magenta(uint256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(int256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(address self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(bool self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes(bytes memory self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes32(bytes32 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function cyan(string memory self) internal pure returns (string memory) {\n return styleConcat(CYAN, self);\n }\n\n function cyan(uint256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(int256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(address self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(bool self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes(bytes memory self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes32(bytes32 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function bold(string memory self) internal pure returns (string memory) {\n return styleConcat(BOLD, self);\n }\n\n function bold(uint256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(int256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(address self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(bool self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes(bytes memory self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes32(bytes32 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function dim(string memory self) internal pure returns (string memory) {\n return styleConcat(DIM, self);\n }\n\n function dim(uint256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(int256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(address self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(bool self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes(bytes memory self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes32(bytes32 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function italic(string memory self) internal pure returns (string memory) {\n return styleConcat(ITALIC, self);\n }\n\n function italic(uint256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(int256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(address self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(bool self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes(bytes memory self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes32(bytes32 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function underline(string memory self) internal pure returns (string memory) {\n return styleConcat(UNDERLINE, self);\n }\n\n function underline(uint256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(int256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(address self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(bool self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes(bytes memory self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes32(bytes32 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function inverse(string memory self) internal pure returns (string memory) {\n return styleConcat(INVERSE, self);\n }\n\n function inverse(uint256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(int256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(address self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(bool self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes(bytes memory self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes32(bytes32 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n}\n" + }, + "forge-std/StdToml.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing TOML files\n// To parse:\n// ```\n// using stdToml for string;\n// string memory toml = vm.readFile(\"\");\n// toml.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdToml for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdToml {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory toml, string memory key) internal view returns (bool) {\n return vm.keyExistsToml(toml, key);\n }\n\n function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseToml(toml, key);\n }\n\n function readUint(string memory toml, string memory key) internal pure returns (uint256) {\n return vm.parseTomlUint(toml, key);\n }\n\n function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseTomlUintArray(toml, key);\n }\n\n function readInt(string memory toml, string memory key) internal pure returns (int256) {\n return vm.parseTomlInt(toml, key);\n }\n\n function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {\n return vm.parseTomlIntArray(toml, key);\n }\n\n function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {\n return vm.parseTomlBytes32(toml, key);\n }\n\n function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseTomlBytes32Array(toml, key);\n }\n\n function readString(string memory toml, string memory key) internal pure returns (string memory) {\n return vm.parseTomlString(toml, key);\n }\n\n function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {\n return vm.parseTomlStringArray(toml, key);\n }\n\n function readAddress(string memory toml, string memory key) internal pure returns (address) {\n return vm.parseTomlAddress(toml, key);\n }\n\n function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {\n return vm.parseTomlAddressArray(toml, key);\n }\n\n function readBool(string memory toml, string memory key) internal pure returns (bool) {\n return vm.parseTomlBool(toml, key);\n }\n\n function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {\n return vm.parseTomlBoolArray(toml, key);\n }\n\n function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseTomlBytes(toml, key);\n }\n\n function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseTomlBytesArray(toml, key);\n }\n\n function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(toml, key) ? readUint(toml, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;\n }\n\n function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(toml, key) ? readInt(toml, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;\n }\n\n function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;\n }\n\n function readStringOr(string memory toml, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(toml, key) ? readString(toml, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;\n }\n\n function readAddressOr(string memory toml, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;\n }\n\n function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(toml, key) ? readBool(toml, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;\n }\n\n function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeToml(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeToml(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {IMulticall3} from \"./interfaces/IMulticall3.sol\";\nimport {MockERC20} from \"./mocks/MockERC20.sol\";\nimport {MockERC721} from \"./mocks/MockERC721.sol\";\nimport {VmSafe} from \"./Vm.sol\";\n\nabstract contract StdUtils {\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS\n //////////////////////////////////////////////////////////////////////////*/\n\n IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n uint256 private constant INT256_MIN_ABS =\n 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n uint256 private constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n require(min <= max, \"StdUtils bound(uint256,uint256,uint256): Max is less than min.\");\n // If x is between min and max, return x directly. This is to ensure that dictionary values\n // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188\n if (x >= min && x <= max) return x;\n\n uint256 size = max - min + 1;\n\n // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.\n // This helps ensure coverage of the min/max values.\n if (x <= 3 && size > x) return min + x;\n if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);\n\n // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.\n if (x > max) {\n uint256 diff = x - max;\n uint256 rem = diff % size;\n if (rem == 0) return max;\n result = min + rem - 1;\n } else if (x < min) {\n uint256 diff = min - x;\n uint256 rem = diff % size;\n if (rem == 0) return min;\n result = max - rem + 1;\n }\n }\n\n function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", result);\n }\n\n function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n require(min <= max, \"StdUtils bound(int256,int256,int256): Max is less than min.\");\n\n // Shifting all int256 values to uint256 to use _bound function. The range of two types are:\n // int256 : -(2**255) ~ (2**255 - 1)\n // uint256: 0 ~ (2**256 - 1)\n // So, add 2**255, INT256_MIN_ABS to the integer values.\n //\n // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.\n // So, use `~uint256(x) + 1` instead.\n uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);\n uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);\n uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);\n\n uint256 y = _bound(_x, _min, _max);\n\n // To move it back to int256 value, subtract INT256_MIN_ABS at here.\n result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);\n }\n\n function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", vm.toString(result));\n }\n\n function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {\n result = _bound(privateKey, 1, SECP256K1_ORDER - 1);\n }\n\n function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {\n require(b.length <= 32, \"StdUtils bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce\n /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol)\n function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {\n console2_log_StdUtils(\"computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.\");\n return vm.computeCreateAddress(deployer, nonce);\n }\n\n function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)\n internal\n pure\n virtual\n returns (address)\n {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initcodeHash, deployer);\n }\n\n /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initCodeHash);\n }\n\n /// @dev returns an initialized mock ERC20 contract\n function deployMockERC20(string memory name, string memory symbol, uint8 decimals)\n internal\n returns (MockERC20 mock)\n {\n mock = new MockERC20();\n mock.initialize(name, symbol, decimals);\n }\n\n /// @dev returns an initialized mock ERC721 contract\n function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) {\n mock = new MockERC721();\n mock.initialize(name, symbol);\n }\n\n /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {\n return hashInitCode(creationCode, \"\");\n }\n\n /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n /// @param args the ABI-encoded arguments to the constructor of C\n function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(creationCode, args));\n }\n\n // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.\n function getTokenBalances(address token, address[] memory addresses)\n internal\n virtual\n returns (uint256[] memory balances)\n {\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdUtils getTokenBalances(address,address[]): Token address is not a contract.\");\n\n // ABI encode the aggregate call to Multicall3.\n uint256 length = addresses.length;\n IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);\n for (uint256 i = 0; i < length; ++i) {\n // 0x70a08231 = bytes4(\"balanceOf(address)\"))\n calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});\n }\n\n // Make the aggregate call.\n (, bytes[] memory returnData) = multicall.aggregate(calls);\n\n // ABI decode the return data and return the balances.\n balances = new uint256[](length);\n for (uint256 i = 0; i < length; ++i) {\n balances[i] = abi.decode(returnData[i], (uint256));\n }\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n PRIVATE FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {\n return address(uint160(uint256(bytesValue)));\n }\n\n // This section is used to prevent the compilation of console, which shortens the compilation time when console is\n // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid\n // any breaking changes to function signatures.\n function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)\n internal\n pure\n returns (function(bytes memory) internal pure fnOut)\n {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castLogPayloadViewToPure(_sendLogPayloadView)(payload);\n }\n\n function _sendLogPayloadView(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE2_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function console2_log_StdUtils(string memory p0) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function console2_log_StdUtils(string memory p0, uint256 p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function console2_log_StdUtils(string memory p0, string memory p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n}\n" + }, + "forge-std/Test.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\n// 💬 ABOUT\n// Forge Std's default Test.\n\n// 🧩 MODULES\nimport {console} from \"./console.sol\";\nimport {console2} from \"./console2.sol\";\nimport {safeconsole} from \"./safeconsole.sol\";\nimport {StdAssertions} from \"./StdAssertions.sol\";\nimport {StdChains} from \"./StdChains.sol\";\nimport {StdCheats} from \"./StdCheats.sol\";\nimport {stdError} from \"./StdError.sol\";\nimport {StdInvariant} from \"./StdInvariant.sol\";\nimport {stdJson} from \"./StdJson.sol\";\nimport {stdMath} from \"./StdMath.sol\";\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {StdStyle} from \"./StdStyle.sol\";\nimport {stdToml} from \"./StdToml.sol\";\nimport {StdUtils} from \"./StdUtils.sol\";\nimport {Vm} from \"./Vm.sol\";\n\n// 📦 BOILERPLATE\nimport {TestBase} from \"./Base.sol\";\n\n// ⭐️ TEST\nabstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {\n // Note: IS_TEST() must return true.\n bool public IS_TEST = true;\n}\n" + }, + "forge-std/Vm.sol": { + "content": "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\n/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may\n/// result in Script simulations differing from on-chain execution. It is recommended to only use\n/// these cheats in scripts.\ninterface VmSafe {\n /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.\n enum CallerMode {\n // No caller modification is currently active.\n None,\n // A one time broadcast triggered by a `vm.broadcast()` call is currently active.\n Broadcast,\n // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.\n RecurrentBroadcast,\n // A one time prank triggered by a `vm.prank()` call is currently active.\n Prank,\n // A recurrent prank triggered by a `vm.startPrank()` call is currently active.\n RecurrentPrank\n }\n\n /// The kind of account access that occurred.\n enum AccountAccessKind {\n // The account was called.\n Call,\n // The account was called via delegatecall.\n DelegateCall,\n // The account was called via callcode.\n CallCode,\n // The account was called via staticcall.\n StaticCall,\n // The account was created.\n Create,\n // The account was selfdestructed.\n SelfDestruct,\n // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).\n Resume,\n // The account's balance was read.\n Balance,\n // The account's codesize was read.\n Extcodesize,\n // The account's codehash was read.\n Extcodehash,\n // The account's code was copied.\n Extcodecopy\n }\n\n /// Forge execution contexts.\n enum ForgeContext {\n // Test group execution context (test, coverage or snapshot).\n TestGroup,\n // `forge test` execution context.\n Test,\n // `forge coverage` execution context.\n Coverage,\n // `forge snapshot` execution context.\n Snapshot,\n // Script group execution context (dry run, broadcast or resume).\n ScriptGroup,\n // `forge script` execution context.\n ScriptDryRun,\n // `forge script --broadcast` execution context.\n ScriptBroadcast,\n // `forge script --resume` execution context.\n ScriptResume,\n // Unknown `forge` execution context.\n Unknown\n }\n\n /// An Ethereum log. Returned by `getRecordedLogs`.\n struct Log {\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The address of the log's emitter.\n address emitter;\n }\n\n /// An RPC URL and its alias. Returned by `rpcUrlStructs`.\n struct Rpc {\n // The alias of the RPC URL.\n string key;\n // The RPC URL.\n string url;\n }\n\n /// An RPC log object. Returned by `eth_getLogs`.\n struct EthGetLogs {\n // The address of the log's emitter.\n address emitter;\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The block hash.\n bytes32 blockHash;\n // The block number.\n uint64 blockNumber;\n // The transaction hash.\n bytes32 transactionHash;\n // The transaction index in the block.\n uint64 transactionIndex;\n // The log index.\n uint256 logIndex;\n // Whether the log was removed.\n bool removed;\n }\n\n /// A single entry in a directory listing. Returned by `readDir`.\n struct DirEntry {\n // The error message, if any.\n string errorMessage;\n // The path of the entry.\n string path;\n // The depth of the entry.\n uint64 depth;\n // Whether the entry is a directory.\n bool isDir;\n // Whether the entry is a symlink.\n bool isSymlink;\n }\n\n /// Metadata information about a file.\n /// This structure is returned from the `fsMetadata` function and represents known\n /// metadata about a file such as its permissions, size, modification\n /// times, etc.\n struct FsMetadata {\n // True if this metadata is for a directory.\n bool isDir;\n // True if this metadata is for a symlink.\n bool isSymlink;\n // The size of the file, in bytes, this metadata is for.\n uint256 length;\n // True if this metadata is for a readonly (unwritable) file.\n bool readOnly;\n // The last modification time listed in this metadata.\n uint256 modified;\n // The last access time of this metadata.\n uint256 accessed;\n // The creation time listed in this metadata.\n uint256 created;\n }\n\n /// A wallet with a public and private key.\n struct Wallet {\n // The wallet's address.\n address addr;\n // The wallet's public key `X`.\n uint256 publicKeyX;\n // The wallet's public key `Y`.\n uint256 publicKeyY;\n // The wallet's private key.\n uint256 privateKey;\n }\n\n /// The result of a `tryFfi` call.\n struct FfiResult {\n // The exit code of the call.\n int32 exitCode;\n // The optionally hex-decoded `stdout` data.\n bytes stdout;\n // The `stderr` data.\n bytes stderr;\n }\n\n /// Information on the chain and fork.\n struct ChainInfo {\n // The fork identifier. Set to zero if no fork is active.\n uint256 forkId;\n // The chain ID of the current fork.\n uint256 chainId;\n }\n\n /// The result of a `stopAndReturnStateDiff` call.\n struct AccountAccess {\n // The chain and fork the access occurred.\n ChainInfo chainInfo;\n // The kind of account access that determines what the account is.\n // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.\n // If kind is Create, then the account is the newly created account.\n // If kind is SelfDestruct, then the account is the selfdestruct recipient.\n // If kind is a Resume, then account represents a account context that has resumed.\n AccountAccessKind kind;\n // The account that was accessed.\n // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.\n address account;\n // What accessed the account.\n address accessor;\n // If the account was initialized or empty prior to the access.\n // An account is considered initialized if it has code, a\n // non-zero nonce, or a non-zero balance.\n bool initialized;\n // The previous balance of the accessed account.\n uint256 oldBalance;\n // The potential new balance of the accessed account.\n // That is, all balance changes are recorded here, even if reverts occurred.\n uint256 newBalance;\n // Code of the account deployed by CREATE.\n bytes deployedCode;\n // Value passed along with the account access\n uint256 value;\n // Input data provided to the CREATE or CALL\n bytes data;\n // If this access reverted in either the current or parent context.\n bool reverted;\n // An ordered list of storage accesses made during an account access operation.\n StorageAccess[] storageAccesses;\n // Call depth traversed during the recording of state differences\n uint64 depth;\n }\n\n /// The storage accessed during an `AccountAccess`.\n struct StorageAccess {\n // The account whose storage was accessed.\n address account;\n // The slot that was accessed.\n bytes32 slot;\n // If the access was a write.\n bool isWrite;\n // The previous value of the slot.\n bytes32 previousValue;\n // The new value of the slot.\n bytes32 newValue;\n // If the access was reverted.\n bool reverted;\n }\n\n /// Gas used. Returned by `lastCallGas`.\n struct Gas {\n // The gas limit of the call.\n uint64 gasLimit;\n // The total gas used.\n uint64 gasTotalUsed;\n // DEPRECATED: The amount of gas used for memory expansion. Ref: \n uint64 gasMemoryUsed;\n // The amount of gas refunded.\n int64 gasRefunded;\n // The amount of gas remaining.\n uint64 gasRemaining;\n }\n\n // ======== Crypto ========\n\n /// Derives a private key from the name, labels the account with that name, and returns the wallet.\n function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key and returns the wallet.\n function createWallet(uint256 privateKey) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.\n function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derives secp256r1 public key from the provided `privateKey`.\n function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);\n\n /// Adds a private key to the local forge wallet and returns the address.\n function rememberKey(uint256 privateKey) external returns (address keyAddr);\n\n /// Signs data with a `Wallet`.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// Raises error if none of the signers passed into the script have provided address.\n function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256r1 curve.\n function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);\n\n /// Signs data with a `Wallet`.\n function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Raises error if none of the signers passed into the script have provided address.\n function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n // ======== Environment ========\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and returns true if it exists, else returns false.\n function envExists(string calldata name) external view returns (bool result);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bool defaultValue) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)\n external\n view\n returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)\n external\n view\n returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)\n external\n view\n returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)\n external\n view\n returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, address defaultValue) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)\n external\n view\n returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)\n external\n view\n returns (uint256[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)\n external\n view\n returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name, string calldata delim) external view returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);\n\n /// Returns true if `forge` command was executed in given context.\n function isContext(ForgeContext context) external view returns (bool result);\n\n /// Sets environment variables.\n function setEnv(string calldata name, string calldata value) external;\n\n // ======== EVM ========\n\n /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.\n function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);\n\n /// Gets the address for a given private key.\n function addr(uint256 privateKey) external pure returns (address keyAddr);\n\n /// Gets all the logs according to specified filter.\n function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)\n external\n returns (EthGetLogs[] memory logs);\n\n /// Gets the current `block.blobbasefee`.\n /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlobBaseFee() external view returns (uint256 blobBaseFee);\n\n /// Gets the current `block.number`.\n /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockNumber() external view returns (uint256 height);\n\n /// Gets the current `block.timestamp`.\n /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockTimestamp() external view returns (uint256 timestamp);\n\n /// Gets the map key and parent of a mapping at a given slot, for a given address.\n function getMappingKeyAndParentOf(address target, bytes32 elementSlot)\n external\n returns (bool found, bytes32 key, bytes32 parent);\n\n /// Gets the number of elements in the mapping at the given slot, for a given address.\n function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length);\n\n /// Gets the elements at index idx of the mapping at the given slot, for a given address. The\n /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).\n function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value);\n\n /// Gets the nonce of an account.\n function getNonce(address account) external view returns (uint64 nonce);\n\n /// Get the nonce of a `Wallet`.\n function getNonce(Wallet calldata wallet) external returns (uint64 nonce);\n\n /// Gets all the recorded logs.\n function getRecordedLogs() external returns (Log[] memory logs);\n\n /// Gets the gas used in the last call.\n function lastCallGas() external view returns (Gas memory gas);\n\n /// Loads a storage slot from an address.\n function load(address target, bytes32 slot) external view returns (bytes32 data);\n\n /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.\n function pauseGasMetering() external;\n\n /// Records all storage reads and writes.\n function record() external;\n\n /// Record all the transaction logs.\n function recordLogs() external;\n\n /// Reset gas metering (i.e. gas usage is set to gas limit).\n function resetGasMetering() external;\n\n /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.\n function resumeGasMetering() external;\n\n /// Performs an Ethereum JSON-RPC request to the current fork URL.\n function rpc(string calldata method, string calldata params) external returns (bytes memory data);\n\n /// Performs an Ethereum JSON-RPC request to the given endpoint.\n function rpc(string calldata urlOrAlias, string calldata method, string calldata params)\n external\n returns (bytes memory data);\n\n /// Starts recording all map SSTOREs for later retrieval.\n function startMappingRecording() external;\n\n /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,\n /// along with the context of the calls\n function startStateDiffRecording() external;\n\n /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.\n function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);\n\n /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.\n function stopMappingRecording() external;\n\n // ======== Filesystem ========\n\n /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.\n /// `path` is relative to the project root.\n function closeFile(string calldata path) external;\n\n /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.\n /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.\n /// Both `from` and `to` are relative to the project root.\n function copyFile(string calldata from, string calldata to) external returns (uint64 copied);\n\n /// Creates a new, empty directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - User lacks permissions to modify `path`.\n /// - A parent of the given path doesn't exist and `recursive` is false.\n /// - `path` already exists and `recursive` is false.\n /// `path` is relative to the project root.\n function createDir(string calldata path, bool recursive) external;\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function deployCode(string calldata artifactPath) external returns (address deployedAddress);\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n /// Additionally accepts abi-encoded constructor arguments.\n function deployCode(string calldata artifactPath, bytes calldata constructorArgs)\n external\n returns (address deployedAddress);\n\n /// Returns true if the given path points to an existing entity, else returns false.\n function exists(string calldata path) external returns (bool result);\n\n /// Performs a foreign function call via the terminal.\n function ffi(string[] calldata commandInput) external returns (bytes memory result);\n\n /// Given a path, query the file system to get information about a file, directory, etc.\n function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);\n\n /// Gets the artifact path from code (aka. creation code).\n function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);\n\n /// Gets the artifact path from deployed code (aka. runtime code).\n function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);\n\n /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);\n\n /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);\n\n /// Returns true if the path exists on disk and is pointing at a directory, else returns false.\n function isDir(string calldata path) external returns (bool result);\n\n /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.\n function isFile(string calldata path) external returns (bool result);\n\n /// Get the path of the current project root.\n function projectRoot() external view returns (string memory path);\n\n /// Prompts the user for a string value in the terminal.\n function prompt(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for an address in the terminal.\n function promptAddress(string calldata promptText) external returns (address);\n\n /// Prompts the user for a hidden string value in the terminal.\n function promptSecret(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for hidden uint256 in the terminal (usually pk).\n function promptSecretUint(string calldata promptText) external returns (uint256);\n\n /// Prompts the user for uint256 in the terminal.\n function promptUint(string calldata promptText) external returns (uint256);\n\n /// Reads the directory at the given path recursively, up to `maxDepth`.\n /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.\n /// Follows symbolic links if `followLinks` is true.\n function readDir(string calldata path) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth, bool followLinks)\n external\n view\n returns (DirEntry[] memory entries);\n\n /// Reads the entire content of file to string. `path` is relative to the project root.\n function readFile(string calldata path) external view returns (string memory data);\n\n /// Reads the entire content of file as binary. `path` is relative to the project root.\n function readFileBinary(string calldata path) external view returns (bytes memory data);\n\n /// Reads next line of file to string.\n function readLine(string calldata path) external view returns (string memory line);\n\n /// Reads a symbolic link, returning the path that the link points to.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` is not a symbolic link.\n /// - `path` does not exist.\n function readLink(string calldata linkPath) external view returns (string memory targetPath);\n\n /// Removes a directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` doesn't exist.\n /// - `path` isn't a directory.\n /// - User lacks permissions to modify `path`.\n /// - The directory is not empty and `recursive` is false.\n /// `path` is relative to the project root.\n function removeDir(string calldata path, bool recursive) external;\n\n /// Removes a file from the filesystem.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` points to a directory.\n /// - The file doesn't exist.\n /// - The user lacks permissions to remove the file.\n /// `path` is relative to the project root.\n function removeFile(string calldata path) external;\n\n /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.\n function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);\n\n /// Returns the time since unix epoch in milliseconds.\n function unixTime() external returns (uint256 milliseconds);\n\n /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFile(string calldata path, string calldata data) external;\n\n /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFileBinary(string calldata path, bytes calldata data) external;\n\n /// Writes line to file, creating a file if it does not exist.\n /// `path` is relative to the project root.\n function writeLine(string calldata path, string calldata data) external;\n\n // ======== JSON ========\n\n /// Checks if `key` exists in a JSON object.\n function keyExistsJson(string calldata json, string calldata key) external view returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `address`.\n function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);\n\n /// Parses a string of JSON data at `key` and coerces it to `address[]`.\n function parseJsonAddressArray(string calldata json, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool`.\n function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool[]`.\n function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes`.\n function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32`.\n function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.\n function parseJsonBytes32Array(string calldata json, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.\n function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256`.\n function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256[]`.\n function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a JSON object.\n function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of JSON data at `key` and coerces it to `string`.\n function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `string[]`.\n function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256`.\n function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.\n function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a JSON object.\n function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a JSON object at `key`.\n function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)\n external\n returns (string memory json);\n\n /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.\n /// Returns the stringified version of the specific JSON file up to that moment.\n function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(string calldata typeDescription, bytes calldata value)\n external\n pure\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(\n string calldata objectKey,\n string calldata valueKey,\n string calldata typeDescription,\n bytes calldata value\n ) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)\n external\n returns (string memory json);\n\n /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.\n function writeJson(string calldata json, string calldata path) external;\n\n /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = \n /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.\n function writeJson(string calldata json, string calldata path, string calldata valueKey) external;\n\n /// Checks if `key` exists in a JSON object\n /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.\n function keyExists(string calldata json, string calldata key) external view returns (bool);\n\n // ======== Scripting ========\n\n /// Takes a signed transaction and broadcasts it to the network.\n function broadcastRawTransaction(bytes calldata data) external;\n\n /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function broadcast() external;\n\n /// Has the next call (at this call depth only) create a transaction with the address provided\n /// as the sender that can later be signed and sent onchain.\n function broadcast(address signer) external;\n\n /// Has the next call (at this call depth only) create a transaction with the private key\n /// provided as the sender that can later be signed and sent onchain.\n function broadcast(uint256 privateKey) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function startBroadcast() external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the address\n /// provided that can later be signed and sent onchain.\n function startBroadcast(address signer) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the private key\n /// provided that can later be signed and sent onchain.\n function startBroadcast(uint256 privateKey) external;\n\n /// Stops collecting onchain transactions.\n function stopBroadcast() external;\n\n // ======== String ========\n\n /// Returns the index of the first occurrence of a `key` in an `input` string.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.\n /// Returns 0 in case of an empty `key`.\n function indexOf(string calldata input, string calldata key) external pure returns (uint256);\n\n /// Parses the given `string` into an `address`.\n function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);\n\n /// Parses the given `string` into a `bool`.\n function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);\n\n /// Parses the given `string` into `bytes`.\n function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);\n\n /// Parses the given `string` into a `bytes32`.\n function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);\n\n /// Parses the given `string` into a `int256`.\n function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);\n\n /// Parses the given `string` into a `uint256`.\n function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);\n\n /// Replaces occurrences of `from` in the given `string` with `to`.\n function replace(string calldata input, string calldata from, string calldata to)\n external\n pure\n returns (string memory output);\n\n /// Splits the given `string` into an array of strings divided by the `delimiter`.\n function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);\n\n /// Converts the given `string` value to Lowercase.\n function toLowercase(string calldata input) external pure returns (string memory output);\n\n /// Converts the given value to a `string`.\n function toString(address value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes calldata value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes32 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bool value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(uint256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(int256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given `string` value to Uppercase.\n function toUppercase(string calldata input) external pure returns (string memory output);\n\n /// Trims leading and trailing whitespace from the given `string` value.\n function trim(string calldata input) external pure returns (string memory output);\n\n // ======== Testing ========\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n int256 left,\n int256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are equal.\n function assertEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are equal.\n function assertEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are equal and includes error message into revert string on failure.\n function assertEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are equal.\n function assertEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are equal.\n function assertEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256 values are equal.\n function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are equal.\n function assertEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal.\n function assertEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are equal.\n function assertEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.\n function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are equal.\n function assertEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.\n function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal.\n function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal.\n function assertEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are equal.\n function assertEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are equal and includes error message into revert string on failure.\n function assertEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are equal.\n function assertEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is false.\n function assertFalse(bool condition) external pure;\n\n /// Asserts that the given condition is false and includes error message into revert string on failure.\n function assertFalse(bool condition, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n function assertGe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n function assertGe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n function assertGt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n function assertGt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n function assertLe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n function assertLe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n function assertLt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n function assertLt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are not equal.\n function assertNotEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are not equal.\n function assertNotEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are not equal.\n function assertNotEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal.\n function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal.\n function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal.\n function assertNotEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal.\n function assertNotEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are not equal.\n function assertNotEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal.\n function assertNotEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are not equal.\n function assertNotEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are not equal.\n function assertNotEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is true.\n function assertTrue(bool condition) external pure;\n\n /// Asserts that the given condition is true and includes error message into revert string on failure.\n function assertTrue(bool condition, string calldata error) external pure;\n\n /// If the condition is false, discard this run's fuzz inputs and generate new ones.\n function assume(bool condition) external pure;\n\n /// Discard this run's fuzz inputs and generate new ones if next call reverted.\n function assumeNoRevert() external pure;\n\n /// Writes a breakpoint to jump to in the debugger.\n function breakpoint(string calldata char) external;\n\n /// Writes a conditional breakpoint to jump to in the debugger.\n function breakpoint(string calldata char, bool value) external;\n\n /// Returns the Foundry version.\n /// Format: ++\n /// Sample output: 0.2.0+faa94c384+202407110019\n /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.\n /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000)\n /// to compare timestamps while ignoring minor time differences.\n function getFoundryVersion() external view returns (string memory version);\n\n /// Returns the RPC url for the given alias.\n function rpcUrl(string calldata rpcAlias) external view returns (string memory json);\n\n /// Returns all rpc urls and their aliases as structs.\n function rpcUrlStructs() external view returns (Rpc[] memory urls);\n\n /// Returns all rpc urls and their aliases `[alias, url][]`.\n function rpcUrls() external view returns (string[2][] memory urls);\n\n /// Suspends execution of the main thread for `duration` milliseconds.\n function sleep(uint256 duration) external;\n\n // ======== Toml ========\n\n /// Checks if `key` exists in a TOML table.\n function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `address`.\n function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);\n\n /// Parses a string of TOML data at `key` and coerces it to `address[]`.\n function parseTomlAddressArray(string calldata toml, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool`.\n function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool[]`.\n function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes`.\n function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32`.\n function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.\n function parseTomlBytes32Array(string calldata toml, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.\n function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256`.\n function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256[]`.\n function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a TOML table.\n function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of TOML data at `key` and coerces it to `string`.\n function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `string[]`.\n function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256`.\n function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.\n function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a TOML table.\n function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a TOML table at `key`.\n function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.\n function writeToml(string calldata json, string calldata path) external;\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = \n /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.\n function writeToml(string calldata json, string calldata path, string calldata valueKey) external;\n\n // ======== Utilities ========\n\n /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer)\n external\n pure\n returns (address);\n\n /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);\n\n /// Compute the address a contract will be deployed at for a given deployer address and nonce.\n function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);\n\n /// Utility cheatcode to copy storage of `from` contract to another `to` contract.\n function copyStorage(address from, address to) external;\n\n /// Returns ENS namehash for provided string.\n function ensNamehash(string calldata name) external pure returns (bytes32);\n\n /// Gets the label for the specified address.\n function getLabel(address account) external view returns (string memory currentLabel);\n\n /// Labels an address in call traces.\n function label(address account, string calldata newLabel) external;\n\n /// Pauses collection of call traces. Useful in cases when you want to skip tracing of\n /// complex calls which are not useful for debugging.\n function pauseTracing() external view;\n\n /// Returns a random `address`.\n function randomAddress() external returns (address);\n\n /// Returns an random `bool`.\n function randomBool() external view returns (bool);\n\n /// Returns an random byte array value of the given length.\n function randomBytes(uint256 len) external view returns (bytes memory);\n\n /// Returns an random `int256` value.\n function randomInt() external view returns (int256);\n\n /// Returns an random `int256` value of given bits.\n function randomInt(uint256 bits) external view returns (int256);\n\n /// Returns a random uint256 value.\n function randomUint() external returns (uint256);\n\n /// Returns random uint256 value between the provided range (=min..=max).\n function randomUint(uint256 min, uint256 max) external returns (uint256);\n\n /// Returns an random `uint256` value of given bits.\n function randomUint(uint256 bits) external view returns (uint256);\n\n /// Unpauses collection of call traces.\n function resumeTracing() external view;\n\n /// Utility cheatcode to set arbitrary storage for given target address.\n function setArbitraryStorage(address target) external;\n\n /// Encodes a `bytes` value to a base64url string.\n function toBase64URL(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64url string.\n function toBase64URL(string calldata data) external pure returns (string memory);\n\n /// Encodes a `bytes` value to a base64 string.\n function toBase64(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64 string.\n function toBase64(string calldata data) external pure returns (string memory);\n}\n\n/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used\n/// in tests, but it is not recommended to use these cheats in scripts.\ninterface Vm is VmSafe {\n // ======== EVM ========\n\n /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.\n function activeFork() external view returns (uint256 forkId);\n\n /// In forking mode, explicitly grant the given address cheatcode access.\n function allowCheatcodes(address account) external;\n\n /// Sets `block.blobbasefee`\n function blobBaseFee(uint256 newBlobBaseFee) external;\n\n /// Sets the blobhashes in the transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function blobhashes(bytes32[] calldata hashes) external;\n\n /// Sets `block.chainid`.\n function chainId(uint256 newChainId) external;\n\n /// Clears all mocked calls.\n function clearMockedCalls() external;\n\n /// Sets `block.coinbase`.\n function coinbase(address newCoinbase) external;\n\n /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Sets an address' balance.\n function deal(address account, uint256 newBalance) external;\n\n /// Removes the snapshot with the given ID created by `snapshot`.\n /// Takes the snapshot ID to delete.\n /// Returns `true` if the snapshot was successfully deleted.\n /// Returns `false` if the snapshot does not exist.\n function deleteSnapshot(uint256 snapshotId) external returns (bool success);\n\n /// Removes _all_ snapshots previously created by `snapshot`.\n function deleteSnapshots() external;\n\n /// Sets `block.difficulty`.\n /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.\n /// Reverts if used on unsupported EVM versions.\n function difficulty(uint256 newDifficulty) external;\n\n /// Dump a genesis JSON file's `allocs` to disk.\n function dumpState(string calldata pathToStateJson) external;\n\n /// Sets an address' code.\n function etch(address target, bytes calldata newRuntimeBytecode) external;\n\n /// Sets `block.basefee`.\n function fee(uint256 newBasefee) external;\n\n /// Gets the blockhashes from the current transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function getBlobhashes() external view returns (bytes32[] memory hashes);\n\n /// Returns true if the account is marked as persistent.\n function isPersistent(address account) external view returns (bool persistent);\n\n /// Load a genesis JSON file's `allocs` into the in-memory revm state.\n function loadAllocs(string calldata pathToAllocsJson) external;\n\n /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup\n /// Meaning, changes made to the state of this account will be kept when switching forks.\n function makePersistent(address account) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1, address account2) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address[] calldata accounts) external;\n\n /// Reverts a call to an address with specified revert data.\n function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;\n\n /// Reverts a call to an address with a specific `msg.value`, with specified revert data.\n function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)\n external;\n\n /// Mocks a call to an address, returning specified data.\n /// Calldata can either be strict or a partial match, e.g. if you only\n /// pass a Solidity selector to the expected calldata, then the entire Solidity\n /// function will be mocked.\n function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;\n\n /// Mocks a call to an address with a specific `msg.value`, returning specified data.\n /// Calldata match takes precedence over `msg.value` in case of ambiguity.\n function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;\n\n /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls\n /// `target` with the same calldata. This functionality is similar to a delegate call made to\n /// `target` contract from `callee`.\n /// Can be used to substitute a call to a function with another implementation that captures\n /// the primary logic of the original function but is easier to reason about.\n /// If calldata is not a strict match then partial match by selector is attempted.\n function mockFunction(address callee, address target, bytes calldata data) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address.\n function prank(address msgSender) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.\n function prank(address msgSender, address txOrigin) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(bytes32 newPrevrandao) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(uint256 newPrevrandao) external;\n\n /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.\n function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin);\n\n /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.\n function resetNonce(address account) external;\n\n /// Revert the state of the EVM to a previous snapshot\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted.\n /// Returns `false` if the snapshot does not exist.\n /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`.\n function revertTo(uint256 snapshotId) external returns (bool success);\n\n /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted and deleted.\n /// Returns `false` if the snapshot does not exist.\n function revertToAndDelete(uint256 snapshotId) external returns (bool success);\n\n /// Revokes persistent status from the address, previously added via `makePersistent`.\n function revokePersistent(address account) external;\n\n /// See `revokePersistent(address)`.\n function revokePersistent(address[] calldata accounts) external;\n\n /// Sets `block.height`.\n function roll(uint256 newHeight) external;\n\n /// Updates the currently active fork to given block number\n /// This is similar to `roll` but for the currently active fork.\n function rollFork(uint256 blockNumber) external;\n\n /// Updates the currently active fork to given transaction. This will `rollFork` with the number\n /// of the block the transaction was mined in and replays all transaction mined before it in the block.\n function rollFork(bytes32 txHash) external;\n\n /// Updates the given fork to given block number.\n function rollFork(uint256 forkId, uint256 blockNumber) external;\n\n /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.\n function rollFork(uint256 forkId, bytes32 txHash) external;\n\n /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.\n function selectFork(uint256 forkId) external;\n\n /// Set blockhash for the current block.\n /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.\n function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;\n\n /// Sets the nonce of an account. Must be higher than the current nonce of the account.\n function setNonce(address account, uint64 newNonce) external;\n\n /// Sets the nonce of an account to an arbitrary value.\n function setNonceUnsafe(address account, uint64 newNonce) external;\n\n /// Snapshot the current state of the evm.\n /// Returns the ID of the snapshot that was created.\n /// To revert a snapshot use `revertTo`.\n function snapshot() external returns (uint256 snapshotId);\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.\n function startPrank(address msgSender) external;\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.\n function startPrank(address msgSender, address txOrigin) external;\n\n /// Resets subsequent calls' `msg.sender` to be `address(this)`.\n function stopPrank() external;\n\n /// Stores a value to an address' storage slot.\n function store(address target, bytes32 slot, bytes32 value) external;\n\n /// Fetches the given transaction from the active fork and executes it on the current state.\n function transact(bytes32 txHash) external;\n\n /// Fetches the given transaction from the given fork and executes it on the current state.\n function transact(uint256 forkId, bytes32 txHash) external;\n\n /// Sets `tx.gasprice`.\n function txGasPrice(uint256 newGasPrice) external;\n\n /// Sets `block.timestamp`.\n function warp(uint256 newTimestamp) external;\n\n // ======== Testing ========\n\n /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;\n\n /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)\n external;\n\n /// Expects a call to an address with the specified calldata.\n /// Calldata can either be a strict or a partial match.\n function expectCall(address callee, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified calldata.\n function expectCall(address callee, bytes calldata data, uint64 count) external;\n\n /// Expects a call to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;\n\n /// Expect a call to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;\n\n /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)\n external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(\n bool checkTopic0,\n bool checkTopic1,\n bool checkTopic2,\n bool checkTopic3,\n bool checkData,\n address emitter\n ) external;\n\n /// Prepare an expected anonymous log with all topic and data checks enabled.\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmitAnonymous() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(address emitter) external;\n\n /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)\n external;\n\n /// Prepare an expected log with all topic and data checks enabled.\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmit() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(address emitter) external;\n\n /// Expects an error on next call that starts with the revert data.\n function expectPartialRevert(bytes4 revertData) external;\n\n /// Expects an error on next call to reverter address, that starts with the revert data.\n function expectPartialRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error on next call with any revert data.\n function expectRevert() external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes4 revertData) external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes calldata revertData) external;\n\n /// Expects an error with any revert data on next call to reverter address.\n function expectRevert(address reverter) external;\n\n /// Expects an error from reverter address on next call, with any revert data.\n function expectRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error from reverter address on next call, that exactly matches the revert data.\n function expectRevert(bytes calldata revertData, address reverter) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other\n /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.\n function expectSafeMemory(uint64 min, uint64 max) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.\n /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges\n /// to the set.\n function expectSafeMemoryCall(uint64 min, uint64 max) external;\n\n /// Marks a test as skipped. Must be called at the top level of a test.\n function skip(bool skipTest) external;\n\n /// Marks a test as skipped with a reason. Must be called at the top level of a test.\n function skip(bool skipTest, string calldata reason) external;\n\n /// Stops all safe memory expectation in the current subcontext.\n function stopExpectSafeMemory() external;\n}\n" + }, + "lib/ERC1155Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport 'lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol';\n\ncontract ERC1155Mintable is ERC1155(\"//uri\"), ERC1155Burnable {\n function mint(address to, uint256 id, uint256 amount) public {\n _mint(to, id, amount, bytes(\"\"));\n }\n}\n" + }, + "lib/ERC20Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\n\ncontract ERC20Mintable is ERC20(\"n\", \"s\") {\n function mint(address to, uint256 amount) public {\n _mint(to, amount);\n }\n}\n" + }, + "lib/ERC721Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol\";\n\ncontract ERC721Mintable is ERC721(\"n\", \"s\") {\n function mint(address to, uint256 tokenId) public {\n _mint(to, tokenId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() external {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC1155.sol\";\nimport \"./IERC1155Receiver.sol\";\nimport \"./extensions/IERC1155MetadataURI.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n *\n * _Available since v3.1._\n */\ncontract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {\n using Address for address;\n\n // Mapping from token ID to account balances\n mapping(uint256 => mapping(address => uint256)) private _balances;\n\n // Mapping from account to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256) public view virtual override returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {\n require(account != address(0), \"ERC1155: address zero is not a valid owner\");\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] memory accounts, uint256[] memory ids)\n public\n view\n virtual\n override\n returns (uint256[] memory)\n {\n require(accounts.length == ids.length, \"ERC1155: accounts and ids length mismatch\");\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts[i], ids[i]);\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeTransferFrom(from, to, id, amount, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeBatchTransferFrom(from, to, ids, amounts, data);\n }\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n\n emit TransferSingle(operator, from, to, id, amount);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n }\n\n emit TransferBatch(operator, from, to, ids, amounts);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the amounts in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _balances[id][to] += amount;\n emit TransferSingle(operator, address(0), to, id, amount);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; i++) {\n _balances[ids[i]][to] += amounts[i];\n }\n\n emit TransferBatch(operator, address(0), to, ids, amounts);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);\n }\n\n /**\n * @dev Destroys `amount` tokens of token type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `amount` tokens of token type `id`.\n */\n function _burn(\n address from,\n uint256 id,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n\n emit TransferSingle(operator, from, address(0), id, amount);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n */\n function _burnBatch(\n address from,\n uint256[] memory ids,\n uint256[] memory amounts\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n for (uint256 i = 0; i < ids.length; i++) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n }\n\n emit TransferBatch(operator, from, address(0), ids, amounts);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC1155: setting approval status for self\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `ids` and `amounts` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `id` and `amount` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {\n uint256[] memory array = new uint256[](1);\n array[0] = element;\n\n return array;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1155.sol\";\n\n/**\n * @dev Extension of {ERC1155} that allows token holders to destroy both their\n * own tokens and those that they have been approved to use.\n *\n * _Available since v3.1._\n */\nabstract contract ERC1155Burnable is ERC1155 {\n function burn(\n address account,\n uint256 id,\n uint256 value\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burn(account, id, value);\n }\n\n function burnBatch(\n address account,\n uint256[] memory ids,\n uint256[] memory values\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burnBatch(account, ids, values);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)\n external\n view\n returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes calldata data\n ) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) external;\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC1155Receiver.sol\";\n\n/**\n * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.\n *\n * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be\n * stuck.\n *\n * @dev _Available since v3.1._\n */\ncontract ERC1155Holder is ERC1155Receiver {\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155Receiver.sol\";\nimport \"../../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\nabstract contract ERC1155Receiver is ERC165, IERC1155Receiver {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.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 * For a generic mechanism see {ERC20PresetMinterPauser}.\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 * 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 *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => 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 * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\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 override 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 override 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 value {ERC20} uses, unless this function is\n * 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 override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override 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 `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` 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 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\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 `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `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 * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` 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 function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\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" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\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 amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` 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(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256, /* firstTokenId */\n uint256 batchSize\n ) internal virtual {\n if (batchSize > 1) {\n if (from != address(0)) {\n _balances[from] -= batchSize;\n }\n if (to != address(0)) {\n _balances[to] += batchSize;\n }\n }\n }\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Receiver.sol\";\n\n/**\n * @dev Implementation of the {IERC721Receiver} interface.\n *\n * Accepts all token transfers.\n * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.\n */\ncontract ERC721Holder is IERC721Receiver {\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n *\n * Always returns `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface.\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n // prepare call\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n\n // perform static call\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly {\n success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0x00)\n }\n\n return success && returnSize >= 0x20 && returnValue > 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableMap.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableMap.js.\n\npragma solidity ^0.8.0;\n\nimport \"./EnumerableSet.sol\";\n\n/**\n * @dev Library for managing an enumerable variant of Solidity's\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\n * type.\n *\n * Maps have the following properties:\n *\n * - Entries are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableMap for EnumerableMap.UintToAddressMap;\n *\n * // Declare a set state variable\n * EnumerableMap.UintToAddressMap private myMap;\n * }\n * ```\n *\n * The following map types are supported:\n *\n * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0\n * - `address -> uint256` (`AddressToUintMap`) since v4.6.0\n * - `bytes32 -> bytes32` (`Bytes32ToBytes32Map`) since v4.6.0\n * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0\n * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableMap.\n * ====\n */\nlibrary EnumerableMap {\n using EnumerableSet for EnumerableSet.Bytes32Set;\n\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Map type with\n // bytes32 keys and values.\n // The Map implementation uses private functions, and user-facing\n // implementations (such as Uint256ToAddressMap) are just wrappers around\n // the underlying Map.\n // This means that we can only create new EnumerableMaps for types that fit\n // in bytes32.\n\n struct Bytes32ToBytes32Map {\n // Storage of keys\n EnumerableSet.Bytes32Set _keys;\n mapping(bytes32 => bytes32) _values;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n bytes32 value\n ) internal returns (bool) {\n map._values[key] = value;\n return map._keys.add(key);\n }\n\n /**\n * @dev Removes a key-value pair from a map. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {\n delete map._values[key];\n return map._keys.remove(key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) {\n return map._keys.contains(key);\n }\n\n /**\n * @dev Returns the number of key-value pairs in the map. O(1).\n */\n function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) {\n return map._keys.length();\n }\n\n /**\n * @dev Returns the key-value pair stored at position `index` in the map. O(1).\n *\n * Note that there are no guarantees on the ordering of entries inside the\n * array, and it may change when more entries are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) {\n bytes32 key = map._keys.at(index);\n return (key, map._values[key]);\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) {\n bytes32 value = map._values[key];\n if (value == bytes32(0)) {\n return (contains(map, key), bytes32(0));\n } else {\n return (true, value);\n }\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), \"EnumerableMap: nonexistent key\");\n return value;\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), errorMessage);\n return value;\n }\n\n // UintToUintMap\n\n struct UintToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToUintMap storage map,\n uint256 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToUintMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key)));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToUintMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key), errorMessage));\n }\n\n // UintToAddressMap\n\n struct UintToAddressMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToAddressMap storage map,\n uint256 key,\n address value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToAddressMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), address(uint160(uint256(value))));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, address(uint160(uint256(value))));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToAddressMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage))));\n }\n\n // AddressToUintMap\n\n struct AddressToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n AddressToUintMap storage map,\n address key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(AddressToUintMap storage map, address key) internal returns (bool) {\n return remove(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(AddressToUintMap storage map, address key) internal view returns (bool) {\n return contains(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(AddressToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (address(uint160(uint256(key))), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key))));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(AddressToUintMap storage map, address key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n AddressToUintMap storage map,\n address key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage));\n }\n\n // Bytes32ToUintMap\n\n struct Bytes32ToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToUintMap storage map,\n bytes32 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, key, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) {\n return remove(map._inner, key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) {\n return contains(map._inner, key);\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(Bytes32ToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (key, uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, key);\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) {\n return uint256(get(map._inner, key));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToUintMap storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, key, errorMessage));\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableSet for EnumerableSet.AddressSet;\n *\n * // Declare a set state variable\n * EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSet {\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Set type with\n // bytes32 values.\n // The Set implementation uses private functions, and user-facing\n // implementations (such as AddressSet) are just wrappers around the\n // underlying Set.\n // This means that we can only create new EnumerableSets for types that fit\n // in bytes32.\n\n struct Set {\n // Storage of set values\n bytes32[] _values;\n // Position of the value in the `values` array, plus 1 because index 0\n // means a value is not in the set.\n mapping(bytes32 => uint256) _indexes;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function _add(Set storage set, bytes32 value) private returns (bool) {\n if (!_contains(set, value)) {\n set._values.push(value);\n // The value is stored at length-1, but we add 1 to all indexes\n // and use 0 as a sentinel value\n set._indexes[value] = set._values.length;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function _remove(Set storage set, bytes32 value) private returns (bool) {\n // We read and store the value's index to prevent multiple reads from the same storage slot\n uint256 valueIndex = set._indexes[value];\n\n if (valueIndex != 0) {\n // Equivalent to contains(set, value)\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n // the array, and then remove the last element (sometimes called as 'swap and pop').\n // This modifies the order of the array, as noted in {at}.\n\n uint256 toDeleteIndex = valueIndex - 1;\n uint256 lastIndex = set._values.length - 1;\n\n if (lastIndex != toDeleteIndex) {\n bytes32 lastValue = set._values[lastIndex];\n\n // Move the last value to the index where the value to delete is\n set._values[toDeleteIndex] = lastValue;\n // Update the index for the moved value\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\n }\n\n // Delete the slot where the moved value was stored\n set._values.pop();\n\n // Delete the index for the deleted slot\n delete set._indexes[value];\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\n return set._indexes[value] != 0;\n }\n\n /**\n * @dev Returns the number of values on the set. O(1).\n */\n function _length(Set storage set) private view returns (uint256) {\n return set._values.length;\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\n return set._values[index];\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function _values(Set storage set) private view returns (bytes32[] memory) {\n return set._values;\n }\n\n // Bytes32Set\n\n struct Bytes32Set {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _add(set._inner, value);\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _remove(set._inner, value);\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n return _contains(set._inner, value);\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(Bytes32Set storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n return _at(set._inner, index);\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n bytes32[] memory store = _values(set._inner);\n bytes32[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // AddressSet\n\n struct AddressSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(AddressSet storage set, address value) internal returns (bool) {\n return _add(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(AddressSet storage set, address value) internal returns (bool) {\n return _remove(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(AddressSet storage set, address value) internal view returns (bool) {\n return _contains(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(AddressSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\n return address(uint160(uint256(_at(set._inner, index))));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(AddressSet storage set) internal view returns (address[] memory) {\n bytes32[] memory store = _values(set._inner);\n address[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // UintSet\n\n struct UintSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(UintSet storage set, uint256 value) internal returns (bool) {\n return _add(set._inner, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\n return _remove(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n return _contains(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(UintSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n return uint256(_at(set._inner, index));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(UintSet storage set) internal view returns (uint256[] memory) {\n bytes32[] memory store = _values(set._inner);\n uint256[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n}\n" + } + }, + "settings": { + "evmVersion": "paris", + "optimizer": { + "enabled": true, + "mode": "3" + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + }, + "detectMissingLibraries": false, + "forceEVMLA": false, + "enableEraVMExtensions": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/deployments/zkSyncSepolia/solcInputs/29575f9c42d79da7d15102bbf5192733.json b/deployments/zkSyncSepolia/solcInputs/29575f9c42d79da7d15102bbf5192733.json new file mode 100644 index 0000000..3c8a19f --- /dev/null +++ b/deployments/zkSyncSepolia/solcInputs/29575f9c42d79da7d15102bbf5192733.json @@ -0,0 +1,346 @@ +{ + "language": "Solidity", + "sources": { + "contracts/Rewards/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\n/// @dev Adapted to pragma solidity 0.8 from https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/FullMath.sol\nlibrary FullMath {\n /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n function mulDiv(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = a * b\n // Compute the product mod 2**256 and mod 2**256 - 1\n // then use the Chinese Remainder Theorem to reconstruct\n // the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2**256 + prod0\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(a, b, not(0))\n prod0 := mul(a, b)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division\n if (prod1 == 0) {\n require(denominator > 0);\n assembly {\n result := div(prod0, denominator)\n }\n return result;\n }\n\n // Make sure the result is less than 2**256.\n // Also prevents denominator == 0\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0]\n // Compute remainder using mulmod\n uint256 remainder;\n assembly {\n remainder := mulmod(a, b, denominator)\n }\n // Subtract 256 bit number from 512 bit number\n assembly {\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator\n // Compute largest power of two divisor of denominator.\n // Always >= 1.\n uint256 twos = (0 - denominator) & denominator;\n // Divide denominator by power of two\n assembly {\n denominator := div(denominator, twos)\n }\n\n // Divide [prod1 prod0] by the factors of two\n assembly {\n prod0 := div(prod0, twos)\n }\n // Shift in bits from prod1 into prod0. For this we need\n // to flip `twos` such that it is 2**256 / twos.\n // If twos is zero, then it becomes one\n assembly {\n twos := add(div(sub(0, twos), twos), 1)\n }\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2**256\n // Now that denominator is an odd number, it has an inverse\n // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n // Compute the inverse by starting with a seed that is correct\n // correct for four bits. That is, denominator * inv = 1 mod 2**4\n uint256 inv = (3 * denominator) ^ 2;\n // Now use Newton-Raphson iteration to improve the precision.\n // Thanks to Hensel's lifting lemma, this also works in modular\n // arithmetic, doubling the correct bits in each step.\n inv *= 2 - denominator * inv; // inverse mod 2**8\n inv *= 2 - denominator * inv; // inverse mod 2**16\n inv *= 2 - denominator * inv; // inverse mod 2**32\n inv *= 2 - denominator * inv; // inverse mod 2**64\n inv *= 2 - denominator * inv; // inverse mod 2**128\n inv *= 2 - denominator * inv; // inverse mod 2**256\n\n // Because the division is now exact we can divide by multiplying\n // with the modular inverse of denominator. This will give us the\n // correct result modulo 2**256. Since the precoditions guarantee\n // that the outcome is less than 2**256, this is the final result.\n // We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inv;\n return result;\n }\n }\n\n /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n function mulDivRoundingUp(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n result = mulDiv(a, b, denominator);\n if (mulmod(a, b, denominator) > 0) {\n require(result < type(uint256).max);\n result++;\n }\n }\n}" + }, + "contracts/Rewards/libraries/PackedUint144.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.0;\n\nlibrary PackedUint144 {\n\n uint256 private constant MAX_UINT24 = type(uint24).max;\n uint256 private constant MAX_UINT48 = type(uint48).max;\n uint256 private constant MAX_UINT72 = type(uint72).max;\n uint256 private constant MAX_UINT96 = type(uint96).max;\n uint256 private constant MAX_UINT120 = type(uint120).max;\n uint256 private constant MAX_UINT144 = type(uint144).max;\n\n error NonZero();\n error FullyPacked();\n\n function pushUint24Value(uint144 packedUint144, uint24 value) internal pure returns (uint144) {\n if (value == 0) revert NonZero(); // Not strictly necessairy for our use-case since value (incentiveId) can't be 0.\n if (packedUint144 > MAX_UINT120) revert FullyPacked();\n return (packedUint144 << 24) + value;\n }\n\n function countStoredUint24Values(uint144 packedUint144) internal pure returns (uint256) {\n if (packedUint144 == 0) return 0;\n if (packedUint144 <= MAX_UINT24) return 1;\n if (packedUint144 <= MAX_UINT48) return 2;\n if (packedUint144 <= MAX_UINT72) return 3;\n if (packedUint144 <= MAX_UINT96) return 4;\n if (packedUint144 <= MAX_UINT120) return 5;\n return 6;\n }\n\n function getUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint24) {\n return uint24(packedUint144 >> (i * 24));\n }\n\n function removeUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint144) {\n if (i > 5) return packedUint144;\n uint256 rightMask = MAX_UINT144 >> (24 * (6 - i));\n uint256 leftMask = (~rightMask) << 24;\n uint256 left = packedUint144 & leftMask;\n uint256 right = packedUint144 & rightMask;\n return uint144((left >> 24) | right);\n }\n\n}\n" + }, + "contracts/Rewards/StakingContractMainnet.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.11;\n\nimport \"lib/solmate/src/utils/SafeTransferLib.sol\";\nimport \"lib/solmate/src/utils/ReentrancyGuard.sol\";\nimport \"./libraries/PackedUint144.sol\";\nimport \"./libraries/FullMath.sol\";\n\n/// @title Fork of https://github.com/sushiswap/StakingContract\n/// @notice Permissionless staking contract that allows any number of incentives to be running for any token (erc20).\n/// Incentives can be created by anyone, the total reward amount must be sent at creation.\n/// Incentives can be updated (change reward rate / duration).\n/// Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.\ncontract StakingContractMainnet is ReentrancyGuard {\n\n using SafeTransferLib for ERC20;\n using PackedUint144 for uint144;\n\n struct Incentive {\n address creator; // 1st slot\n address token; // 2nd slot\n address rewardToken; // 3rd slot\n uint32 endTime; // 3rd slot\n uint256 rewardPerLiquidity; // 4th slot\n uint32 lastRewardTime; // 5th slot\n uint112 rewardRemaining; // 5th slot\n uint112 liquidityStaked; // 5th slot\n }\n\n uint256 public incentiveCount;\n\n // Starts with 1. Zero is an invalid incentive.\n mapping(uint256 => Incentive) public incentives;\n\n /// @dev rewardPerLiquidityLast[user][incentiveId]\n /// @dev Semantic overload: if value is zero user isn't subscribed to the incentive.\n mapping(address => mapping(uint256 => uint256)) public rewardPerLiquidityLast;\n\n /// @dev userStakes[user][stakedToken]\n mapping(address => mapping(address => UserStake)) public userStakes;\n\n // Incentive count won't be greater than type(uint24).max on mainnet.\n // This means we can use uint24 values to identify incentives.\n struct UserStake {\n uint112 liquidity;\n uint144 subscribedIncentiveIds; // Six packed uint24 values.\n }\n\n error InvalidTimeFrame();\n error IncentiveOverflow();\n error AlreadySubscribed();\n error AlreadyUnsubscribed();\n error NotSubscribed();\n error OnlyCreator();\n error NoToken();\n error InvalidInput();\n error BatchError(bytes innerErorr);\n error InsufficientStakedAmount();\n error NotStaked();\n error InvalidIndex();\n\n event IncentiveCreated(address indexed token, address indexed rewardToken, address indexed creator, uint256 id, uint256 amount, uint256 startTime, uint256 endTime);\n event IncentiveUpdated(uint256 indexed id, int256 changeAmount, uint256 newStartTime, uint256 newEndTime);\n event Stake(address indexed token, address indexed user, uint256 amount);\n event Unstake(address indexed token, address indexed user, uint256 amount);\n event Subscribe(uint256 indexed id, address indexed user);\n event Unsubscribe(uint256 indexed id, address indexed user);\n event Claim(uint256 indexed id, address indexed user, uint256 amount);\n\n function createIncentive(\n address token,\n address rewardToken,\n uint112 rewardAmount,\n uint32 startTime,\n uint32 endTime\n ) external nonReentrant returns (uint256 incentiveId) {\n\n if (rewardAmount <= 0) revert InvalidInput();\n\n if (startTime < block.timestamp) startTime = uint32(block.timestamp);\n\n if (startTime >= endTime) revert InvalidTimeFrame();\n\n unchecked { incentiveId = ++incentiveCount; }\n\n if (incentiveId > type(uint24).max) revert IncentiveOverflow();\n\n _saferTransferFrom(rewardToken, rewardAmount);\n\n incentives[incentiveId] = Incentive({\n creator: msg.sender,\n token: token,\n rewardToken: rewardToken,\n lastRewardTime: startTime,\n endTime: endTime,\n rewardRemaining: rewardAmount,\n liquidityStaked: 0,\n // Initial value of rewardPerLiquidity can be arbitrarily set to a non-zero value.\n rewardPerLiquidity: type(uint256).max / 2\n });\n\n emit IncentiveCreated(token, rewardToken, msg.sender, incentiveId, rewardAmount, startTime, endTime);\n\n }\n\n function updateIncentive(\n uint256 incentiveId,\n int112 changeAmount,\n uint32 newStartTime,\n uint32 newEndTime\n ) external nonReentrant {\n\n Incentive storage incentive = incentives[incentiveId];\n\n if (msg.sender != incentive.creator) revert OnlyCreator();\n\n _accrueRewards(incentive);\n\n if (newStartTime != 0) {\n\n if (newStartTime < block.timestamp) newStartTime = uint32(block.timestamp);\n\n incentive.lastRewardTime = newStartTime;\n\n }\n\n if (newEndTime != 0) {\n\n if (newEndTime < block.timestamp) newEndTime = uint32(block.timestamp);\n\n incentive.endTime = newEndTime;\n\n }\n\n if (incentive.lastRewardTime >= incentive.endTime) revert InvalidTimeFrame();\n\n if (changeAmount > 0) {\n\n incentive.rewardRemaining += uint112(changeAmount);\n\n ERC20(incentive.rewardToken).safeTransferFrom(msg.sender, address(this), uint112(changeAmount));\n\n } else if (changeAmount < 0) {\n\n uint112 transferOut = uint112(-changeAmount);\n\n if (transferOut > incentive.rewardRemaining) transferOut = incentive.rewardRemaining;\n\n unchecked { incentive.rewardRemaining -= transferOut; }\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, transferOut);\n\n }\n\n emit IncentiveUpdated(incentiveId, changeAmount, incentive.lastRewardTime, incentive.endTime);\n\n }\n\n function stakeAndSubscribeToIncentives(\n address token,\n uint112 amount,\n uint256[] memory incentiveIds,\n bool transferExistingRewards\n ) external {\n\n stakeToken(token, amount, transferExistingRewards);\n\n uint256 n = incentiveIds.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n subscribeToIncentive(incentiveIds[i]);\n\n }\n\n }\n\n function stakeToken(address token, uint112 amount, bool transferExistingRewards) public nonReentrant {\n\n _saferTransferFrom(token, amount);\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n userStake.liquidity += amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) { // Loop through already subscribed incentives.\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards) {\n\n _claimReward(incentive, incentiveId, previousLiquidity);\n\n } else {\n\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n\n }\n\n incentive.liquidityStaked += amount;\n\n }\n\n emit Stake(token, msg.sender, amount);\n\n }\n\n function unstakeToken(address token, uint112 amount, bool transferExistingRewards) external nonReentrant {\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n if (amount > previousLiquidity) revert InsufficientStakedAmount();\n\n userStake.liquidity -= amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards || userStake.liquidity == 0) {\n\n _claimReward(incentive, incentiveId, previousLiquidity);\n\n } else {\n\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n\n }\n\n incentive.liquidityStaked -= amount;\n\n }\n\n ERC20(token).safeTransfer(msg.sender, amount);\n\n emit Unstake(token, msg.sender, amount);\n\n }\n\n function subscribeToIncentive(uint256 incentiveId) public nonReentrant {\n\n if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput();\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] != 0) revert AlreadySubscribed();\n\n Incentive storage incentive = incentives[incentiveId];\n\n if (userStakes[msg.sender][incentive.token].liquidity <= 0) revert NotStaked();\n\n _accrueRewards(incentive);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity;\n\n UserStake storage userStake = userStakes[msg.sender][incentive.token];\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.pushUint24Value(uint24(incentiveId));\n\n incentive.liquidityStaked += userStake.liquidity;\n\n emit Subscribe(incentiveId, msg.sender);\n\n }\n\n /// @param incentiveIndex ∈ [0,5]\n function unsubscribeFromIncentive(address token, uint256 incentiveIndex, bool ignoreRewards) external nonReentrant {\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n if (incentiveIndex >= userStake.subscribedIncentiveIds.countStoredUint24Values()) revert InvalidIndex();\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(incentiveIndex);\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] == 0) revert AlreadyUnsubscribed();\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n /// In case there is a token specific issue we can ignore rewards.\n if (!ignoreRewards) _claimReward(incentive, incentiveId, userStake.liquidity);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = 0;\n\n incentive.liquidityStaked -= userStake.liquidity;\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.removeUint24ValueAt(incentiveIndex);\n\n emit Unsubscribe(incentiveId, msg.sender);\n\n }\n\n function accrueRewards(uint256 incentiveId) external nonReentrant {\n\n if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput();\n\n _accrueRewards(incentives[incentiveId]);\n\n }\n\n function claimRewards(uint256[] calldata incentiveIds) external nonReentrant returns (uint256[] memory rewards) {\n\n uint256 n = incentiveIds.length;\n\n rewards = new uint256[](n);\n\n for(uint256 i = 0; i < n; i = _increment(i)) {\n\n if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) revert InvalidInput();\n\n Incentive storage incentive = incentives[incentiveIds[i]];\n\n _accrueRewards(incentive);\n\n rewards[i] = _claimReward(incentive, incentiveIds[i], userStakes[msg.sender][incentive.token].liquidity);\n\n }\n\n }\n\n function _accrueRewards(Incentive storage incentive) internal {\n\n uint256 lastRewardTime = incentive.lastRewardTime;\n\n uint256 endTime = incentive.endTime;\n\n unchecked {\n\n uint256 maxTime = block.timestamp < endTime ? block.timestamp : endTime;\n\n if (incentive.liquidityStaked > 0 && lastRewardTime < maxTime) {\n\n uint256 totalTime = endTime - lastRewardTime;\n\n uint256 passedTime = maxTime - lastRewardTime;\n\n uint256 reward = uint256(incentive.rewardRemaining) * passedTime / totalTime;\n\n // Increments of less than type(uint224).max - overflow is unrealistic.\n incentive.rewardPerLiquidity += reward * type(uint112).max / incentive.liquidityStaked;\n\n incentive.rewardRemaining -= uint112(reward);\n\n incentive.lastRewardTime = uint32(maxTime);\n\n } else if (incentive.liquidityStaked == 0 && lastRewardTime < block.timestamp) {\n\n incentive.lastRewardTime = uint32(maxTime);\n\n }\n\n }\n\n }\n\n function _claimReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity) internal returns (uint256 reward) {\n\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity;\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, reward);\n\n emit Claim(incentiveId, msg.sender, reward);\n\n }\n\n // We offset the rewardPerLiquidityLast snapshot so that the current reward is included next time we call _claimReward.\n function _saveReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity, uint112 newLiquidity) internal returns (uint256 reward) {\n\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n uint256 rewardPerLiquidityDelta = reward * type(uint112).max / newLiquidity;\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity - rewardPerLiquidityDelta;\n\n }\n\n function _calculateReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity) internal view returns (uint256 reward) {\n\n uint256 userRewardPerLiquidtyLast = rewardPerLiquidityLast[msg.sender][incentiveId];\n\n if (userRewardPerLiquidtyLast == 0) revert NotSubscribed();\n\n uint256 rewardPerLiquidityDelta;\n\n unchecked { rewardPerLiquidityDelta = incentive.rewardPerLiquidity - userRewardPerLiquidtyLast; }\n\n reward = FullMath.mulDiv(rewardPerLiquidityDelta, usersLiquidity, type(uint112).max);\n\n }\n\n function _saferTransferFrom(address token, uint256 amount) internal {\n\n if (token.code.length == 0) revert NoToken();\n\n ERC20(token).safeTransferFrom(msg.sender, address(this), amount);\n\n }\n\n function _increment(uint256 i) internal pure returns (uint256) {\n\n unchecked { return i + 1; }\n\n }\n\n function batch(bytes[] calldata datas) external {\n\n uint256 n = datas.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n (bool success, bytes memory result) = address(this).delegatecall(datas[i]);\n\n if (!success) {\n\n revert BatchError(result);\n\n }\n\n }\n\n }\n\n}\n" + }, + "contracts/Rewards/test/Console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n function _sendLogPayload(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE_ADDRESS;\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function log() internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n\n function logInt(int p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(int)\", p0));\n }\n\n function logUint(uint p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function logString(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function log(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint)\", p0, p1));\n }\n\n function log(uint p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string)\", p0, p1));\n }\n\n function log(uint p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool)\", p0, p1));\n }\n\n function log(uint p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address)\", p0, p1));\n }\n\n function log(string memory p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n\n}" + }, + "contracts/Rewards/test/mock/Token.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"lib/solmate/src/tokens/ERC20.sol\";\n\ncontract Token is ERC20 {\n constructor() ERC20(\"\", \"\", 18) {}\n function mint(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n}\n" + }, + "contracts/Rewards/test/PackedUint144.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport { Test } from \"forge-std/Test.sol\";\nimport \"../libraries/PackedUint144.sol\";\n\ncontract PackedUintTest is Test {\n\n using PackedUint144 for uint144;\n\n function testCountStoredUint24Values(uint24 a) public {\n uint144 packed = 0;\n assertEq(packed.countStoredUint24Values(), 0);\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 1);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 2);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 3);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 4);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 5);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 6);\n }\n\n function proveFail_pushUint24Value(uint144 a, uint24 b) public pure {\n while (a.countStoredUint24Values() < 7) {\n a = a.pushUint24Value(b);\n }\n }\n\n function testPushUint24Value(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint24 nil = 0;\n uint144 packed = 0;\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, nil, a))));\n if (b == 0) return;\n packed = packed.pushUint24Value(b);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, a, b))));\n if (c == 0) return;\n packed = packed.pushUint24Value(c);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, a, b, c))));\n if (d == 0) return;\n packed = packed.pushUint24Value(d);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, a, b, c, d))));\n if (e == 0) return;\n packed = packed.pushUint24Value(e);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n if (f == 0) return;\n packed = packed.pushUint24Value(f);\n assertEq(packed, uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n\n function testGetUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n assertEq(packed.getUint24ValueAt(6), uint24(0));\n assertEq(packed.getUint24ValueAt(5), a);\n assertEq(packed.getUint24ValueAt(4), b);\n assertEq(packed.getUint24ValueAt(3), c);\n assertEq(packed.getUint24ValueAt(2), d);\n assertEq(packed.getUint24ValueAt(1), e);\n assertEq(packed.getUint24ValueAt(0), f);\n }\n\n function testRemoveUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n uint24 nil = 0;\n assertEq(packed.removeUint24ValueAt(0), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n assertEq(packed.removeUint24ValueAt(1), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, f))));\n assertEq(packed.removeUint24ValueAt(2), uint144(bytes18(abi.encodePacked(nil, a, b, c, e, f))));\n assertEq(packed.removeUint24ValueAt(3), uint144(bytes18(abi.encodePacked(nil, a, b, d, e, f))));\n assertEq(packed.removeUint24ValueAt(4), uint144(bytes18(abi.encodePacked(nil, a, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(5), uint144(bytes18(abi.encodePacked(nil, b, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(6), uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n\n}\n" + }, + "contracts/Rewards/test/StakingContractMainnet.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"./TestSetup.sol\";\n\ncontract CreateIncentiveTest is TestSetup {\n\n function testCreateIncentive(\n uint112 amount,\n uint32 startTime,\n uint32 endTime\n ) public {\n _createIncentive(address(tokenA), address(tokenB), amount, startTime, endTime);\n }\n\n function testFailCreateIncentiveInvalidRewardToken(uint32 startTime, uint32 endTime) public {\n _createIncentive(address(tokenA), zeroAddress, 1, startTime, endTime);\n }\n\n function testUpdateIncentive(\n int112 changeAmount0,\n int112 changeAmount1,\n uint32 startTime0,\n uint32 startTime1,\n uint32 endTime0,\n uint32 endTime1\n ) public {\n _updateIncentive(ongoingIncentive, changeAmount0, startTime0, endTime0);\n _updateIncentive(ongoingIncentive, changeAmount1, startTime1, endTime1);\n }\n\n function testStake(uint112 amount0, uint112 amount1) public {\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _stake(address(tokenA), amount1, johnDoe, true);\n }\n\n function testSubscribe() public {\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribeSeparate(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribe(uint112 amount) public {\n uint256[] memory idsToSubscribe = new uint256[](2);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n _stakeAndSubscribeToIncentives(address(tokenA), amount, idsToSubscribe, johnDoe, true);\n }\n\n function testAccrue(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n uint256 step = testIncentiveDuration / 2;\n vm.warp(block.timestamp + step);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n _accrueRewards(0);\n _accrueRewards(stakingContract.incentiveCount() + 1);\n }\n\n function testClaimRewards0() public {\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n }\n\n function testClaimRewards1(uint112 amount) public {\n if (amount == 0) return;\n _stake(address(tokenA), amount, johnDoe, true);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n vm.warp(incentive.endTime);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEqInexact(reward, totalReward, 1);\n incentive = _getIncentive(ongoingIncentive);\n assertEq(incentive.rewardRemaining, 0);\n }\n\n function testClaimRewards2(uint96 amount0, uint96 amount1) public {\n if (amount0 == 0 || amount1 == 0) return;\n uint256 maxRatio = 1000000;\n if (amount0 / amount1 > 1000000) return; // to avoid rounding innacuracies for easier testing\n if (amount1 / amount0 > 1000000) return;\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _stake(address(tokenA), amount0, johnDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n uint256 soloReward = _claimReward(ongoingIncentive, johnDoe);\n\n _subscribeToIncentive(ongoingIncentive, janeDoe);\n vm.warp(incentive.endTime);\n\n uint256 reward0 = _claimReward(ongoingIncentive, johnDoe);\n uint256 reward1 = _claimReward(ongoingIncentive, janeDoe);\n\n incentive = _getIncentive(ongoingIncentive);\n uint256 ratio;\n if (amount0 / amount1 > 0) {\n ratio = maxRatio * amount0 / amount1;\n assertEqInexact(maxRatio * reward0 / reward1, ratio, 10);\n }\n if (amount1 / amount0 > 0) {\n ratio = maxRatio * amount1 / amount0;\n assertEqInexact(maxRatio * reward1 / reward0, ratio, 10);\n }\n assertEqInexact(reward0 + reward1 + soloReward, totalReward, 10);\n }\n\n function testUnstakeSaveRewards() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 rewardRemaining = incentive.rewardRemaining;\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2 + 100);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp(incentive.endTime);\n _unstake(address(tokenA), 1, johnDoe, false);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, rewardRemaining);\n reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, 0);\n }\n\n function testFalseStakeAndSubscribe(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(0, johnDoe);\n _subscribeToIncentive(stakingContract.incentiveCount() + 1, johnDoe);\n }\n\n function testStakeInvalidToken() public {\n vm.prank(johnDoe);\n vm.expectRevert(noToken);\n stakingContract.stakeToken(janeDoe, 1, true);\n }\n\n function testRewardRate() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n uint256 oldRate = _rewardRate(ongoingIncentive);\n vm.warp(block.timestamp + testIncentiveDuration / 2);\n stakingContract.accrueRewards(ongoingIncentive);\n uint256 newRate = _rewardRate(ongoingIncentive);\n assertEq(oldRate, newRate);\n }\n\n function testBatch() public {\n bytes[] memory data = new bytes[](2);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n assertEq(liquidity, 1);\n assertEq(subscriptions, ongoingIncentive);\n }\n\n function testBatch2() public {\n bytes[] memory data = new bytes[](3);\n uint256[] memory idsToSubscribe = new uint256[](3);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n idsToSubscribe[2] = futureIncentive;\n\n data[0] = abi.encodeCall(stakingContract.stakeAndSubscribeToIncentives, (address(tokenA), 1, idsToSubscribe, true));\n data[1] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 1, false));\n data[2] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 0, false));\n\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n\n assertEq(liquidity, 1);\n assertEq(subscriptions, pastIncentive);\n }\n\n function testFailedBatchRaisesProperError() public {\n bytes[] memory data = new bytes[](3);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n data[2] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n vm.expectRevert(alreadySubscribed);\n stakingContract.batch(data);\n }\n\n}\n" + }, + "contracts/Rewards/test/TestSetup.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\nimport \"../StakingContractMainnet.sol\";\nimport \"./mock/Token.sol\";\n\ncontract TestSetup is Test {\n\n address johnDoe = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266;\n address janeDoe = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8;\n address zeroAddress = 0x0000000000000000000000000000000000000000;\n\n uint256 MAX_UINT256 = type(uint256).max;\n uint112 MAX_UINT112 = type(uint112).max;\n uint32 testIncentiveDuration = 2592000;\n uint112 testIncentiveAmount = 1e21;\n\n bytes4 invalidTimeFrame = bytes4(keccak256(\"InvalidTimeFrame()\"));\n bytes4 notSubscribed = bytes4(keccak256(\"NotSubscribed()\"));\n bytes4 alreadySubscribed = bytes4(keccak256(\"AlreadySubscribed()\"));\n bytes4 noToken = bytes4(keccak256(\"NoToken()\"));\n bytes4 invalidInput = bytes4(keccak256(\"InvalidInput()\"));\n bytes4 insufficientStakedAmount = bytes4(keccak256(\"InsufficientStakedAmount\"));\n bytes4 notStaked = bytes4(keccak256(\"NotStaked()\"));\n bytes4 invalidIndex = bytes4(keccak256(\"InvalidIndex()\"));\n bytes4 panic = 0x4e487b71;\n bytes overflow = abi.encodePacked(panic, bytes32(uint256(0x11)));\n\n StakingContractMainnet stakingContract = new StakingContractMainnet();\n\n Token tokenA = new Token();\n Token tokenB = new Token();\n Token tokenC = new Token();\n\n uint256 pastIncentive;\n uint256 ongoingIncentive;\n uint256 futureIncentive;\n\n function setUp() public {\n tokenA.mint(MAX_UINT256);\n tokenB.mint(MAX_UINT256);\n tokenC.mint(MAX_UINT256);\n\n tokenA.approve(address(stakingContract), MAX_UINT256);\n tokenB.approve(address(stakingContract), MAX_UINT256);\n tokenC.approve(address(stakingContract), MAX_UINT256);\n\n tokenA.transfer(johnDoe, MAX_UINT112);\n tokenA.transfer(janeDoe, MAX_UINT112);\n\n vm.prank(johnDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n vm.prank(janeDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n uint112 amount = testIncentiveAmount;\n uint256 currentTime = testIncentiveDuration * 30;\n uint256 duration = testIncentiveDuration;\n\n vm.warp(currentTime - duration);\n pastIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration));\n vm.warp(currentTime);\n ongoingIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration));\n futureIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp + duration), uint32(block.timestamp + duration * 2));\n }\n\n function testFail_basic_sanity() public {\n assertTrue(false);\n }\n\n function test_basic_sanity() public {\n assertTrue(true);\n }\n\n function _createIncentive(\n address token,\n address rewardToken,\n uint112 amount,\n uint32 startTime,\n uint32 endTime\n ) public returns(uint256) {\n uint256 count = stakingContract.incentiveCount();\n uint256 thisBalance = Token(rewardToken).balanceOf(address(this));\n uint256 stakingContractBalance = Token(rewardToken).balanceOf(address(stakingContract));\n\n if (amount <= 0) {\n vm.expectRevert(invalidInput);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n }\n\n if (endTime <= startTime || endTime <= block.timestamp) {\n vm.expectRevert(invalidTimeFrame);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n }\n\n uint256 id = stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(id);\n\n assertEq(incentive.creator, address(this));\n assertEq(incentive.token, token);\n assertEq(incentive.rewardToken, rewardToken);\n assertEq(incentive.lastRewardTime, startTime < block.timestamp ? uint32(block.timestamp) : startTime);\n assertEq(incentive.endTime, endTime);\n assertEq(incentive.rewardRemaining, amount);\n assertEq(incentive.liquidityStaked, 0);\n assertEq(incentive.rewardPerLiquidity, type(uint256).max / 2);\n assertEq(count + 1, id);\n assertEq(stakingContract.incentiveCount(), id);\n assertEq(thisBalance - amount, Token(rewardToken).balanceOf(address(this)));\n assertEq(stakingContractBalance + amount, Token(rewardToken).balanceOf(address(stakingContract)));\n return id;\n }\n\n function _updateIncentive(\n uint256 incentiveId,\n int112 changeAmount,\n uint32 startTime,\n uint32 endTime\n ) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n Token(incentive.rewardToken).balanceOf(address(this));\n Token(incentive.rewardToken).balanceOf(address(stakingContract));\n uint32 newStartTime = startTime == 0 ? incentive.lastRewardTime : (startTime < uint32(block.timestamp) ? uint32(block.timestamp) : startTime);\n uint32 newEndTime = endTime == 0 ? incentive.endTime : (endTime < uint32(block.timestamp) ? uint32(block.timestamp) : endTime);\n\n if (newStartTime >= newEndTime) {\n vm.expectRevert(invalidTimeFrame);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount == type(int112).min) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount > 0 && uint112(changeAmount) + uint256(incentive.rewardRemaining) > type(uint112).max) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n\n if (changeAmount < 0 && uint112(-changeAmount) > incentive.rewardRemaining) {\n changeAmount = -int112(incentive.rewardRemaining);\n }\n\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.lastRewardTime, newStartTime);\n assertEq(updatedIncentive.endTime, newEndTime);\n assertEq(updatedIncentive.rewardRemaining, changeAmount < 0 ? incentive.rewardRemaining - uint112(-changeAmount) : incentive.rewardRemaining + uint112(changeAmount));\n assertEq(updatedIncentive.creator, incentive.creator);\n assertEq(updatedIncentive.token, incentive.token);\n assertEq(updatedIncentive.rewardToken, incentive.rewardToken);\n assertEq(updatedIncentive.liquidityStaked, incentive.liquidityStaked);\n }\n\n function _stake(address token, uint112 amount, address from, bool transferRewards) public {\n // todo check if current incentives stakes got updates correctly\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(\"TRANSFER_FROM_FAILED\");\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n }\n\n function _unstake(address token, uint112 amount, address from, bool transferRewards) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userLiquidityBefore) {\n vm.expectRevert(insufficientStakedAmount);\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore + amount, userBalanceAfter);\n assertEq(userLiquidityBefore - amount, userLiquidityAfter);\n }\n\n function _subscribeToIncentive(uint256 incentiveId, address from) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint112 liquidity = _getUsersLiquidityStaked(from, incentive.token);\n\n (uint256 rpl) = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.prank(from);\n vm.expectRevert(invalidInput);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (rpl != 0) {\n vm.prank(from);\n vm.expectRevert(alreadySubscribed);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (liquidity == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n vm.prank(from);\n stakingContract.subscribeToIncentive(incentiveId);\n\n StakingContractMainnet.Incentive memory incentiveAfter = _getIncentive(incentiveId);\n uint144 subscribedIncentives = _getUsersSubscribedIncentives(from, incentive.token);\n\n assertEq(incentive.liquidityStaked + liquidity, incentiveAfter.liquidityStaked);\n assertEq(uint24(subscribedIncentives), uint24(incentiveId));\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), incentiveAfter.rewardPerLiquidity);\n if (block.timestamp > incentive.lastRewardTime) {\n assertEq(incentiveAfter.lastRewardTime, block.timestamp > incentiveAfter.endTime ? incentiveAfter.endTime : block.timestamp);\n } else {\n assertEq(incentiveAfter.lastRewardTime, incentive.lastRewardTime);\n }\n }\n\n function _stakeAndSubscribeToIncentives(address token, uint112 amount, uint256[] memory incentiveIds, address from, bool transferRewards) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesBefore = _getUsersSubscribedIncentives(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesAfter = _getUsersSubscribedIncentives(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n assertLt(subscribedIncentivesBefore, subscribedIncentivesAfter);\n }\n\n function _accrueRewards(uint256 incentiveId) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 rewardPerLiquidity;\n uint256 rewardRemaining;\n uint256 lastRewardTime;\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n if (\n incentive.liquidityStaked > 0 &&\n incentive.lastRewardTime < maxTime\n ) {\n (rewardPerLiquidity, rewardRemaining, lastRewardTime) = _calculateAccrueChange(incentiveId);\n } else {\n rewardPerLiquidity = incentive.rewardPerLiquidity;\n rewardRemaining = incentive.rewardRemaining;\n if (incentive.lastRewardTime < block.timestamp){\n lastRewardTime = maxTime;\n } else {\n lastRewardTime = incentive.lastRewardTime;\n }\n }\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.expectRevert(invalidInput);\n stakingContract.accrueRewards(incentiveId);\n return;\n }\n\n stakingContract.accrueRewards(incentiveId);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(updatedIncentive.lastRewardTime, lastRewardTime);\n assertEq(updatedIncentive.rewardRemaining, rewardRemaining);\n }\n\n function _calculateAccrueChange(uint256 incentiveId) public view returns (uint256 rewardPerLiquidity, uint256 rewardRemaining, uint256 lastRewardTime) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 totalTime = incentive.endTime - incentive.lastRewardTime;\n if (totalTime == 0 || incentive.liquidityStaked == 0 || block.timestamp < incentive.lastRewardTime) {\n return (incentive.rewardPerLiquidity, incentive.rewardRemaining, incentive.lastRewardTime);\n }\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n uint256 passedTime = maxTime - incentive.lastRewardTime;\n uint256 reward = uint256(passedTime) * incentive.rewardRemaining / totalTime;\n uint256 rplChange = reward * type(uint112).max / incentive.liquidityStaked;\n rewardPerLiquidity = incentive.rewardPerLiquidity + rplChange;\n rewardRemaining = incentive.rewardRemaining - reward;\n lastRewardTime = maxTime;\n }\n\n function _claimReward(uint256 incentiveId, address from) public returns(uint256 reward) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 oldBalance = Token(incentive.rewardToken).balanceOf(from);\n (uint256 rewardPerLiquidityLast, uint256 rewardPerLiquidity, uint256 expectedReward) = _calculateReward(incentiveId, from);\n uint256[] memory incentiveIds = new uint256[](1);\n incentiveIds[0] = incentiveId;\n if (rewardPerLiquidityLast == 0) {\n vm.prank(from);\n vm.expectRevert(notSubscribed);\n stakingContract.claimRewards(incentiveIds);\n return 0;\n }\n vm.prank(from);\n uint256[] memory rewards = stakingContract.claimRewards(incentiveIds);\n reward = rewards[0];\n assertEq(reward, expectedReward);\n uint256 newBalance = Token(incentive.rewardToken).balanceOf(from);\n assertEq(newBalance - oldBalance, reward);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), rewardPerLiquidity);\n }\n\n function _calculateReward(uint256 incentiveId, address from) internal view returns (uint256 rplLast, uint256 newRewardPerLiquidity, uint256 reward) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n (newRewardPerLiquidity,,) = _calculateAccrueChange(incentiveId);\n uint256 usersLiquidity = _getUsersLiquidityStaked(from, incentive.token);\n rplLast = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n if (rplLast != 0) {\n reward = (newRewardPerLiquidity - rplLast) * usersLiquidity / type(uint112).max;\n }\n }\n\n function _getUsersLiquidityStaked(address user, address token) public view returns (uint112) {\n (uint112 liquidity,) = stakingContract.userStakes(user, token);\n return liquidity;\n }\n\n function _getUsersSubscribedIncentives(address user, address token) public view returns (uint144) {\n (, uint144 incentiveIds) = stakingContract.userStakes(user, token);\n return incentiveIds;\n }\n\n function _rewardRate(uint256 incentiveId) public view returns (uint256) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n if (incentive.endTime != incentive.lastRewardTime) {\n return incentive.rewardRemaining * uint256(type(uint112).max) / (incentive.endTime - incentive.lastRewardTime);\n } else {\n return 0;\n }\n }\n\n function _getIncentive(uint256 id) public view returns (StakingContractMainnet.Incentive memory incentive) {\n (\n address creator,\n address token,\n address rewardToken,\n uint32 endTime,\n uint256 rewardPerLiquidity,\n uint32 lastRewardTime,\n uint112 rewardRemaining,\n uint112 liquidityStaked\n ) = stakingContract.incentives(id);\n incentive = StakingContractMainnet.Incentive(\n creator,\n token,\n rewardToken,\n endTime,\n rewardPerLiquidity,\n lastRewardTime,\n rewardRemaining,\n liquidityStaked\n );\n }\n\n function assertEqInexact(uint256 value, uint256 shouldBe, uint256 err) public {\n assertTrue(value <= shouldBe + err);\n assertTrue(value >= shouldBe - err);\n }\n}\n" + }, + "contracts/Router/IMagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol\";\nimport \"../Vault/INftVault.sol\";\n\n/// @title Router contract for swapping, managing liquidity and interacting with vaults\ninterface IMagicSwapV2Router is IUniswapV2Router01 {\n /// @dev Amounts does not match\n error MagicSwapV2WrongAmounts();\n error MagicSwapV2WrongAmountDeposited();\n error MagicSwapV2WrongAmountADeposited();\n error MagicSwapV2WrongAmountBDeposited();\n error MagicSwapV2InvalidPath();\n\n /// @notice Struct that specifies data for liquidity-related operations on vault.\n /// @param token address of NFT vault\n /// @param collection list of NFT addresses\n /// @param tokenId list of token IDs\n /// @param amount list of token amounts. For ERC721 amount is always 1.\n struct NftVaultLiquidityData {\n INftVault token;\n address[] collection;\n uint256[] tokenId;\n uint256[] amount;\n }\n\n /// @notice Emitted when NFT-ERC20 liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vault vault data of deposited NFTs\n event NFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vaultA vault data of deposited NFTs for first side\n /// @param vaultB vault data of deposited NFTs for second side\n event NFTNFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Emitted when NFT-ERC20 liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vault vault data of withdrawn NFTs\n event NFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vaultA vault data of withdrawn NFTs for first side\n /// @param vaultB vault data of withdrawn NFTs for second side\n event NFTNFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Deposit NFTs to vault\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to deposit\n /// @param _tokenId list of token IDs to deposit\n /// @param _amount list of token amounts to deposit. For ERC721 amount is always 1.\n /// @param _vault address of the vault where NFTs are deposited\n /// @param _to address that gets ERC20 for deposited NFTs\n /// @return amountMinted amount of ERC20 minted for deposited NFTs\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted);\n\n /// @dev Withdraw NFTs from vault\n /// @dev Vault token must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to withdraw\n /// @param _tokenId list of token IDs to withdraw\n /// @param _amount list of token amounts to withdraw. For ERC721 amount is always 1.\n /// @param _vault address of the vault to withdraw NFTs from\n /// @param _to address that gets withdrawn NFTs\n /// @return amountBurned amount of ERC20 redeemed for NFTs\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and second ERC20 token\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _tokenB address of token B\n /// @param _amountBDesired desired amount of token B to be added as liquidity\n /// @param _amountBMin minimum amount of token B to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and ETH\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _amountETHMin desired amount of ETH to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountToken amount of vault token added as liquidity\n /// @return amountETH amount of ETH added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using two NFT vaults\n /// @dev All NFTs must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to deposit as liquidity for first side\n /// @param _vaultB vault data for NFTs to deposit as liquidity for second side\n /// @param _amountAMin minimum amount of token A to be deposited\n /// @param _amountBMin minimum amount of token B to be deposited\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ERC20 token\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _tokenB address of token B\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to Token B\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ETH\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountTokenMin minimum amount of vault token to be redeemed\n /// @param _amountETHMin minimum amount of ETH to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to ETH\n /// @return amountToken amount of vault token redeemed\n /// @return amountETH amount of ETH redeemed\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs\n /// @dev Lp token must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to withdraw from liquidity for first side\n /// @param _vaultB vault data for NFTs to withdraw from liquidity for second side\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Swap NFTs for ERC20\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for token\n /// @param _tokenId list of token IDs to swap for token\n /// @param _amount list of token amounts to swap for token. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of output token expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets output token\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for ETH\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for ETH\n /// @param _tokenId list of token IDs to swap for ETH\n /// @param _amount list of token amounts to swap for ETH. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of ETH expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets ETH\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap ERC20 for NFTs\n /// @dev ERC20 must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for tokens\n /// @param _tokenId list of token IDs to receive for tokens\n /// @param _amount list of token amounts to receive for tokens. For ERC721 amount is always 1.\n /// @param _amountInMax maximum acceptable amount of token to swap for NFTs\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap ETH for NFTs\n /// @dev Does not require any approvals. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for ETH\n /// @param _tokenId list of token IDs to receive for ETH\n /// @param _amount list of token amounts to receive for ETH. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for NFTs\n /// @dev All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover\n /// during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn`\n /// as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.\n /// @param _collectionIn list of input NFT addresses\n /// @param _tokenIdIn list of input token IDs\n /// @param _amountIn list of input token amounts. For ERC721 amount is always 1.\n /// @param _collectionOut list of output NFT addresses\n /// @param _tokenIdOut list of output token IDs\n /// @param _amountOut list of output token amounts. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n}\n" + }, + "contracts/Router/MagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"./IMagicSwapV2Router.sol\";\nimport \"../UniswapV2/periphery/UniswapV2Router02.sol\";\nimport \"../UniswapV2/core/interfaces/IUniswapV2Pair.sol\";\n\n// ▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▒░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▒░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n// ▓▓▓▓▓▓▓▓▓\n\ncontract MagicSwapV2Router is IMagicSwapV2Router, UniswapV2Router02 {\n uint256 public constant ONE = 1e18;\n address public constant BURN_ADDRESS = address(0xdead);\n\n constructor(address _factory, address _WETH) UniswapV2Router02(_factory, _WETH) {}\n\n /// @inheritdoc IMagicSwapV2Router\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted) {\n amountMinted = _depositVault(_collection, _tokenId, _amount, _vault, _to);\n }\n\n function _depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) internal returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n INftVault.CollectionData memory collectionData = _vault.getAllowedCollectionData(_collection[i]);\n if (collectionData.nftType == INftVault.NftType.ERC721) {\n IERC721(_collection[i]).safeTransferFrom(msg.sender, address(_vault), _tokenId[i]);\n } else if (collectionData.nftType == INftVault.NftType.ERC1155) {\n IERC1155(_collection[i]).safeTransferFrom(\n msg.sender, address(_vault), _tokenId[i], _amount[i], bytes(\"\")\n );\n } else {\n revert INftVault.UnsupportedNft();\n }\n }\n\n amountMinted = _vault.depositBatch(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned) {\n amountBurned = _withdrawVault(_collection, _tokenId, _amount, _vault, msg.sender, _to);\n }\n\n function _withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _from,\n address _to\n ) internal returns (uint256 amountBurned) {\n IERC20 vaultToken = IERC20(address(_vault));\n uint256 amountToBurn = nftAmountToERC20(_amount);\n uint256 fromBalance = vaultToken.balanceOf(_from);\n uint256 totalSupply = vaultToken.totalSupply();\n\n /// @dev if user withdraws all NFT tokens but does not have totalSupply of ERC20 tokens (some are locked\n /// in UniV2 pool), we optimistically assume that user has enough and adjust `amountToBurn`\n /// to user balance. If user balance does not meet required minimum then Vault will revert anyway.\n if (amountToBurn == totalSupply && fromBalance < totalSupply) {\n amountToBurn = fromBalance;\n }\n\n if (_from == address(this)) _approveIfNeeded(address(_vault), amountToBurn);\n\n vaultToken.transferFrom(_from, address(_vault), amountToBurn);\n amountBurned = _vault.withdrawBatch(_to, _collection, _tokenId, _amount);\n\n if (amountToBurn != amountBurned) revert MagicSwapV2WrongAmounts();\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vault.token), _tokenB, amountAMinted, _amountBDesired, amountAMinted, _amountBMin);\n\n if(amountAMinted != amountA) revert MagicSwapV2WrongAmountDeposited();\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n TransferHelper.safeTransfer(address(_vault.token), pair, amountA);\n TransferHelper.safeTransferFrom(_tokenB, msg.sender, pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount) {\n uint256 amountMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n _approveIfNeeded(address(_vault.token), amountMinted);\n\n (amountToken, amountETH, lpAmount) =\n _addLiquidityETH(address(_vault.token), amountMinted, amountMinted, _amountETHMin, address(this), _to, _deadline);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this));\n uint256 amountBMinted = _depositVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vaultA.token), address(_vaultB.token), amountAMinted, amountBMinted, _amountAMin, _amountBMin);\n\n if (amountAMinted != amountA) {\n if (amountAMinted < amountA) {\n revert MagicSwapV2WrongAmountADeposited();\n }\n \n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountAMinted - amountA);\n }\n\n if (amountBMinted != amountB) {\n if (amountBMinted < amountB) {\n revert MagicSwapV2WrongAmountBDeposited();\n }\n\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountBMinted - amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n TransferHelper.safeTransfer(address(_vaultA.token), pair, amountA);\n TransferHelper.safeTransfer(address(_vaultB.token), pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTNFTLiquidityAdded(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vault.token), _tokenB, _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountA -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), _tokenB, amountA);\n\n amountA = 0;\n amountB += amountOut;\n } else if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountA);\n }\n\n TransferHelper.safeTransfer(_tokenB, _to, amountB);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(address(_vault.token), WETH, _lpAmount, _amountTokenMin, _amountETHMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountToken -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), WETH, amountToken);\n\n amountToken = 0;\n amountETH += amountOut;\n } else if (amountToken > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountToken);\n }\n\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(_to, amountETH);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vaultA.token), address(_vaultB.token), _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurnedA = _withdrawVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this), _to);\n uint256 amountBurnedB = _withdrawVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this), _to);\n\n amountA -= amountBurnedA;\n amountB -= amountBurnedB;\n\n if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountA);\n }\n\n if (amountB > 0) {\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n \n emit NFTNFTLiquidityRemoved(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), _to, _deadline);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n if(_path[_path.length - 1] != WETH) revert MagicSwapV2InvalidPath();\n\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), address(this), _deadline);\n\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(_to, amounts[amounts.length - 1]);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = _swapTokensForExactTokens(amountOut, _amountInMax, _path, msg.sender, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = swapETHForExactTokens(amountOut, _path, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collectionIn, _tokenIdIn, _amountIn, INftVault(_path[0]), address(this));\n address vaultOut = _path[_path.length - 1];\n uint256 amountOutMin = nftAmountToERC20(_amountOut);\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, _path, address(this), address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collectionOut, _tokenIdOut, _amountOut, INftVault(vaultOut), address(this), _to);\n\n uint256 dust = amounts[amounts.length - 1] - amountOutMin;\n\n // send leftover of input token back to the pool and sync\n if (dust > 0) {\n // refund user unused token\n address pair = UniswapV2Library.pairFor(factory, _path[_path.length - 2], vaultOut);\n TransferHelper.safeTransfer(vaultOut, pair, dust);\n IUniswapV2Pair(pair).sync();\n }\n }\n\n function swapLeftover(address _tokenA, address _tokenB, uint256 _amountIn) internal returns (uint256 amountOut) {\n if (_amountIn == 0) return 0;\n\n address[] memory path = new address[](2);\n path[0] = _tokenA;\n path[1] = _tokenB;\n\n _approveIfNeeded(_tokenA, _amountIn);\n\n // swap leftover to tokenB\n // TODO: can be front-run, issue?\n uint256[] memory amounts =\n _swapExactTokensForTokens(_amountIn, 1, path, address(this), address(this), block.timestamp);\n\n return amounts[1];\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal pure returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function _approveIfNeeded(address _token, uint256 _amount) internal {\n if (IERC20(_token).allowance(address(this), address(this)) < _amount) {\n SafeERC20.safeApprove(IERC20(_token), address(this), 0);\n SafeERC20.safeApprove(IERC20(_token), address(this), type(uint256).max);\n }\n }\n}\n" + }, + "contracts/Router/test/MagicSwapV2Router.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"./mock/WETH.sol\";\nimport \"../MagicSwapV2Router.sol\";\nimport \"../../UniswapV2/core/UniswapV2Factory.sol\";\nimport \"../../Vault/NftVaultFactory.sol\";\n\ncontract MagicSwapV2RouterTest is Test {\n WETH weth;\n UniswapV2Factory factory;\n MagicSwapV2Router magicSwapV2Router;\n NftVaultFactory nftVaultFactory;\n ERC721Mintable nft1;\n ERC1155Mintable nft2;\n\n uint256 ONE;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData[] public collections1;\n INftVault.CollectionData[] public collections2;\n\n INftVault vault1;\n INftVault vault2;\n\n address[] public collectionArray;\n uint256[] public tokenIdArray;\n uint256[] public amountArray;\n\n address[] public collectionArray1;\n uint256[] public tokenIdArray1;\n uint256[] public amountArray1;\n\n function setUp() public {\n weth = new WETH();\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n magicSwapV2Router = new MagicSwapV2Router(address(factory), address(weth));\n\n nftVaultFactory = new NftVaultFactory();\n\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections1.push(collectionERC721all);\n vault1 = nftVaultFactory.createVault(collections1);\n nft1 = ERC721Mintable(collectionERC721all.addr);\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections2.push(collectionERC721all);\n collections2.push(collectionERC1155all);\n vault2 = nftVaultFactory.createVault(collections2);\n nft2 = ERC1155Mintable(collectionERC1155all.addr);\n\n ONE = vault1.ONE();\n }\n\n function _dealWeth(address _user, uint256 _amount) public {\n vm.deal(_user, _amount);\n vm.prank(_user);\n weth.deposit{value: _amount}();\n vm.prank(_user);\n weth.approve(address(magicSwapV2Router), _amount);\n }\n\n function _copyStorage()\n public\n view\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n _collection = collectionArray;\n _tokenId = tokenIdArray;\n _amount = amountArray;\n }\n\n function _mintTokens(address _user)\n public\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n (_collection, _tokenId, _amount) = _copyStorage();\n\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n nft1.mint(_user, _tokenId[i]);\n vm.prank(_user);\n nft1.setApprovalForAll(address(magicSwapV2Router), true);\n } else {\n nft2.mint(_user, _tokenId[i], _amount[i]);\n vm.prank(_user);\n nft2.setApprovalForAll(address(magicSwapV2Router), true);\n }\n }\n }\n\n function _checkNftBalances(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address _owner\n ) public {\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n assertEq(nft1.ownerOf(_tokenId[i]), _owner);\n } else {\n assertEq(nft2.balanceOf(_owner, _tokenId[i]), _amount[i]);\n }\n }\n }\n\n function _checkERC20Balances(\n address[] memory _collection,\n uint256[] memory,\n uint256[] memory _amount,\n address _vault,\n address _owner,\n uint256 _prevBalance\n ) public {\n uint256 totalAmount;\n\n for (uint256 i = 0; i < _collection.length; i++) {\n totalAmount += _amount[i];\n }\n\n assertEq(IERC20(_vault).balanceOf(_owner), totalAmount * ONE + _prevBalance);\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal view returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function testDepositWithdrawVault(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 50);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint64).max);\n\n // deposit 1\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n vm.prank(user1);\n uint256 amountMinted1 = magicSwapV2Router.depositVault(_collection1, _tokenId1, _amount1, vault1, user1);\n\n assertEq(amountMinted1, nftAmountToERC20(_amount1));\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault1));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault1), user1, 0);\n\n // deposit 2\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n vm.prank(user2);\n uint256 amountMinted2 = magicSwapV2Router.depositVault(_collection2, _tokenId2, _amount2, vault2, user2);\n\n assertEq(amountMinted2, nftAmountToERC20(_amount2));\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), user2, 0);\n\n // withdraw 1\n vm.startPrank(user1);\n IERC20(address(vault1)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount1));\n\n uint256 amountBurned1 = magicSwapV2Router.withdrawVault(_collection1, _tokenId1, _amount1, vault1, user3);\n vm.stopPrank();\n\n assertEq(amountBurned1, amountMinted1);\n assertEq(IERC20(address(vault1)).balanceOf(user1), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(vault1)), 0);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user3);\n\n // withdraw 2\n\n collectionArray = [address(nft1), address(nft1), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n (address[] memory _collection3,,) = _mintTokens(user2);\n\n vm.startPrank(user2);\n IERC20(address(vault2)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount2));\n\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2WrongAmounts.selector);\n magicSwapV2Router.withdrawVault(_collection3, _tokenId2, _amount2, vault2, user4);\n\n uint256 leftover = vault2.ONE() - vault2.LAST_NFT_AMOUNT();\n IERC20(address(vault2)).transfer(user4, leftover + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n vm.stopPrank();\n\n vm.prank(user4);\n IERC20(address(vault2)).transfer(user2, 1);\n\n vm.prank(user2);\n uint256 amountBurned2 = magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n\n assertEq(amountBurned2 + leftover, amountMinted2);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(vault2)), 0);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, user4);\n }\n\n function testAddLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n // UniswapV2Pair balance is using uint112\n // and amount of NFTs is multiplied by 1e18 when transformed to ERC20\n // and we are depositing multple NFTs\n // so trying to avoid overflow revert\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testAddLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n console2.logBytes32(keccak256(type(UniswapV2Pair).creationCode));\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n vm.deal(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired1\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n vm.deal(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFTETH{value: amountBDesired2}(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired2\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testAddLiquidityNFTNFT(uint256 _tokenId) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1, 1, 1];\n\n (address[] memory _collectionA1, uint256[] memory _tokenIdA1, uint256[] memory _amountA1) = _mintTokens(user1);\n\n collectionArray = [address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++];\n amountArray = [5, 5];\n \n (address[] memory _collectionB1, uint256[] memory _tokenIdB1, uint256[] memory _amountB1) = _mintTokens(user1);\n\n vm.prank(user1);\n\n address pair;\n uint256 amountA1;\n uint256 amountB1;\n {\n (uint256 __amountA1, uint256 __amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA1,\n tokenId: _tokenIdA1,\n amount: _amountA1\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB1,\n tokenId: _tokenIdB1,\n amount: _amountB1\n }),\n nftAmountToERC20(_amountA1),\n nftAmountToERC20(_amountB1),\n user1,\n block.timestamp\n );\n\n amountA1 = __amountA1;\n amountB1 = __amountB1;\n\n // All amounts were used\n assertEq(amountA1, nftAmountToERC20(_amountA1));\n assertEq(amountB1, nftAmountToERC20(_amountB1));\n\n // All vault tokens were transferred to the pair\n pair = UniswapV2Library.pairFor(address(factory), address(vault1), address(vault2));\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA1, _tokenIdA1, _amountA1, address(vault1));\n _checkNftBalances(_collectionB1, _tokenIdB1, _amountB1, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n }\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1];\n\n (address[] memory _collectionA2, uint256[] memory _tokenIdA2, uint256[] memory _amountA2) = _mintTokens(user2);\n\n collectionArray = [address(nft2)];\n tokenIdArray = [_tokenId++];\n amountArray = [5];\n \n (address[] memory _collectionB2, uint256[] memory _tokenIdB2, uint256[] memory _amountB2) = _mintTokens(user2);\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA2,\n tokenId: _tokenIdA2,\n amount: _amountA2\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB2,\n tokenId: _tokenIdB2,\n amount: _amountB2\n }),\n nftAmountToERC20(_amountA2) - ONE,\n nftAmountToERC20(_amountB2),\n user2,\n block.timestamp\n );\n\n // Optimal amounts where used\n assertEq(amountA2, 2.5 * 10 ** 18);\n assertEq(amountB2, nftAmountToERC20(_amountB2));\n\n // Optimal vault tokens were transferred to the pair\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1 + amountA2);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1 + amountB2);\n\n // Leftover vault tokens were transferred to the burn address\n assertEq(IERC20(address(vault1)).balanceOf(address(0xdead)), nftAmountToERC20(_amountA2) - amountA2);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA2, _tokenIdA2, _amountA2, address(vault1));\n _checkNftBalances(_collectionB2, _tokenIdB2, _amountB2, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testRemoveLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevWETHBalance = weth.balanceOf(user1);\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, weth.balanceOf(user1) - prevWETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testRemoveLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevETHBalance = user1.balance;\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, user1.balance - prevETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(weth.balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function _seedLiquidity1(uint256 _tokenId) public returns (uint256 tokenId) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1)\n ];\n collectionArray1 = collectionArray;\n\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n tokenIdArray1 = tokenIdArray;\n\n amountArray = [uint256(1), 1, 1, 1, uint256(1), 1, 1, 1];\n amountArray1 = amountArray;\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18 / 2;\n uint256 amountBMin1 = 9500e18 / 2;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return _tokenId;\n }\n\n function _seedLiquidity2(uint256 _tokenId, uint256 _amount) public returns (uint256 tokenId, uint256 amount) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft2),\n address(nft2),\n address(nft2),\n address(nft2)\n ];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1, _amount++, _amount++, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18;\n uint256 amountBMin1 = 9500e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return (_tokenId, _amount);\n }\n\n function testSwapNftForTokens(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForTokens(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), amountOut);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n address[] memory wrongPath = new address[](2);\n wrongPath[0] = address(vault2);\n wrongPath[1] = address(vault1);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2InvalidPath.selector);\n magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, wrongPath, user2, block.timestamp\n );\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance + amountOut);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapTokensForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n uint256 amountInMax = amountIn;\n\n _dealWeth(user2, amountIn);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapTokensForNft(\n _collection1, _tokenId1, _amount1, amountInMax, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapETHForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n\n uint256 dust = 1e18;\n vm.deal(user2, amountIn + dust);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapETHForNft{value: amountIn + dust}(\n _collection1, _tokenId1, _amount1, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance - amountIn);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n _tokenId = _seedLiquidity1(_tokenId);\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[7]];\n tokenIdArray = [tokenIdArray[7]];\n amountArray = [amountArray[7]];\n\n address[] memory _collectionOut = collectionArray;\n uint256[] memory _tokenIdOut = tokenIdArray;\n uint256[] memory _amountOut = amountArray;\n\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1];\n\n (address[] memory _collectionIn, uint256[] memory _tokenIdIn, uint256[] memory _amountIn) = _mintTokens(user2);\n\n address[] memory path = new address[](3);\n path[0] = address(vault1);\n path[1] = address(weth);\n path[2] = address(vault2);\n\n uint256 amountIn;\n uint256 amountOut;\n {\n amountIn = nftAmountToERC20(_amountIn);\n uint256[] memory amounts = UniswapV2Library.getAmountsOut(address(factory), amountIn, path);\n amountOut = amounts[amounts.length - 1];\n console2.log(\"amountOut\", amountOut);\n }\n\n _amountOut[0] = amountOut / ONE;\n\n assertTrue(nftAmountToERC20(_amountOut) < amountOut);\n assertEq(nftAmountToERC20(_amountOut) / ONE, amountOut / ONE);\n\n uint256 prevPairVault2Balance;\n {\n address pair = UniswapV2Library.pairFor(address(factory), path[1], path[2]);\n prevPairVault2Balance = IERC20(address(vault2)).balanceOf(pair);\n }\n\n vm.prank(user2);\n uint256[] memory swapAmounts = magicSwapV2Router.swapNftForNft(\n _collectionIn, _tokenIdIn, _amountIn, _collectionOut, _tokenIdOut, _amountOut, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collectionIn, _tokenIdIn, _amountIn, address(vault1));\n _checkNftBalances(_collectionOut, _tokenIdOut, _amountOut, user2);\n assertEq(swapAmounts[0], amountIn);\n assertEq(swapAmounts[2], amountOut);\n\n uint256 dust = swapAmounts[swapAmounts.length - 1] - amountOut / ONE * ONE;\n console2.log(\"dust\", dust);\n assertTrue(dust > 0);\n assertEq(\n IERC20(address(vault2)).balanceOf(UniswapV2Library.pairFor(address(factory), path[1], path[2])),\n prevPairVault2Balance - amountOut + dust\n );\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(IERC20(address(vault1)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n}\n" + }, + "contracts/Router/test/mock/WETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ncontract WETH {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed src, address indexed guy, uint256 wad);\n event Transfer(address indexed src, address indexed dst, uint256 wad);\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n receive() external payable {\n deposit();\n }\n\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n emit Deposit(msg.sender, msg.value);\n }\n\n function withdraw(uint256 wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n (bool success,) = payable(msg.sender).call{value: wad}(\"\");\n require(success, \"Transfer failed\");\n emit Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint256) {\n return address(this).balance;\n }\n\n function approve(address guy, uint256 wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n emit Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint256 wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint256 wad) public returns (bool) {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n emit Transfer(src, dst, wad);\n\n return true;\n }\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Callee {\n function uniswapV2Call(address sender, uint256 amount0, uint256 amount1, bytes calldata data) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external pure returns (string memory);\n function symbol() external pure returns (string memory);\n function decimals() external pure returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint256);\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Factory {\n struct DefaultFees {\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n }\n\n struct Fees {\n address royaltiesBeneficiary;\n /// @dev in basis point, denominated by 10000\n uint256 royaltiesFee;\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n /// @dev if true, Fees.protocolFee is used even if set to 0\n bool protocolFeeOverride;\n /// @dev if true, Fees.lpFee is used even if set to 0\n bool lpFeeOverride;\n }\n\n event PairCreated(address indexed token0, address indexed token1, address pair, uint256);\n event DefaultFeesSet(DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(address indexed pair, address beneficiary, uint256 royaltiesFee);\n event ProtocolFeesSet(address indexed pair, uint256 protocolFee, bool overrideFee);\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n /// @notice Returns total fee pair charges\n /// @dev Fee is capped at MAX_FEE\n /// @param pair address of pair for which to calculate fees\n /// @return totalFee total fee amount denominated in basis points\n function getTotalFee(address pair) external view returns (uint256 totalFee);\n\n /// @notice Returns all fees for pair\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFees(address _pair) external view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee);\n\n /// @notice Returns all fees for pair and beneficiaries\n /// @dev Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract\n /// does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied\n /// by priority:\n /// 1. lp fee\n /// 2. royalties\n /// 3. protocol fee\n /// If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then\n /// effective fees will be allocated acording to the fee priority up to MAX_FEE value.\n /// In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.\n /// @param pair address of pair for which to calculate fees and beneficiaries\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesBeneficiary address that gets royalties\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolBeneficiary address that gets protocol fees\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFeesAndRecipients(address pair)\n external\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n );\n\n /// @return protocolFeeBeneficiary address that gets protocol fees\n function protocolFeeBeneficiary() external view returns (address protocolFeeBeneficiary);\n\n /// @notice Internal mapping to store fees for pair. It is exposed for advanced integrations\n /// and in most cases contracts should use fee getters.\n function pairFees(address pair) external view returns (address, uint256, uint256, uint256, bool, bool);\n\n function getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs() external view returns (address[] memory pairs);\n function allPairs(uint256) external view returns (address pair);\n function allPairsLength() external view returns (uint256);\n\n function createPair(address tokenA, address tokenB) external returns (address pair);\n\n /// @notice Sets default fees for all pairs\n /// @param fees struct with default fees\n function setDefaultFees(DefaultFees memory fees) external;\n\n /// @notice Sets royalties fee and beneficiary for pair\n /// @param pair address of pair for which to set fee\n /// @param beneficiary address that gets royalties\n /// @param royaltiesFee amount of royalties fee denominated in basis points\n function setRoyaltiesFee(address pair, address beneficiary, uint256 royaltiesFee) external;\n\n /// @notice Sets protocol fee for pair\n /// @param pair address of pair for which to set fee\n /// @param protocolFee amount of protocol fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setProtocolFee(address pair, uint256 protocolFee, bool overrideFee) external;\n\n /// @notice Sets lp fee for pair\n /// @param pair address of pair for which to set fee\n /// @param lpFee amount of lp fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setLpFee(address pair, uint256 lpFee, bool overrideFee) external;\n\n /// @notice Sets protocol fee beneficiary\n /// @param _beneficiary address that gets protocol fees\n function setProtocolFeeBeneficiary(address _beneficiary) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Pair {\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n /// @notice Emitted by the pool for increases to the number of observations that can be stored\n /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n /// just before a mint/swap/burn.\n /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n event IncreaseObservationCardinalityNext(\n uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew\n );\n\n function MINIMUM_LIQUIDITY() external pure returns (uint256);\n function factory() external view returns (address);\n function token0() external view returns (address);\n function token1() external view returns (address);\n function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\n function observations(uint256 index)\n external\n view\n returns (uint32 blockTimestamp, uint256 priceCumulative, bool initialized);\n\n function observe(uint32[] calldata secondsAgos) external view returns (uint256[] memory tickCumulatives);\n function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n\n function mint(address to) external returns (uint256 liquidity);\n function burn(address to) external returns (uint256 amount0, uint256 amount1);\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;\n function skim(address to) external;\n function sync() external;\n\n function initialize(address, address) external;\n}\n" + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Oracle (modifier version of Oracle.sol from UniswapV3)\n/// @notice Provides price data useful for a wide variety of system designs\n/// @dev Instances of stored oracle data, \"observations\", are collected in the oracle array\n/// Every pool is initialized with an oracle array length of 1. Anyone can pay the SSTOREs to increase the\n/// maximum length of the oracle array. New slots will be added when the array is fully populated.\n/// Observations are overwritten when the full length of the oracle array is populated.\n/// The most recent observation is available, independent of the length of the oracle array, by passing 0 to observe()\nlibrary Oracle {\n struct Observation {\n // the block timestamp of the observation\n uint32 blockTimestamp;\n // the price accumulator, i.e. price * time elapsed since the pool was first initialized\n uint256 priceCumulative;\n // whether or not the observation is initialized\n bool initialized;\n }\n\n /// @notice Transforms a previous observation into a new observation, given the passage of time and the current price values\n /// @dev blockTimestamp _must_ be chronologically equal to or greater than last.blockTimestamp, safe for 0 or 1 overflows\n /// @param last The specified observation to be transformed\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @return Observation The newly populated observation\n function transform(Observation memory last, uint32 blockTimestamp, uint256 lastPrice)\n private\n pure\n returns (Observation memory)\n {\n uint32 delta = blockTimestamp - last.blockTimestamp;\n return Observation({\n blockTimestamp: blockTimestamp,\n priceCumulative: last.priceCumulative + lastPrice * delta,\n initialized: true\n });\n }\n\n /// @notice Initialize the oracle array by writing the first slot. Called once for the lifecycle of the observations array\n /// @param self The stored oracle array\n /// @param time The time of the oracle initialization, via block.timestamp truncated to uint32\n /// @return cardinality The number of populated elements in the oracle array\n /// @return cardinalityNext The new length of the oracle array, independent of population\n function initialize(Observation[65535] storage self, uint32 time)\n internal\n returns (uint16 cardinality, uint16 cardinalityNext)\n {\n self[0] = Observation({blockTimestamp: time, priceCumulative: 0, initialized: true});\n return (1, 1);\n }\n\n /// @notice Writes an oracle observation to the array\n /// @dev Writable at most once per block. Index represents the most recently written element. cardinality and index must be tracked externally.\n /// If the index is at the end of the allowable array length (according to cardinality), and the next cardinality\n /// is greater than the current one, cardinality may be increased. This restriction is created to preserve ordering.\n /// @param self The stored oracle array\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @param cardinality The number of populated elements in the oracle array\n /// @param cardinalityNext The new length of the oracle array, independent of population\n /// @return indexUpdated The new index of the most recently written element in the oracle array\n /// @return cardinalityUpdated The new cardinality of the oracle array\n function write(\n Observation[65535] storage self,\n uint16 index,\n uint32 blockTimestamp,\n uint256 lastPrice,\n uint16 cardinality,\n uint16 cardinalityNext\n ) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated) {\n Observation memory last = self[index];\n\n // early return if we've already written an observation this block\n if (last.blockTimestamp == blockTimestamp) return (index, cardinality);\n\n // if the conditions are right, we can bump the cardinality\n if (cardinalityNext > cardinality && index == (cardinality - 1)) {\n cardinalityUpdated = cardinalityNext;\n } else {\n cardinalityUpdated = cardinality;\n }\n\n indexUpdated = (index + 1) % cardinalityUpdated;\n self[indexUpdated] = transform(last, blockTimestamp, lastPrice);\n }\n\n /// @notice Prepares the oracle array to store up to `next` observations\n /// @param self The stored oracle array\n /// @param current The current next cardinality of the oracle array\n /// @param next The proposed next cardinality which will be populated in the oracle array\n /// @return next The next cardinality which will be populated in the oracle array\n function grow(Observation[65535] storage self, uint16 current, uint16 next) internal returns (uint16) {\n require(current > 0, \"I\");\n // no-op if the passed next value isn't greater than the current next value\n if (next <= current) return current;\n // store in each slot to prevent fresh SSTOREs in swaps\n // this data will not be used because the initialized boolean is still false\n for (uint16 i = current; i < next; i++) {\n self[i].blockTimestamp = 1;\n }\n return next;\n }\n\n /// @notice comparator for 32-bit timestamps\n /// @dev safe for 0 or 1 overflows, a and b _must_ be chronologically before or equal to time\n /// @param time A timestamp truncated to 32 bits\n /// @param a A comparison timestamp from which to determine the relative position of `time`\n /// @param b From which to determine the relative position of `time`\n /// @return bool Whether `a` is chronologically <= `b`\n function lte(uint32 time, uint32 a, uint32 b) private pure returns (bool) {\n // if there hasn't been overflow, no need to adjust\n if (a <= time && b <= time) return a <= b;\n\n uint256 aAdjusted = a > time ? a : a + 2 ** 32;\n uint256 bAdjusted = b > time ? b : b + 2 ** 32;\n\n return aAdjusted <= bAdjusted;\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a target, i.e. where [beforeOrAt, atOrAfter] is satisfied.\n /// The result may be the same observation, or adjacent observations.\n /// @dev The answer must be contained in the array, used when the target is located within the stored observation\n /// boundaries: older than the most recent observation and younger, or the same age as, the oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation recorded before, or at, the target\n /// @return atOrAfter The observation recorded at, or after, the target\n function binarySearch(Observation[65535] storage self, uint32 time, uint32 target, uint16 index, uint16 cardinality)\n private\n view\n returns (Observation memory beforeOrAt, Observation memory atOrAfter)\n {\n uint256 l = (index + 1) % cardinality; // oldest observation\n uint256 r = l + cardinality - 1; // newest observation\n uint256 i;\n while (true) {\n i = (l + r) / 2;\n\n beforeOrAt = self[i % cardinality];\n\n // we've landed on an uninitialized price, keep searching higher (more recently)\n if (!beforeOrAt.initialized) {\n l = i + 1;\n continue;\n }\n\n atOrAfter = self[(i + 1) % cardinality];\n\n bool targetAtOrAfter = lte(time, beforeOrAt.blockTimestamp, target);\n\n // check if we've found the answer!\n if (targetAtOrAfter && lte(time, target, atOrAfter.blockTimestamp)) break;\n\n if (!targetAtOrAfter) r = i - 1;\n else l = i + 1;\n }\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a given target, i.e. where [beforeOrAt, atOrAfter] is satisfied\n /// @dev Assumes there is at least 1 initialized observation.\n /// Used by observeSingle() to compute the counterfactual accumulator values as of a given block timestamp.\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param lastPrice The active price at the time of the returned or simulated observation\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation which occurred at, or before, the given timestamp\n /// @return atOrAfter The observation which occurred at, or after, the given timestamp\n function getSurroundingObservations(\n Observation[65535] storage self,\n uint32 time,\n uint32 target,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n // optimistically set before to the newest observation\n beforeOrAt = self[index];\n\n // if the target is chronologically at or after the newest observation, we can early return\n if (lte(time, beforeOrAt.blockTimestamp, target)) {\n if (beforeOrAt.blockTimestamp == target) {\n // if newest observation equals target, we're in the same block, so we can ignore atOrAfter\n return (beforeOrAt, atOrAfter);\n } else {\n // otherwise, we need to transform\n return (beforeOrAt, transform(beforeOrAt, target, lastPrice));\n }\n }\n\n // now, set before to the oldest observation\n beforeOrAt = self[(index + 1) % cardinality];\n if (!beforeOrAt.initialized) beforeOrAt = self[0];\n\n // ensure that the target is chronologically at or after the oldest observation\n require(lte(time, beforeOrAt.blockTimestamp, target), \"OLD\");\n\n // if we've reached this point, we have to binary search\n return binarySearch(self, time, target, index, cardinality);\n }\n\n /// @dev Reverts if an observation at or before the desired observation timestamp does not exist.\n /// 0 may be passed as `secondsAgo' to return the current cumulative values.\n /// If called with a timestamp falling between two observations, returns the counterfactual accumulator values\n /// at exactly the timestamp between the two observations.\n /// @param self The stored oracle array\n /// @param time The current block timestamp\n /// @param secondsAgo The amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulative The price * time elapsed since the pool was first initialized, as of `secondsAgo`\n function observeSingle(\n Observation[65535] storage self,\n uint32 time,\n uint32 secondsAgo,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256 priceCumulative) {\n if (secondsAgo == 0) {\n Observation memory last = self[index];\n if (last.blockTimestamp != time) last = transform(last, time, lastPrice);\n return last.priceCumulative;\n }\n\n uint32 target = time - secondsAgo;\n\n (Observation memory beforeOrAt, Observation memory atOrAfter) =\n getSurroundingObservations(self, time, target, lastPrice, index, cardinality);\n\n if (target == beforeOrAt.blockTimestamp) {\n // we're at the left boundary\n return beforeOrAt.priceCumulative;\n } else if (target == atOrAfter.blockTimestamp) {\n // we're at the right boundary\n return atOrAfter.priceCumulative;\n } else {\n // we're in the middle\n uint32 observationTimeDelta = atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp;\n uint32 targetDelta = target - beforeOrAt.blockTimestamp;\n return beforeOrAt.priceCumulative\n + ((atOrAfter.priceCumulative - beforeOrAt.priceCumulative) / observationTimeDelta) * targetDelta;\n }\n }\n\n /// @notice Returns the accumulator values as of each time seconds ago from the given time in the array of `secondsAgos`\n /// @dev Reverts if `secondsAgos` > oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param secondsAgos Each amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulatives The price * time elapsed since the pool was first initialized, as of each `secondsAgo`\n function observe(\n Observation[65535] storage self,\n uint32 time,\n uint32[] memory secondsAgos,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256[] memory priceCumulatives) {\n require(cardinality > 0, \"I\");\n\n priceCumulatives = new uint256[](secondsAgos.length);\n for (uint256 i = 0; i < secondsAgos.length; i++) {\n priceCumulatives[i] = observeSingle(self, time, secondsAgos[i], lastPrice, index, cardinality);\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, \"ds-math-add-overflow\");\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, \"ds-math-sub-underflow\");\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, \"ds-math-mul-overflow\");\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing various math operations\n\nlibrary UniswapV2Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UQ112x112.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../../interfaces/IUniswapV2Pair.sol\";\nimport \"../../interfaces/IUniswapV2Callee.sol\";\nimport \"../../interfaces/IUniswapV2Factory.sol\";\n\nimport \"../../libraries/UniswapV2Math.sol\";\nimport \"../../libraries/UQ112x112.sol\";\nimport \"../../libraries/Oracle.sol\";\n\nimport \"../../UniswapV2ERC20.sol\";\n\n/// @dev Minimally adjusted vanilla UniswapV2Pair implementation for testing\n/// @dev CHANGELOG:\n/// - remove body of _mintFee function\n/// - refactor uint112(-1) to type(uint112).max\ncontract UniswapV2PairOriginal is UniswapV2ERC20 {\n using SafeMath for uint256;\n using UQ112x112 for uint224;\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"UniswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"UniswapV2: TRANSFER_FAILED\");\n }\n\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"UniswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"UniswapV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)\n function _mintFee(uint112, uint112) private pure returns (bool) {\n return false;\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Mint(msg.sender, amount0, amount1);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"UniswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"UniswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"UniswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));\n uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(1000 ** 2),\n \"UniswapV2: K\"\n );\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n // force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n // force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/Oracle.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../../periphery/libraries/OracleLibrary.sol\";\nimport \"../UniswapV2Factory.sol\";\n\ncontract OracleImpl {\n function consult(address pair, uint32 period) public view returns (uint256) {\n return OracleLibrary.consult(pair, period);\n }\n}\n\ncontract OracleTest is Test {\n uint256 public constant TIMESTAMP = 1668642357;\n uint256 public constant BLOCKTIME = 15;\n uint256 public START_PRICE;\n\n UniswapV2Pair public pair;\n UniswapV2Factory factory;\n\n ERC20Mintable public DAI = new ERC20Mintable();\n ERC20Mintable public WETH = new ERC20Mintable();\n OracleImpl public oracleImpl = new OracleImpl();\n\n address user1 = address(10000001);\n\n address protocolFeeBeneficiary = address(10000005);\n\n function setUp() public {\n vm.warp(TIMESTAMP);\n\n factory = new UniswapV2Factory(150, 30, protocolFeeBeneficiary);\n\n pair = UniswapV2Pair(factory.createPair(address(WETH), address(DAI)));\n WETH.mint(address(pair), 1000e18);\n DAI.mint(address(pair), 1500000e18);\n pair.mint(user1);\n\n START_PRICE = 1500000e18 * 1e18 / 1000e18;\n }\n\n function _mineBlock(uint256 _time) public {\n vm.roll(block.number + 1);\n vm.warp(block.timestamp + _time);\n }\n\n function _swap(uint256 _wethIn, uint256 _daiIn) public returns (uint256 amountOut) {\n _mineBlock(BLOCKTIME);\n\n (uint112 reserve0, uint112 reserve1,) = pair.getReserves();\n if (_wethIn > 0) {\n uint256 amount1Out =\n UniswapV2Library.getAmountOut(_wethIn, reserve0, reserve1, address(pair), address(factory));\n WETH.mint(address(pair), _wethIn);\n pair.swap(0, amount1Out, user1, bytes(\"\"));\n amountOut = amount1Out;\n } else if (_daiIn > 0) {\n uint256 amount0Out =\n UniswapV2Library.getAmountOut(_daiIn, reserve1, reserve0, address(pair), address(factory));\n DAI.mint(address(pair), _daiIn);\n pair.swap(amount0Out, 0, user1, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testTokensOrder() public {\n assertEq(address(WETH), pair.token0());\n assertEq(address(DAI), pair.token1());\n }\n\n function testConsultOld() public {\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1800);\n\n assertEq(pair.lastPrice(), 0);\n\n _swap(0.01e18, 0);\n vm.warp(block.timestamp + BLOCKTIME);\n assertEq(oracleImpl.consult(address(pair), 15), START_PRICE);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 16);\n\n vm.warp(block.timestamp + 1800 - BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 1800), START_PRICE);\n\n _swap(1e18, 0);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n struct TestAction {\n uint256 wethIn;\n uint256 daiIn;\n uint256 timetravelBefore;\n uint256 timetravelAfter;\n uint32 period;\n uint256 TWAP;\n uint16 observationCardinalityNext;\n uint256 observationIndex;\n }\n\n // workaround for \"UnimplementedFeatureError: Copying of type struct memory to storage not yet supported.\"\n uint256 public constant depositTestCasesLength = 22;\n\n function getTestAction(uint256 _index) public view returns (TestAction memory) {\n TestAction[depositTestCasesLength] memory testSwapCases = [\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 60,\n period: 60,\n TWAP: START_PRICE,\n observationCardinalityNext: 120,\n observationIndex: 0\n }),\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 1800,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1499970495435267142183,\n observationCardinalityNext: 120,\n observationIndex: 1\n }),\n TestAction({\n wethIn: 100e18, // big trade\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 45,\n period: 1800,\n TWAP: 1499969511978807824364,\n observationCardinalityNext: 120,\n observationIndex: 2\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 1363107217423634267487,\n observationCardinalityNext: 120,\n observationIndex: 3\n }),\n TestAction({\n wethIn: 0,\n daiIn: 1000000e18, // huge trade\n timetravelBefore: 900,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1243352310158670807355,\n observationCardinalityNext: 120,\n observationIndex: 4\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1263646160072652749974,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 60 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1344821559728580520453,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 120 sec since huge trade\n timetravelAfter: 330, // 450 sec since huge trade\n period: 1800,\n TWAP: 1872461657492111028567,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 510 sec since huge trade\n timetravelAfter: 390, // 900 sec since huge trade\n period: 1800,\n TWAP: 2481277154911569307160,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 960 sec since huge trade\n timetravelAfter: 390, // 1350 sec since huge trade\n period: 1800,\n TWAP: 3090092652331027585753,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 15, // 1380 sec since huge trade\n timetravelAfter: 400, // 1780 sec since huge trade\n period: 1800,\n TWAP: 3671849683198509940853,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 5, // 1800 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 1860 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 145, // 2020 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 250e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921715,\n observationCardinalityNext: 120,\n observationIndex: 6\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 2783849579014797350624,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 500000e18,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290057,\n observationCardinalityNext: 120,\n observationIndex: 8\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 2554290763490825493524,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n })\n ];\n\n return testSwapCases[_index];\n }\n\n function testConsult() public {\n for (uint256 i = 0; i < depositTestCasesLength; i++) {\n TestAction memory testCase = getTestAction(i);\n\n vm.warp(block.timestamp + testCase.timetravelBefore);\n _swap(testCase.wethIn, testCase.daiIn);\n vm.warp(block.timestamp + testCase.timetravelAfter);\n\n assertEq(oracleImpl.consult(address(pair), testCase.period), testCase.TWAP);\n\n if (testCase.observationCardinalityNext > pair.observationCardinalityNext()) {\n pair.increaseObservationCardinalityNext(testCase.observationCardinalityNext);\n }\n\n assertEq(pair.observationIndex(), testCase.observationIndex);\n }\n }\n\n function testObservationsSingleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, 0);\n assertEq(initialized, true);\n\n _swap(0.01e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME);\n assertEq(initialized, true);\n\n _swap(1e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n function _assertCardinality(\n uint16 observationIndex,\n uint16 observationCardinality,\n uint16 observationCardinalityNext\n ) public {\n assertEq(pair.observationIndex(), observationIndex);\n assertEq(pair.observationCardinality(), observationCardinality);\n assertEq(pair.observationCardinalityNext(), observationCardinalityNext);\n }\n\n function testIncreaseObservationCardinalityNext() public {\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n pair.increaseObservationCardinalityNext(3);\n _assertCardinality(0, 1, 3);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(0, 3, 3);\n\n pair.increaseObservationCardinalityNext(10);\n _assertCardinality(0, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(3, 10, 10);\n\n for (uint256 i = 0; i < 6; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 10);\n\n _swap(1e18, 0);\n _assertCardinality(0, 10, 10);\n\n pair.increaseObservationCardinalityNext(15);\n _assertCardinality(0, 10, 15);\n\n for (uint256 i = 0; i < 9; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 15);\n\n _swap(1e18, 0);\n _assertCardinality(10, 15, 15);\n\n for (uint256 i = 0; i < 4; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(14, 15, 15);\n\n _swap(1e18, 0);\n _assertCardinality(0, 15, 15);\n }\n\n function testObservationsMultipleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n _swap(0.01e18, 0);\n assertEq(pair.lastPrice(), START_PRICE);\n\n (uint32 blockTimestamp0, uint256 priceCumulative0, bool initialized0) = pair.observations(0);\n assertEq(blockTimestamp0, block.timestamp);\n assertEq(priceCumulative0, START_PRICE * BLOCKTIME);\n assertEq(initialized0, true);\n\n pair.increaseObservationCardinalityNext(3);\n\n _swap(100e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(0);\n assertEq(blockTimestamp, blockTimestamp0);\n assertEq(priceCumulative, priceCumulative0);\n assertEq(initialized, initialized0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(1);\n assertEq(blockTimestamp, blockTimestamp0 + BLOCKTIME);\n assertEq(priceCumulative, priceCumulative0 + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Factory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Factory.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\n\ncontract UniswapV2FactoryTest is Test {\n UniswapV2Factory factory;\n\n address pool1;\n address hacker = address(10000004);\n address owner = address(10000005);\n\n address tokenA = address(10000006);\n address tokenB = address(10000007);\n\n address protocolFeeBeneficiary = address(10000005);\n\n uint256 tooBigFee;\n uint256 MAX_FEE;\n\n event PairCreated(\n address indexed token0,\n address indexed token1,\n address pair,\n uint256\n );\n event DefaultFeesSet(IUniswapV2Factory.DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(\n address indexed pair,\n address beneficiary,\n uint256 royaltiesFee\n );\n event ProtocolFeesSet(\n address indexed pair,\n uint256 protocolFee,\n bool overrideFee\n );\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n function setUp() public {\n vm.prank(owner);\n factory = new UniswapV2Factory(0, 0, protocolFeeBeneficiary);\n\n MAX_FEE = factory.MAX_FEE();\n tooBigFee = MAX_FEE + 1;\n\n pool1 = _createPair(tokenA, tokenB);\n }\n\n function _assertFees(\n address _expectedPool,\n address _expectedRoyaltiesBeneficiary,\n uint256 _expectedRoyaltiesFee,\n uint256 _expectedProtocolFee,\n uint256 _expectedLpFee,\n address _expectedProtocolFeeBeneficiary\n ) public {\n (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n ) = factory.getFeesAndRecipients(_expectedPool);\n\n assertEq(lpFee, _expectedLpFee);\n assertEq(royaltiesBeneficiary, _expectedRoyaltiesBeneficiary);\n assertEq(royaltiesFee, _expectedRoyaltiesFee);\n assertEq(protocolBeneficiary, _expectedProtocolFeeBeneficiary);\n assertEq(protocolFee, _expectedProtocolFee);\n }\n\n function _createPair(\n address _tokenA,\n address _tokenB\n ) public returns (address pair) {\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n pair = factory.createPair(_tokenA, _tokenB);\n }\n\n function testSetDefaultFees(uint256 _lpFee, uint256 _protocolFee) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_protocolFee + _lpFee <= MAX_FEE);\n\n (uint256 protocolFee, uint256 lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n\n _assertFees(pool1, address(0), 0, 0, 0, protocolFeeBeneficiary);\n\n IUniswapV2Factory.DefaultFees memory fees = IUniswapV2Factory\n .DefaultFees({protocolFee: _protocolFee, lpFee: _lpFee});\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setDefaultFees(fees);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit DefaultFeesSet(fees);\n factory.setDefaultFees(fees);\n\n (protocolFee, lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, _lpFee);\n\n _assertFees(\n pool1,\n address(0),\n 0,\n _protocolFee,\n _lpFee,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee,\n lpFee: _lpFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: _protocolFee,\n lpFee: tooBigFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee / 2 + 1,\n lpFee: tooBigFee / 2\n })\n );\n }\n\n function testSetLpFee(\n address _pair,\n uint256 _lpFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setLpFee(_pair, _lpFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setLpFee(_pair, _lpFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit LpFeesSet(_pair, _lpFee, true);\n factory.setLpFee(_pair, _lpFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n assertEq(lpFee, _lpFee);\n assertFalse(protocolFeeOverride);\n assertTrue(lpFeeOverride);\n\n _assertFees(_pair, address(0), 0, 0, _lpFee, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _lpFee > MAX_FEE\");\n factory.setLpFee(_pair, tooBigFee, true);\n }\n\n function testSetRoyaltiesFee(\n address _pair,\n address _royaltiesBeneficiary,\n uint256 _royaltiesFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_royaltiesFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _beneficiary invalid\");\n factory.setRoyaltiesFee(_pair, address(0), _royaltiesFee);\n\n vm.assume(_royaltiesBeneficiary != address(0));\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit RoyaltiesFeesSet(_pair, _royaltiesBeneficiary, _royaltiesFee);\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, _royaltiesBeneficiary);\n assertEq(royaltiesFee, _royaltiesFee);\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n assertFalse(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n _royaltiesBeneficiary,\n _royaltiesFee,\n 0,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _royaltiesFee > MAX_FEE\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, tooBigFee);\n }\n\n function testSetProtocolFee(\n address _pair,\n uint256 _protocolFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_pair != pool1);\n\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeesSet(_pair, _protocolFee, true);\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, 0);\n assertTrue(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n address(0),\n 0,\n _protocolFee,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _protocolFee > MAX_FEE\");\n factory.setProtocolFee(_pair, tooBigFee, true);\n }\n\n function testSetProtocolFeeBeneficiary(address _beneficiary) public {\n vm.assume(_beneficiary != address(0));\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n assertEq(factory.protocolFeeBeneficiary(), _beneficiary);\n _assertFees(pool1, address(0), 0, 0, 0, _beneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: BENEFICIARY\");\n factory.setProtocolFeeBeneficiary(address(0));\n }\n\n function testGetFees(\n uint256 _lpFee,\n uint256 _royaltiesFee,\n uint256 _protocolFee\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_royaltiesFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n\n vm.startPrank(owner);\n factory.setLpFee(pool1, _lpFee, true);\n factory.setRoyaltiesFee(pool1, owner, _royaltiesFee);\n factory.setProtocolFee(pool1, _protocolFee, true);\n vm.stopPrank();\n\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = factory\n .getFees(pool1);\n uint256 totalFee = lpFee + royaltiesFee + protocolFee;\n\n assertEq(lpFee, _lpFee);\n\n /// logic below should check that:\n /// - totalFee is never above MAX_FEE\n /// - if _lpFee + _royaltiesFee + _protocolFee > MAX_FEE\n /// then we fill totalFee with fees in following priority:\n /// 1. lpFee\n /// 2. royaltiesFee\n /// 3. protocolFee\n /// until we get to MAX_FEE\n\n if (_lpFee < MAX_FEE) {\n if (_lpFee + _royaltiesFee < MAX_FEE) {\n assertEq(royaltiesFee, _royaltiesFee);\n\n if (_lpFee + _royaltiesFee + _protocolFee <= MAX_FEE) {\n assertEq(protocolFee, _protocolFee);\n assertEq(\n _lpFee + _royaltiesFee + _protocolFee,\n factory.getTotalFee(pool1)\n );\n } else {\n assertEq(protocolFee, MAX_FEE - _lpFee - _royaltiesFee);\n }\n } else {\n assertEq(royaltiesFee, MAX_FEE - _lpFee);\n assertEq(protocolFee, 0);\n }\n } else {\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n }\n\n assertEq(totalFee, factory.getTotalFee(pool1));\n assertTrue(totalFee <= MAX_FEE);\n }\n\n function testCreatePair(address _tokenA, address _tokenB) public {\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n (address token0, address token1) = UniswapV2Library.sortTokens(\n _tokenA,\n _tokenB\n );\n address expectedPair = UniswapV2Library.pairFor(\n address(factory),\n _tokenA,\n _tokenB\n );\n\n vm.expectEmit(true, true, true, true);\n emit PairCreated(token0, token1, expectedPair, 2);\n address pair = factory.createPair(_tokenA, _tokenB);\n\n assertEq(pair, expectedPair);\n assertEq(factory.getPair(_tokenA, _tokenB), pair);\n assertEq(factory.getPair(_tokenB, _tokenA), pair);\n assertEq(factory.allPairs(1), pair);\n assertEq(factory.allPairsLength(), 2);\n\n address[] memory allPairs = factory.allPairs();\n assertEq(allPairs[0], pool1);\n assertEq(allPairs[1], pair);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Pair.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../UniswapV2Factory.sol\";\nimport \"./mock/UniswapV2PairOriginal.sol\";\n\ncontract UniswapV2PairTest is Test {\n UniswapV2Pair pair;\n UniswapV2Pair pairWithFees;\n UniswapV2PairOriginal pairOriginal;\n UniswapV2Factory factory;\n\n ERC20Mintable token0;\n ERC20Mintable token1;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n address royaltiesBeneficiary = address(10000006);\n\n uint256 royaltiesFee = 50;\n uint256 protocolFee = 50;\n\n function setUp() public {\n address tokenA = address(new ERC20Mintable());\n address tokenB = address(new ERC20Mintable());\n (tokenA, tokenB) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n token0 = ERC20Mintable(tokenA);\n token1 = ERC20Mintable(tokenB);\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n vm.startPrank(address(factory));\n\n pair = new UniswapV2Pair();\n pair.initialize(address(token0), address(token1));\n\n pairOriginal = new UniswapV2PairOriginal();\n pairOriginal.initialize(address(token0), address(token1));\n\n pairWithFees = UniswapV2Pair(factory.createPair(address(token0), address(token1)));\n\n vm.stopPrank();\n\n factory.setRoyaltiesFee(address(pairWithFees), royaltiesBeneficiary, royaltiesFee);\n factory.setProtocolFee(address(pairWithFees), protocolFee, true);\n factory.setProtocolFeeBeneficiary(protocolFeeBeneficiary);\n }\n\n function _assertPairs(UniswapV2Pair _pair, UniswapV2PairOriginal _pairOriginal) public {\n assertEq(_pair.token0(), _pairOriginal.token0());\n assertEq(_pair.token1(), _pairOriginal.token1());\n\n (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _pair.getReserves();\n (uint112 _reserve0Org, uint112 _reserve1Org, uint32 _blockTimestampLastOrg) = _pairOriginal.getReserves();\n\n assertEq(_reserve0, _reserve0Org);\n assertEq(_reserve1, _reserve1Org);\n assertEq(_blockTimestampLast, _blockTimestampLastOrg);\n\n assertEq(_pair.factory(), _pairOriginal.factory());\n\n assertEq(token0.balanceOf(address(_pair)), token0.balanceOf(address(_pairOriginal)));\n assertEq(token1.balanceOf(address(_pair)), token1.balanceOf(address(_pairOriginal)));\n }\n\n function _addLiquidity(address _pair, uint256 _amount0, uint256 _amount1, address _to)\n public\n returns (uint256 liquidity)\n {\n token0.mint(_pair, _amount0);\n token1.mint(_pair, _amount1);\n\n liquidity = UniswapV2Pair(_pair).mint(_to);\n }\n\n function testMintBurnRegression(uint112 _amount0, uint112 _amount1) public {\n vm.assume(_amount0 > pair.MINIMUM_LIQUIDITY());\n vm.assume(_amount1 > pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidity = _addLiquidity(address(pair), _amount0, _amount1, user1);\n assertEq(liquidity, pair.totalSupply() - pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidityOriginal = _addLiquidity(address(pairOriginal), _amount0, _amount1, user1);\n assertEq(liquidityOriginal, pairOriginal.totalSupply() - pairOriginal.MINIMUM_LIQUIDITY());\n\n assertEq(liquidity, liquidityOriginal);\n\n _assertPairs(pair, pairOriginal);\n\n vm.prank(user1);\n pair.transfer(address(pair), liquidity);\n (uint256 amount0, uint256 amount1) = pair.burn(user1);\n\n vm.prank(user1);\n pairOriginal.transfer(address(pairOriginal), liquidity);\n (uint256 amount0Org, uint256 amount1Org) = pairOriginal.burn(user2);\n\n assertEq(amount0, amount0Org);\n assertEq(amount1, amount1Org);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function _swap(address _pair, uint256 _amount0In, uint256 _amount1In, address _to)\n public\n returns (uint256 amountOut)\n {\n (uint112 reserve0, uint112 reserve1,) = UniswapV2Pair(_pair).getReserves();\n token0.mint(_pair, _amount0In);\n token1.mint(_pair, _amount1In);\n\n if (_amount0In > _amount1In) {\n uint256 amount1Out = UniswapV2Library.getAmountOut(_amount0In, reserve0, reserve1, _pair, address(factory));\n UniswapV2Pair(_pair).swap(0, amount1Out, _to, bytes(\"\"));\n amountOut = amount1Out;\n } else {\n uint256 amount0Out = UniswapV2Library.getAmountOut(_amount1In, reserve1, reserve0, _pair, address(factory));\n UniswapV2Pair(_pair).swap(amount0Out, 0, _to, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testSwapRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n uint256 amount1Out = _swap(address(pair), _amount0In, 0, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n assertEq(amount1Out, amount1OutOrg);\n _assertPairs(pair, pairOriginal);\n\n for (uint256 i = 0; i < 20; i++) {\n if (i % 2 == 0) {\n _swap(address(pair), _amount0In, 0, user1);\n _swap(address(pairOriginal), _amount0In, 0, user2);\n } else {\n _swap(address(pair), 0, _amount1In, user1);\n _swap(address(pairOriginal), 0, _amount1In, user2);\n }\n }\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSkimRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n pair.skim(user1);\n assertEq(token0.balanceOf(user1), _amount0In);\n assertEq(token1.balanceOf(user1), _amount1In);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n pairOriginal.skim(user2);\n assertEq(token0.balanceOf(user2), _amount0In);\n assertEq(token1.balanceOf(user2), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSyncRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n\n pair.sync();\n pairOriginal.sync();\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSwapWithFees(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In, uint256 _hijackAmount) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n vm.assume(_amount0In > _hijackAmount);\n\n _addLiquidity(address(pairWithFees), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pairWithFees, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n (, address beneficiary, uint256 royalties, address protocolBeneficiary, uint256 protocolBeneficiaryFee) =\n factory.getFeesAndRecipients(address(pairWithFees));\n\n assertEq(beneficiary, royaltiesBeneficiary);\n assertEq(royalties, royaltiesFee);\n assertEq(token0.balanceOf(beneficiary), 0);\n uint256 royaltiesAmount = _amount0In * royalties / 10000;\n\n assertEq(protocolBeneficiary, protocolFeeBeneficiary);\n assertEq(protocolBeneficiaryFee, protocolFee);\n assertEq(token0.balanceOf(protocolBeneficiary), 0);\n uint256 protocolFeeAmount = _amount0In * protocolBeneficiaryFee / 10000;\n\n uint256 amount1Out = _swap(address(pairWithFees), _amount0In, _hijackAmount, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n assertEq(token0.balanceOf(beneficiary), royaltiesAmount);\n assertEq(token0.balanceOf(protocolBeneficiary), protocolFeeAmount);\n assertEq(token1.balanceOf(beneficiary), _hijackAmount * royalties / 10000);\n assertEq(token1.balanceOf(protocolBeneficiary), _hijackAmount * protocolBeneficiaryFee / 10000);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n uint256 maxPercentDelta = (royaltiesFee + protocolFee + 1) * 1e18 / 10000;\n assertApproxEqRel(amount1Out, amount1OutOrg, maxPercentDelta);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./interfaces/IUniswapV2ERC20.sol\";\nimport \"./libraries/SafeMath.sol\";\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using SafeMath for uint256;\n\n string public constant name = \"Magicswap V2\";\n string public constant symbol = \"MAGIC-V2\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH =\n 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint256) public nonces;\n\n constructor() {\n uint256 chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(bytes(\"1\")),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint256 value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint256 value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external\n {\n require(deadline >= block.timestamp, \"MagicswapV2: EXPIRED\");\n bytes32 digest = keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"MagicswapV2: INVALID_SIGNATURE\");\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\n\nimport \"./interfaces/IUniswapV2Factory.sol\";\nimport \"./UniswapV2Pair.sol\";\n\ncontract UniswapV2Factory is IUniswapV2Factory, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n\n /// @dev Fee is denominated in basis points so 5000 / 10000 = 50%\n uint256 public constant MAX_FEE = 5000;\n\n address public protocolFeeBeneficiary;\n\n mapping(address => mapping(address => address)) public getPair;\n EnumerableSet.AddressSet private _allPairs;\n\n DefaultFees public defaultFees;\n mapping(address => Fees) public pairFees;\n\n constructor(uint256 _defaultProtocolFee, uint256 _defaultLpFee, address _protocolFeeBeneficiary) {\n DefaultFees memory startFees = DefaultFees({protocolFee: _defaultProtocolFee, lpFee: _defaultLpFee});\n\n setDefaultFees(startFees);\n setProtocolFeeBeneficiary(_protocolFeeBeneficiary);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getTotalFee(address _pair) public view returns (uint256) {\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = _getFees(_pair);\n return lpFee + royaltiesFee + protocolFee;\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFees(address _pair) public view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n return _getFees(_pair);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFeesAndRecipients(address _pair)\n public\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n )\n {\n (lpFee, royaltiesFee, protocolFee) = _getFees(_pair);\n\n royaltiesBeneficiary = pairFees[_pair].royaltiesBeneficiary;\n protocolBeneficiary = protocolFeeBeneficiary;\n }\n\n function allPairs() external view returns (address[] memory) {\n return _allPairs.values();\n }\n\n function allPairs(uint256 _index) external view returns (address) {\n return _allPairs.at(_index);\n }\n\n function allPairsLength() external view returns (uint256) {\n return _allPairs.length();\n }\n\n function createPair(address tokenA, address tokenB) external returns (address pair) {\n require(tokenA != tokenB, \"MagicswapV2: IDENTICAL_ADDRESSES\");\n (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"MagicswapV2: ZERO_ADDRESS\");\n require(getPair[token0][token1] == address(0), \"MagicswapV2: PAIR_EXISTS\"); // single check is sufficient\n bytes memory bytecode = type(UniswapV2Pair).creationCode;\n bytes32 salt = keccak256(abi.encodePacked(token0, token1));\n assembly {\n pair := create2(0, add(bytecode, 32), mload(bytecode), salt)\n }\n IUniswapV2Pair(pair).initialize(token0, token1);\n getPair[token0][token1] = pair;\n getPair[token1][token0] = pair; // populate mapping in the reverse direction\n _allPairs.add(pair);\n emit PairCreated(token0, token1, pair, _allPairs.length());\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setDefaultFees(DefaultFees memory _fees) public onlyOwner {\n require(_fees.protocolFee <= MAX_FEE, \"MagicswapV2: protocolFee > MAX_FEE\");\n require(_fees.lpFee <= MAX_FEE, \"MagicswapV2: lpFee > MAX_FEE\");\n require(_fees.protocolFee + _fees.lpFee <= MAX_FEE, \"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n\n defaultFees = _fees;\n\n emit DefaultFeesSet(_fees);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setLpFee(address _pair, uint256 _lpFee, bool _overrideFee) external onlyOwner {\n require(_lpFee <= MAX_FEE, \"MagicswapV2: _lpFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].lpFee = _lpFee;\n pairFees[_pair].lpFeeOverride = _overrideFee;\n\n emit LpFeesSet(_pair, _lpFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setRoyaltiesFee(address _pair, address _beneficiary, uint256 _royaltiesFee) external onlyOwner {\n require(_royaltiesFee <= MAX_FEE, \"MagicswapV2: _royaltiesFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n require(_beneficiary != address(0), \"MagicswapV2: _beneficiary invalid\");\n\n pairFees[_pair].royaltiesBeneficiary = _beneficiary;\n pairFees[_pair].royaltiesFee = _royaltiesFee;\n\n emit RoyaltiesFeesSet(_pair, _beneficiary, _royaltiesFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFee(address _pair, uint256 _protocolFee, bool _overrideFee) external onlyOwner {\n require(_protocolFee <= MAX_FEE, \"MagicswapV2: _protocolFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].protocolFee = _protocolFee;\n pairFees[_pair].protocolFeeOverride = _overrideFee;\n\n emit ProtocolFeesSet(_pair, _protocolFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFeeBeneficiary(address _beneficiary) public onlyOwner {\n require(_beneficiary != address(0), \"MagicswapV2: BENEFICIARY\");\n protocolFeeBeneficiary = _beneficiary;\n\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n }\n\n function _getLpFee(address _pair) internal view returns (uint256 lpFee) {\n if (pairFees[_pair].lpFeeOverride) {\n return pairFees[_pair].lpFee;\n } else {\n return defaultFees.lpFee;\n }\n }\n\n function _getRoyaltiesFee(address _pair) internal view returns (uint256 royaltiesFee) {\n return pairFees[_pair].royaltiesFee;\n }\n\n function _getProtocolFee(address _pair) internal view returns (uint256 protocolFee) {\n if (pairFees[_pair].protocolFeeOverride) {\n return pairFees[_pair].protocolFee;\n } else {\n return defaultFees.protocolFee;\n }\n }\n\n function _getFees(address _pair) internal view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n lpFee = _getLpFee(_pair);\n /// lpFee should never be above MAX_FEE but never too safe.\n /// If lpFee is set to MAX_FEE then we know there's no more space for other fees\n if (lpFee >= MAX_FEE) {\n return (MAX_FEE, 0, 0);\n }\n\n royaltiesFee = _getRoyaltiesFee(_pair);\n /// if royaltiesFee + lpFee is greater than MAX_FEE, then decrease royaltiesFee\n /// and return as we know there's no more space for other fees\n if (royaltiesFee >= MAX_FEE - lpFee) {\n return (lpFee, MAX_FEE - lpFee, 0);\n }\n\n protocolFee = _getProtocolFee(_pair);\n /// if protocolFee + royaltiesFee + lpFee is greater than MAX_FEE, then decrease protocolFee\n if (protocolFee > MAX_FEE - lpFee - royaltiesFee) {\n protocolFee = MAX_FEE - lpFee - royaltiesFee;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"./interfaces/IUniswapV2Pair.sol\";\nimport \"./interfaces/IUniswapV2Factory.sol\";\n\nimport \"./libraries/UniswapV2Math.sol\";\nimport \"./libraries/Oracle.sol\";\n\nimport \"./UniswapV2ERC20.sol\";\n\ncontract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {\n using SafeMath for uint256;\n using Oracle for Oracle.Observation[65535];\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n uint256 public constant BASIS_POINTS = 10000;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n // decimal points of token0\n uint256 public TOKEN0_DECIMALS;\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n // the most recent price of token1/token0. Inherits decimals of token1.\n uint256 public lastPrice;\n // the most-recently updated index of the observations array\n uint16 public observationIndex;\n // the current maximum number of observations that are being stored\n uint16 public observationCardinality;\n // the next maximum number of observations to store, triggered in observations.write\n uint16 public observationCardinalityNext;\n\n Oracle.Observation[65535] public override observations;\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"MagicswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"MagicswapV2: TRANSFER_FAILED\");\n }\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"MagicswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n\n TOKEN0_DECIMALS = UniswapV2ERC20(_token0).decimals();\n\n (uint16 cardinality, uint16 cardinalityNext) = observations.initialize(_blockTimestamp());\n\n observationIndex = 0;\n observationCardinality = cardinality;\n observationCardinalityNext = cardinalityNext;\n }\n\n function _blockTimestamp() internal view virtual returns (uint32) {\n return uint32(block.timestamp); // truncation is desired\n }\n\n /// @dev update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"MagicswapV2: OVERFLOW\");\n\n uint32 blockTimestamp;\n uint32 timeElapsed;\n unchecked {\n blockTimestamp = uint32(block.timestamp % 2 ** 32);\n timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n }\n\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // this is first trade of the block and reserves are not yet updated\n lastPrice = 10 ** TOKEN0_DECIMALS * _reserve1 / _reserve0;\n\n // write an oracle entry\n (observationIndex, observationCardinality) = observations.write(\n observationIndex, _blockTimestamp(), lastPrice, observationCardinality, observationCardinalityNext\n );\n }\n\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n /// @dev Calculates fees and sends them to beneficiaries\n function _takeFees(uint256 balance0Adjusted, uint256 balance1Adjusted, uint256 amount0In, uint256 amount1In)\n internal\n returns (uint256 balance0, uint256 balance1)\n {\n (, address royaltiesBeneficiary, uint256 royaltiesFee, address protocolFeeBeneficiary, uint256 protocolFee) =\n IUniswapV2Factory(factory).getFeesAndRecipients(address(this));\n\n address _token0 = token0;\n address _token1 = token1;\n\n for (uint8 i = 0; i < 2; i++) {\n address feeToken = i == 0 ? _token0 : _token1;\n uint256 swapAmount = i == 0 ? amount0In : amount1In;\n\n if (swapAmount > 0) {\n uint256 royaltiesFeeAmount = swapAmount * royaltiesFee / BASIS_POINTS;\n\n // send royalties\n if (royaltiesFeeAmount > 0) {\n _safeTransfer(feeToken, royaltiesBeneficiary, royaltiesFeeAmount);\n }\n\n uint256 protocolFeeAmount = swapAmount * protocolFee / BASIS_POINTS;\n\n // send protocol fee\n if (protocolFeeAmount > 0) {\n _safeTransfer(feeToken, protocolFeeBeneficiary, protocolFeeAmount);\n }\n }\n }\n\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n // Make sure that either balance does not go below adjusted balance used for K calcualtions.\n // If balances after fee transfers are above or equal adjusted balances then K still holds.\n require(balance0 >= balance0Adjusted / BASIS_POINTS, \"MagicswapV2: balance0Adjusted\");\n require(balance1 >= balance1Adjusted / BASIS_POINTS, \"MagicswapV2: balance1Adjusted\");\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Mint(msg.sender, amount0, amount1);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n /// @dev keeping bytes parameter for backward compatibility of the interface\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"MagicswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"MagicswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"MagicswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"MagicswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(address(this));\n uint256 balance0Adjusted = balance0.mul(BASIS_POINTS).sub(amount0In.mul(totalFee));\n uint256 balance1Adjusted = balance1.mul(BASIS_POINTS).sub(amount1In.mul(totalFee));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(BASIS_POINTS ** 2),\n \"MagicswapV2: K\"\n );\n (balance0, balance1) = _takeFees(balance0Adjusted, balance1Adjusted, amount0In, amount1In);\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n /// @dev Read TWAP price\n function observe(uint32[] calldata secondsAgos)\n external\n view\n override\n returns (uint256[] memory priceCumulatives)\n {\n return observations.observe(_blockTimestamp(), secondsAgos, lastPrice, observationIndex, observationCardinality);\n }\n\n /// @dev Increase number of data points for price history\n function increaseObservationCardinalityNext(uint16 _observationCardinalityNext) external override lock {\n uint16 observationCardinalityNextOld = observationCardinalityNext; // for the event\n uint16 observationCardinalityNextNew =\n observations.grow(observationCardinalityNextOld, _observationCardinalityNext);\n observationCardinalityNext = observationCardinalityNextNew;\n if (observationCardinalityNextOld != observationCardinalityNextNew) {\n emit IncreaseObservationCardinalityNext(observationCardinalityNextOld, observationCardinalityNextNew);\n }\n }\n\n /// @dev force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n /// @dev force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/Babylonian.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// computes square roots using the babylonian method\n// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method\nlibrary Babylonian {\n // credit for this implementation goes to\n // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687\n function sqrt(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);\n // however that code costs significantly more gas\n uint256 xx = x;\n uint256 r = 1;\n if (xx >= 0x100000000000000000000000000000000) {\n xx >>= 128;\n r <<= 64;\n }\n if (xx >= 0x10000000000000000) {\n xx >>= 64;\n r <<= 32;\n }\n if (xx >= 0x100000000) {\n xx >>= 32;\n r <<= 16;\n }\n if (xx >= 0x10000) {\n xx >>= 16;\n r <<= 8;\n }\n if (xx >= 0x100) {\n xx >>= 8;\n r <<= 4;\n }\n if (xx >= 0x10) {\n xx >>= 4;\n r <<= 2;\n }\n if (xx >= 0x8) {\n r <<= 1;\n }\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1; // Seven iterations should be enough\n uint256 r1 = x / r;\n return (r < r1 ? r : r1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/BitMath.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nlibrary BitMath {\n // returns the 0 indexed position of the most significant bit of the input x\n // s.t. x >= 2**msb and x < 2**(msb+1)\n function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::mostSignificantBit: zero\");\n\n if (x >= 0x100000000000000000000000000000000) {\n x >>= 128;\n r += 128;\n }\n if (x >= 0x10000000000000000) {\n x >>= 64;\n r += 64;\n }\n if (x >= 0x100000000) {\n x >>= 32;\n r += 32;\n }\n if (x >= 0x10000) {\n x >>= 16;\n r += 16;\n }\n if (x >= 0x100) {\n x >>= 8;\n r += 8;\n }\n if (x >= 0x10) {\n x >>= 4;\n r += 4;\n }\n if (x >= 0x4) {\n x >>= 2;\n r += 2;\n }\n if (x >= 0x2) r += 1;\n }\n\n // returns the 0 indexed position of the least significant bit of the input x\n // s.t. (x & 2**lsb) != 0 and (x & (2**(lsb) - 1)) == 0)\n // i.e. the bit at the index is set and the mask of all lower bits is 0\n function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::leastSignificantBit: zero\");\n\n r = 255;\n if (x & type(uint128).max > 0) {\n r -= 128;\n } else {\n x >>= 128;\n }\n if (x & type(uint64).max > 0) {\n r -= 64;\n } else {\n x >>= 64;\n }\n if (x & type(uint32).max > 0) {\n r -= 32;\n } else {\n x >>= 32;\n }\n if (x & type(uint16).max > 0) {\n r -= 16;\n } else {\n x >>= 16;\n }\n if (x & type(uint8).max > 0) {\n r -= 8;\n } else {\n x >>= 8;\n }\n if (x & 0xf > 0) {\n r -= 4;\n } else {\n x >>= 4;\n }\n if (x & 0x3 > 0) {\n r -= 2;\n } else {\n x >>= 2;\n }\n if (x & 0x1 > 0) r -= 1;\n }\n}\n" + }, + "contracts/UniswapV2/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: CC-BY-4.0\npragma solidity 0.8.20;\n\n// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1\n// license is CC-BY-4.0\nlibrary FullMath {\n function inverse(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n\n return type(uint256).max - x + 1;\n }\n\n function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {\n uint256 mm = mulmod(x, y, type(uint256).max);\n l = x * y;\n h = mm - l;\n if (mm < l) h -= 1;\n }\n\n function fullDiv(uint256 l, uint256 h, uint256 d) private pure returns (uint256) {\n uint256 pow2 = d & inverse(d);\n d /= pow2;\n l /= pow2;\n l += h * ((inverse(pow2)) / pow2 + 1);\n uint256 r = 1;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n return l * r;\n }\n\n function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) {\n (uint256 l, uint256 h) = fullMul(x, y);\n\n uint256 mm = mulmod(x, y, d);\n if (mm > l) h -= 1;\n l -= mm;\n\n if (h == 0) return l / d;\n\n require(h < d, \"FullMath: FULLDIV_OVERFLOW\");\n return fullDiv(l, h, d);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false\nlibrary TransferHelper {\n function safeApprove(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('approve(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeApprove: approve failed\"\n );\n }\n\n function safeTransfer(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transfer(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeTransfer: transfer failed\"\n );\n }\n\n function safeTransferFrom(address token, address from, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))),\n \"TransferHelper::transferFrom: transferFrom failed\"\n );\n }\n\n function safeTransferETH(address to, uint256 value) internal {\n (bool success,) = to.call{value: value}(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n }\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Router01 {\n\n error UniswapV2RouterExpired();\n error UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n error UniswapV2RouterInsufficientBAmount();\n error UniswapV2RouterInsufficientAAmount();\n error UniswapV2RouterInsufficientOutputAmount();\n error UniswapV2RouterExcessiveInputAmount();\n error UniswapV2RouterInvalidPath();\n\n function factory() external view returns (address);\n function WETH() external view returns (address);\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountToken, uint256 amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountToken, uint256 amountETH);\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountOut);\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountIn);\n function getAmountsOut(uint256 amountIn, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n function getAmountsIn(uint256 amountOut, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IWETH {\n function deposit() external payable;\n function transfer(address to, uint value) external returns (bool);\n function withdraw(uint) external;\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/OracleLibrary.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\n\n/// @title Oracle library\n/// @notice Provides functions to integrate with MagicswapV2 pool oracle\nlibrary OracleLibrary {\n /// @notice Fetches time-weighted average price using MagicswapV2 oracle\n /// @param pool Address of Uniswap V3 pool that we want to observe\n /// @param period Number of seconds in the past to start calculating time-weighted average\n /// @return timeWeightedAveragePrice The time-weighted average tick from (block.timestamp - period) to block.timestamp\n function consult(address pool, uint32 period) internal view returns (uint256 timeWeightedAveragePrice) {\n require(period != 0, \"BP\");\n\n uint32[] memory secondAgos = new uint32[](2);\n secondAgos[0] = period;\n secondAgos[1] = 0;\n\n uint256[] memory priceCumulatives = IUniswapV2Pair(pool).observe(secondAgos);\n uint256 priceCumulativesDelta = priceCumulatives[1] - priceCumulatives[0];\n\n timeWeightedAveragePrice = priceCumulativesDelta / period;\n }\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\nimport \"../../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../../core/libraries/SafeMath.sol\";\n\n/**\n * @notice Modified UniswapV2 to work with zksync stack based CREATE2\n **/\nlibrary UniswapV2Library {\n using SafeMath for uint256;\n\n /// @dev returns sorted token addresses, used to handle return values from pairs sorted in this order\n function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {\n require(tokenA != tokenB, \"UniswapV2Library: IDENTICAL_ADDRESSES\");\n (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"UniswapV2Library: ZERO_ADDRESS\");\n }\n\n // calculates the CREATE2 address for a pair without making any external calls\n function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {\n (address token0, address token1) = sortTokens(tokenA, tokenB);\n pair = address(uint160(\n uint256(\n keccak256(\n abi.encodePacked(\n bytes32(0x2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494), // keccak256(\"zksyncCreate2\")\n bytes32(uint256(uint160(factory))), // sender\n keccak256(abi.encodePacked(token0, token1)), // salt\n hex'010004df694643e2d7e17535f16c21e9d1698b06c2ef330166830639b23b7f43', // init code hash\n bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) // constructor input hash: keccak256(\"\")\n )\n )\n )\n ));\n }\n\n /// @dev fetches and sorts the reserves for a pair\n function getReserves(address factory, address tokenA, address tokenB)\n internal\n view\n returns (uint256 reserveA, uint256 reserveB)\n {\n (address token0,) = sortTokens(tokenA, tokenB);\n (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();\n (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);\n }\n\n /// @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) {\n require(amountA > 0, \"UniswapV2Library: INSUFFICIENT_AMOUNT\");\n require(reserveA > 0 && reserveB > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n amountB = amountA.mul(reserveB) / reserveA;\n }\n\n /// @dev given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountOut)\n {\n require(amountIn > 0, \"UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 amountInWithFee = amountIn.mul(10000 - totalFee);\n uint256 numerator = amountInWithFee.mul(reserveOut);\n uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);\n amountOut = numerator / denominator;\n }\n\n /// @dev given an output amount of an asset and pair reserves, returns a required input amount of the other asset\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountIn)\n {\n require(amountOut > 0, \"UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 numerator = reserveIn.mul(amountOut).mul(10000);\n uint256 denominator = reserveOut.sub(amountOut).mul(10000 - totalFee);\n amountIn = (numerator / denominator).add(1);\n }\n\n /// @dev performs chained getAmountOut calculations on any number of pairs\n function getAmountsOut(address factory, uint256 amountIn, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[0] = amountIn;\n for (uint256 i; i < path.length - 1; i++) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);\n amounts[i + 1] =\n getAmountOut(amounts[i], reserveIn, reserveOut, pairFor(factory, path[i], path[i + 1]), factory);\n }\n }\n\n /// @dev performs chained getAmountIn calculations on any number of pairs\n function getAmountsIn(address factory, uint256 amountOut, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[amounts.length - 1] = amountOut;\n for (uint256 i = path.length - 1; i > 0; i--) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);\n address pair = pairFor(factory, path[i - 1], path[i]);\n amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, pair, factory);\n }\n }\n}\n" + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../core/interfaces/IUniswapV2ERC20.sol\";\nimport \"../core/libraries/SafeMath.sol\";\nimport \"../libraries/TransferHelper.sol\";\n\nimport \"./interfaces/IUniswapV2Router01.sol\";\nimport \"./libraries/UniswapV2Library.sol\";\nimport \"./interfaces/IWETH.sol\";\n\ncontract UniswapV2Router02 is IUniswapV2Router01 {\n using SafeMath for uint256;\n\n address public immutable override factory;\n address public immutable override WETH;\n\n \n modifier ensure(uint256 deadline) {\n if(deadline < block.timestamp) revert UniswapV2RouterExpired();\n _;\n }\n\n constructor(address _factory, address _WETH) {\n factory = _factory;\n WETH = _WETH;\n }\n\n receive() external payable {\n if(msg.sender != WETH) revert UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n }\n\n // **** ADD LIQUIDITY ****\n function _addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin\n ) internal virtual returns (uint256 amountA, uint256 amountB) {\n // create the pair if it doesn't exist yet\n if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {\n IUniswapV2Factory(factory).createPair(tokenA, tokenB);\n }\n (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);\n if (reserveA == 0 && reserveB == 0) {\n (amountA, amountB) = (amountADesired, amountBDesired);\n } else {\n uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);\n if (amountBOptimal <= amountBDesired) {\n if(amountBOptimal < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n (amountA, amountB) = (amountADesired, amountBOptimal);\n } else {\n uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);\n assert(amountAOptimal <= amountADesired);\n if(amountAOptimal < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n (amountA, amountB) = (amountAOptimal, amountBDesired);\n }\n }\n }\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) {\n (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);\n TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);\n liquidity = IUniswapV2Pair(pair).mint(to);\n }\n\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable virtual override returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH, liquidity) =\n _addLiquidityETH(token, amountTokenDesired, amountTokenMin, amountETHMin, msg.sender, to, deadline);\n }\n\n function _addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH) =\n _addLiquidity(token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n TransferHelper.safeTransferFrom(token, from, pair, amountToken);\n IWETH(WETH).deposit{value: amountETH}();\n assert(IWETH(WETH).transfer(pair, amountETH));\n liquidity = IUniswapV2Pair(pair).mint(to);\n // refund dust eth, if any\n if (msg.value > amountETH) TransferHelper.safeTransferETH(to, msg.value - amountETH);\n }\n\n // **** REMOVE LIQUIDITY ****\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n IUniswapV2ERC20(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair\n (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);\n (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);\n (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);\n if(amountA < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n if(amountB < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n }\n\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);\n TransferHelper.safeTransfer(token, to, amountToken);\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(to, amountETH);\n }\n\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);\n }\n\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountToken, uint256 amountETH) {\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);\n }\n\n // **** SWAP ****\n // requires the initial amount to have already been sent to the first pair\n function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual {\n for (uint256 i; i < path.length - 1; i++) {\n (address input, address output) = (path[i], path[i + 1]);\n (address token0,) = UniswapV2Library.sortTokens(input, output);\n uint256 amountOut = amounts[i + 1];\n (uint256 amount0Out, uint256 amount1Out) =\n input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));\n address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;\n IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(\n amount0Out, amount1Out, to, new bytes(0)\n );\n }\n }\n\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address to,\n uint256 deadline\n ) public virtual override returns (uint256[] memory amounts) {\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, path, msg.sender, to, deadline);\n }\n\n function _swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override returns (uint256[] memory amounts) {\n amounts = _swapTokensForExactTokens(amountOut, amountInMax, path, msg.sender, to, deadline);\n }\n\n function _swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n public\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > msg.value) revert UniswapV2RouterExcessiveInputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n // refund dust eth, if any\n if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);\n }\n\n // **** LIBRARY FUNCTIONS ****\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB)\n public\n pure\n virtual\n override\n returns (uint256 amountB)\n {\n return UniswapV2Library.quote(amountA, reserveA, reserveB);\n }\n\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountOut)\n {\n return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountIn)\n {\n return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountsOut(uint256 amountIn, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsOut(factory, amountIn, path);\n }\n\n function getAmountsIn(uint256 amountOut, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsIn(factory, amountOut, path);\n }\n}\n" + }, + "contracts/Vault/INftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVault {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Collection already added\n error DuplicateCollection();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice amount of token required for last NFT to be redeemed\n function LAST_NFT_AMOUNT() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n}\n" + }, + "contracts/Vault/INftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVault.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactory {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVault indexed vault,\n uint256 indexed vaultId,\n INftVault.CollectionData[] collections,\n address creator\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVault vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param index vaultId or index in NftVaultFactory.vaults array\n /// @return vault address\n function getVaultAt(uint256 index) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n /// @return true if vault is deployed by the factory\n function isVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVault.CollectionData[] memory collections) external view returns (INftVault vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVault.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVault.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function reverts\n /// @param collections vault's config\n /// @return vault address of deployed vault\n function createVault(INftVault.CollectionData[] memory collections) external returns (INftVault vault);\n}\n" + }, + "contracts/Vault/NftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVault.sol\";\nimport \"./INftVaultFactory.sol\";\n\ncontract NftVault is INftVault, ERC20, ERC721Holder, ERC1155Holder {\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice amount of token required for last NFT to be redeemed\n uint256 public immutable LAST_NFT_AMOUNT;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n /// @dev last NFT can be redeemed for 99.9%\n LAST_NFT_AMOUNT = ONE * 999 / 1000;\n }\n\n /// @inheritdoc INftVault\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n if (!allowedCollections.set(collection.addr, nftType)) revert DuplicateCollection();\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n emit CollectionAllowed(collection);\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n }\n }\n\n /// @inheritdoc INftVault\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVault\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVault\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVault\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVault\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n uint256 totalSupply_ = totalSupply();\n\n /// @dev If vault ERC20 supply is \"0 < totalSupply <= 0.01\" it means that vault has been emptied and there\n /// is leftover ERC20 token (most likely) locked in the univ2 pair. To prevent minting small amounts\n /// of unbacked ERC20 tokens in a loop, which can lead to unexpected behaviour, vault mints\n /// `ONE - totalSupply` amount of ERC20 token for the first NFT that is deposited after the vault was\n /// emptied. This allows for the vault and univ2 pair to be reused safely.\n if (totalSupply_ > 0 && totalSupply_ <= ONE - LAST_NFT_AMOUNT) {\n amountMinted -= totalSupply_;\n }\n\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVault\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow redeemeing for LAST_NFT_AMOUNT instead of ONE\n if (totalSupply() == amountBurned && balanceOf(address(this)) >= amountBurned - ONE + LAST_NFT_AMOUNT) {\n amountBurned = balanceOf(address(this));\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVault\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n}\n" + }, + "contracts/Vault/NftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactory.sol\";\nimport \"./NftVault.sol\";\n\ncontract NftVaultFactory is INftVaultFactory {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n\n mapping(bytes32 => INftVault) public vaultHashMap;\n mapping(INftVault => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactory\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultAt(uint256 _index) external view returns (address) {\n return vaults.at(_index);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactory\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVault(INftVault.CollectionData[] memory _collections) public view returns (INftVault vault) {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactory\n function exists(INftVault.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactory\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactory\n function createVault(INftVault.CollectionData[] memory _collections) external returns (INftVault vault) {\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVault(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists, revert\n if (address(vault) != address(0)) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n\n vault = INftVault(address(new NftVault(name, symbol)));\n vault.init(_collections);\n\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender);\n }\n}\n" + }, + "contracts/Vault/test/NftVault.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultTest is Test {\n NftVaultFactory public nftVaultFactory = new NftVaultFactory();\n\n address user1 = address(1001);\n address user2 = address(1002);\n address owner = address(1003);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else if (configId == 8) {\n collections.push(collectionERC721all);\n collections.push(collectionERC721all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function _deployTestVault(uint256 configId)\n public\n returns (NftVault vault, INftVault.CollectionData[] memory _collections)\n {\n _collections = _getConfig(configId);\n vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n }\n\n function _getAddressesFromCollections(INftVault.CollectionData[] memory _collections)\n public\n view\n returns (address[] memory addresses)\n {\n addresses = new address[](_collections.length);\n\n for (uint256 i = 0; i < collections.length; i++) {\n addresses[i] = _collections[i].addr;\n }\n }\n\n function testInitReverts() public {\n NftVault nftVault;\n\n delete collections;\n vm.expectRevert(INftVault.InvalidCollections.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionAllWithTokenIds);\n vm.expectRevert(INftVault.TokenIdsMustBeEmpty.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC1155allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedMissingTokens);\n vm.expectRevert(INftVault.MissingTokenIds.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedUnsortedTokens);\n vm.expectRevert(INftVault.TokenIdsMustBeSorted.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedDuplicatedTokens);\n vm.expectRevert(INftVault.TokenIdAlreadySet.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n INftVault.CollectionData[] memory _collections = _getConfig(8);\n vm.expectRevert(INftVault.DuplicateCollection.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(nftVault.VAULT_HASH(), bytes32(0));\n assertEq(nftVault.getAllowedCollections(), new address[](0));\n assertEq(nftVault.getAllowedCollectionsLength(), 0);\n assertEq(nftVault.ONE(), 10 ** nftVault.decimals());\n assertEq(nftVault.ONE(), 1e18);\n assertEq(nftVault.name(), \"name\");\n assertEq(nftVault.symbol(), \"symbol\");\n }\n\n function testInitStorage() public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n assertEq(vault.hashVault(_collections), vault.VAULT_HASH());\n assertEq(vault.getAllowedCollections(), _getAddressesFromCollections(_collections));\n assertEq(vault.getAllowedCollectionsLength(), _collections.length);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n INftVault.CollectionData memory c = vault.getAllowedCollectionData(_collections[i].addr);\n assertEq(c.addr, _collections[i].addr);\n assertEq(uint256(c.nftType), uint256(_collections[i].nftType));\n assertEq(c.allowAllIds, _collections[i].allowAllIds);\n assertEq(c.tokenIds, _collections[i].tokenIds);\n\n for (uint256 j = 0; j < _collections[i].tokenIds.length; j++) {\n assertTrue(vault.isTokenAllowed(_collections[i].addr, _collections[i].tokenIds[j]));\n }\n }\n\n vm.expectRevert(INftVault.Initialized.selector);\n vault.init(_collections);\n }\n }\n\n function testValidateNftType() public {\n NftVault nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721all.addr, collectionERC721all.nftType)),\n uint256(collectionERC721all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155all.addr, collectionERC1155all.nftType)),\n uint256(collectionERC1155all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721allowed.addr, collectionERC721allowed.nftType)),\n uint256(collectionERC721allowed.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155allowed.addr, collectionERC1155allowed.nftType)),\n uint256(collectionERC1155allowed.nftType)\n );\n\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault.validateNftType(collectionERC721allWrongNftType.addr, collectionERC721allWrongNftType.nftType);\n\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault.validateNftType(collectionERC1155allWrongNftType.addr, collectionERC1155allWrongNftType.nftType);\n\n // test hypothetical contract that supports ERC721 and ERC1155\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC721).interfaceId)), abi.encode(true)\n );\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC1155).interfaceId)), abi.encode(true)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC721)),\n uint256(INftVault.NftType.ERC721)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC1155)),\n uint256(INftVault.NftType.ERC1155)\n );\n vm.clearMockedCalls();\n }\n\n function testIsTokenAllowed(address collectionAddr, uint256 tokenId) public {\n delete collections;\n INftVault.CollectionData memory config = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n collections.push(config);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(collectionAddr != config.addr);\n\n for (uint256 i = 0; i < erc721tokenIds.length; i++) {\n vm.assume(tokenId != erc721tokenIds[i]);\n }\n\n assertFalse(nftVault.isTokenAllowed(collectionAddr, tokenId));\n }\n\n function testGetSentTokenBalance(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n assertEq(nftVault.getSentTokenBalance(address(erc721), tokenId), 1);\n\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n assertEq(nftVault.getSentTokenBalance(address(erc1155), tokenId), amount);\n }\n\n function testDepositRevert(uint256 _tokenId, uint256 _amount) public {\n uint256 otherTokenId = 56464987645;\n vm.assume(_tokenId != otherTokenId);\n vm.assume(_amount < type(uint256).max);\n\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.expectRevert(INftVault.DisallowedToken.selector);\n nftVault.deposit(user1, address(5566), _tokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(user2, otherTokenId);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, otherTokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n assertEq(nftVault.getSentTokenBalance(collections[0].addr, _tokenId), 1);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, _tokenId, 0);\n\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n assertEq(nftVault.getSentTokenBalance(collections[1].addr, _tokenId), _amount);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[1].addr, _tokenId, _amount + 1);\n }\n\n function testNoDepositGriefing() public {\n delete collections;\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n // User deposited 1 token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n\n // Malicious user manually transferred 1 token to the vault\n vm.startPrank(user2);\n ERC1155Mintable(collections[0].addr).mint(user2, 1, 1);\n ERC1155Mintable(collections[0].addr).safeTransferFrom(user2, address(nftVault), 1, 1, bytes(\"\"));\n vm.stopPrank();\n\n // User deposited 1 more token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n }\n\n function testDepositAllConfigs(uint256 _tokenId, uint256 _amount) public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n for (uint256 i = 0; i < _collections.length; i++) {\n if (!collections[i].allowAllIds) {\n // if not all allowed, take random tokenId that is allowed with fuzzing for randomness\n _tokenId = collections[i].tokenIds[_tokenId % collections[i].tokenIds.length];\n }\n\n if (collections[i].nftType == INftVault.NftType.ERC721) {\n _amount = 1;\n ERC721Mintable(collections[i].addr).mint(address(vault), _tokenId);\n } else {\n ERC1155Mintable(collections[i].addr).mint(address(vault), _tokenId, _amount);\n }\n\n uint256 balancesBefore = vault.balances(collections[i].addr, _tokenId);\n uint256 erc20balanceBefore = vault.balanceOf(user1);\n\n vm.expectEmit(true, true, true, true);\n emit Deposit(user1, collections[i].addr, _tokenId, _amount);\n uint256 amountMinted = vault.deposit(user1, collections[i].addr, _tokenId, _amount);\n\n assertEq(amountMinted / vault.ONE(), _amount);\n assertEq(vault.balanceOf(user1), erc20balanceBefore + amountMinted);\n assertEq(vault.balances(collections[i].addr, _tokenId), balancesBefore + _amount);\n }\n }\n }\n\n function testDepositBatchWithdrawBatch(uint256 _tokenId, uint256[] memory _amounts) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(_amounts.length > 10);\n\n assertEq(nftVault.balanceOf(user1), 0);\n\n address[] memory collectionBatch = new address[](10);\n uint256[] memory tokenIdBatch = new uint256[](10);\n uint256[] memory amountBatch = new uint256[](10);\n uint256 expectedAmountMinted = 0;\n\n for (uint256 i = 0; i < 10; i++) {\n vm.assume(_tokenId < type(uint64).max);\n uint256 tokenId = _tokenId + i;\n\n vm.assume(_amounts[i] > 0);\n vm.assume(_amounts[i] < type(uint64).max);\n uint256 amount = _amounts[i];\n\n if (i % 2 == 0) {\n ERC721Mintable(collections[0].addr).mint(address(nftVault), tokenId);\n collectionBatch[i] = collections[0].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = 1;\n } else {\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), tokenId, amount);\n collectionBatch[i] = collections[1].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = amount;\n }\n\n expectedAmountMinted += amountBatch[i];\n }\n\n uint256 amountMinted = nftVault.depositBatch(user1, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountMinted / nftVault.ONE(), expectedAmountMinted);\n assertEq(nftVault.balanceOf(user1), expectedAmountMinted * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n for (uint256 i = 0; i < 10; i++) {\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), amountBatch[i]);\n }\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted);\n\n uint256 amountBurned = nftVault.withdrawBatch(user2, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountBurned, amountMinted);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(user2), 0);\n\n for (uint256 i = 0; i < 10; i++) {\n if (i % 2 == 0) {\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(tokenIdBatch[i]), user2);\n } else {\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user2, tokenIdBatch[i]), amountBatch[i]);\n }\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), 0);\n }\n }\n\n function testWithdrawRevert(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user1, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 2);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount);\n }\n\n function testWithdraw(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user2, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted721);\n\n uint256 amountBurned = nftVault.withdraw(user1, collections[1].addr, _tokenId, 1);\n\n assertEq(amountBurned, amountMinted721);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), _amount - 1);\n\n uint256 transferAmount = amountMinted1155 - nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[1].addr, _tokenId, _amount - 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), nftVault.ONE());\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n\n transferAmount = nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[0].addr, _tokenId, 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), user2);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n }\n\n function testWithdrawLast(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n address[] memory lastCollections = new address[](2);\n uint256[] memory lastTokenIds = new uint256[](2);\n uint256[] memory lastAmounts = new uint256[](2);\n\n lastCollections[0] = collections[0].addr;\n lastCollections[1] = collections[1].addr;\n\n lastTokenIds[0] = _tokenId;\n lastTokenIds[1] = _tokenId;\n\n lastAmounts[0] = 1;\n lastAmounts[1] = _amount;\n\n uint256 amountMinted = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(amountMinted, (_amount + 1) * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n vm.startPrank(user1);\n nftVault.transfer(owner, nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n nftVault.transfer(address(nftVault), nftVault.balanceOf(user1));\n vm.stopPrank();\n\n nftVault.withdrawBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(_tokenId), user1);\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user1, _tokenId), _amount);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(address(nftVault)), 0);\n assertEq(nftVault.totalSupply(), nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n\n vm.startPrank(user1);\n ERC721Mintable(collections[0].addr).transferFrom(user1, address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).safeTransferFrom(user1, address(nftVault), _tokenId, _amount, bytes(\"\"));\n vm.stopPrank();\n\n uint256 amountMinted2 = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n assertEq(amountMinted2, (_amount + 1) * nftVault.ONE() - nftVault.ONE() + nftVault.LAST_NFT_AMOUNT());\n }\n\n function testSkim(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n assertTrue(nftVault.isTokenAllowed(address(erc721), tokenId));\n assertEq(erc721.balanceOf(user2), 0);\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(erc721), tokenId, 1);\n\n assertTrue(nftVault.isTokenAllowed(address(erc1155), tokenId));\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(erc1155), tokenId, amount);\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n\n ERC721Mintable newErc721 = new ERC721Mintable();\n\n newErc721.mint(address(nftVault), tokenId);\n assertFalse(nftVault.isTokenAllowed(address(newErc721), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(newErc721), tokenId, amount);\n assertEq(newErc721.balanceOf(user2), 1);\n\n ERC1155Mintable newErc1155 = new ERC1155Mintable();\n\n newErc1155.mint(address(nftVault), tokenId, amount);\n assertFalse(nftVault.isTokenAllowed(address(newErc1155), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(newErc1155), tokenId, amount);\n assertEq(newErc1155.balanceOf(user2, tokenId), amount);\n }\n}\n" + }, + "contracts/Vault/test/NftVaultFactory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultFactoryTest is Test {\n address user1 = address(1001);\n address user2 = address(1002);\n address owner1 = address(1003);\n address owner2 = address(1004);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function testVaultAlreadyDeployed() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n INftVault.CollectionData[] memory _collections = _getConfig(0);\n\n vaultFactory.createVault(_collections);\n\n vm.expectRevert(INftVaultFactory.VaultAlreadyDeployed.selector);\n vaultFactory.createVault(_collections);\n }\n\n function testAllGetters() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n address[] memory vaults = new address[](8);\n\n for (uint256 configId = 0; configId < 8; configId++) {\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n\n INftVault vault = vaultFactory.createVault(_collections);\n\n vaults[configId] = address(vault);\n\n address[] memory getAllVaults = new address[](configId + 1);\n for (uint256 i = 0; i < getAllVaults.length; i++) {\n if (vaults[i] != address(0)) {\n getAllVaults[i] = vaults[i];\n }\n }\n\n assertEq(vaultFactory.getAllVaults(), getAllVaults);\n assertEq(vaultFactory.getVaultAt(configId), vaults[configId]);\n assertEq(vaultFactory.getVaultLength(), configId + 1);\n assertEq(vaultFactory.isVault(vaults[configId]), true);\n assertEq(vaultFactory.isVault(address(uint160(vaults[configId]) + 1)), false);\n assertEq(address(vaultFactory.getVault(_collections)), vaults[configId]);\n assertEq(vaultFactory.exists(_collections), true);\n assertEq(address(vaultFactory.vaultHashMap(vaultFactory.hashVault(_collections))), vaults[configId]);\n assertEq(vaultFactory.getVaultAt(vaultFactory.vaultIdMap(INftVault(vaults[configId]))), vaults[configId]);\n }\n }\n}\n" + }, + "contracts/VaultPermissioned/INftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVaultPermissioned.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactoryPermissioned {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVaultPermissioned vault,\n uint256 vaultId,\n INftVaultPermissioned.CollectionData[] collections,\n address creator,\n address owner\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVaultPermissioned vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getVaultAt(uint256 i) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n function isVault(address vault) external view returns (bool);\n\n /// @return all deployed permissioned vaults\n function getAllPermissionedVaults() external view returns (address[] memory);\n\n /// @notice Get permissioned vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getPermissionedVaultAt(uint256 i) external view returns (address);\n\n /// @return length of permissioned vault's EnumerableSet\n function getPermissionedVaultLength() external view returns (uint256);\n\n /// @notice Returns true if permissioned vault has been deployed by factory\n /// @param vault address\n function isPermissionedVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVaultPermissioned.CollectionData[] memory collections)\n external\n view\n returns (INftVaultPermissioned vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVaultPermissioned.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVaultPermissioned.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function returned already deployed vault\n /// @param collections vault's config\n /// @param owner address of owner if vault is permissioned, otherwise address(0) and vault is permissionless\n /// @param isSoulbound if true, Vault is soulbound and its ERC20 token can only be transfered\n /// to `allowedContracts` managed by `owner`\n /// @return vault address of (newly) deployed vault\n function createVault(INftVaultPermissioned.CollectionData[] memory collections, address owner, bool isSoulbound)\n external\n returns (INftVaultPermissioned vault);\n}\n" + }, + "contracts/VaultPermissioned/INftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVaultPermissioned {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted when adding a wallet to deposit/withdraw allow list\n /// @param wallet address that is allowed to deposit/withdraw\n event AllowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when removing a wallet from deposit/withdraw allow list\n /// @param wallet address that is disallowed to deposit/withdraw\n event DisallowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when `contractAddress` is allowed to receive Vault ERC20 token\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n event AllowedContract(address contractAddress);\n\n /// @notice Emitted when `contractAddress` address that is disallowed to receive Vault ERC20 token\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n event DisallowedContract(address contractAddress);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n /// @dev User is not allowed to deposit or withdraw\n error NotAllowed();\n /// @dev Owner is required to manage `allowedContracts` when Vault is deployed as soulbound\n error OwnerRequiredForSoulbound();\n /// @dev Transfer of Vault ERC20 token to disallowed receiver\n error SoulboundTransferDisallowed();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n function UNIV2_MINIMUM_LIQUIDITY() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to `allowedContracts`\n /// @return true if Vault is soulbound, false otherwise\n function isSoulbound() external view returns (bool);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns true if wallet is allowed to deposit/withdraw. Only applicable to permissioned vault.\n /// @dev Call `isPermissioned()` first to make sure vault is permissioned. Otherwise this function is irrelevant.\n /// @param wallet address that is checked\n /// @return true if wallet is allowed, false otherwise. For permissionless vault always returns false.\n function allowedWallets(address wallet) external view returns (bool);\n\n /// @notice Is vault permissioned\n /// @return true if vault has an owner and is permissioned. False otherwise.\n function isPermissioned() external view returns (bool);\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n\n /// @notice Allow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is allowed to deposit/withdraw\n function allowDepositWithdraw(address wallet) external;\n\n /// @notice Disallow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is disallowed to deposit/withdraw\n function disallowDepositWithdraw(address wallet) external;\n\n /// @notice Allow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n function allowVaultTokenTransfersTo(address contractAddress) external;\n\n /// @notice Disallow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n function disallowVaultTokenTransfersTo(address contractAddress) external;\n}\n" + }, + "contracts/VaultPermissioned/NftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Counters.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactoryPermissioned.sol\";\nimport \"./NftVaultPermissioned.sol\";\n\ncontract NftVaultFactoryPermissioned is INftVaultFactoryPermissioned {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n EnumerableSet.AddressSet private permissionedVaults;\n\n mapping(bytes32 => INftVaultPermissioned) public vaultHashMap;\n mapping(INftVaultPermissioned => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultAt(uint256 _i) external view returns (address) {\n return vaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllPermissionedVaults() external view returns (address[] memory) {\n return permissionedVaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultAt(uint256 _i) external view returns (address) {\n return permissionedVaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultLength() external view returns (uint256) {\n return permissionedVaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isPermissionedVault(address _vault) external view returns (bool) {\n return permissionedVaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVault(INftVaultPermissioned.CollectionData[] memory _collections)\n public\n view\n returns (INftVaultPermissioned vault)\n {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function exists(INftVaultPermissioned.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function createVault(INftVaultPermissioned.CollectionData[] memory _collections, address _owner, bool _isSoulbound)\n external\n returns (INftVaultPermissioned vault)\n {\n bool isPermissionless = _owner == address(0) && !_isSoulbound;\n\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVaultPermissioned(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists and is permissionless, revert\n if (address(vault) != address(0) && isPermissionless) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n if (isPermissionless) {\n // permissionless\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n } else {\n // permissioned\n vaultId = permissionedVaults.length();\n name = string.concat(\"Magic Permissioned Vault \", vaultId.toString());\n symbol = string.concat(\"MagicPermissionedVault\", vaultId.toString());\n }\n\n vault = INftVaultPermissioned(address(new NftVaultPermissioned(name, symbol, _owner, _isSoulbound)));\n vault.init(_collections);\n\n if (isPermissionless) {\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n } else {\n permissionedVaults.add(address(vault));\n }\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender, _owner);\n }\n}\n" + }, + "contracts/VaultPermissioned/NftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVaultPermissioned.sol\";\nimport \"./INftVaultFactoryPermissioned.sol\";\n\ncontract NftVaultPermissioned is INftVaultPermissioned, ERC20, ERC721Holder, ERC1155Holder, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n uint256 public constant UNIV2_MINIMUM_LIQUIDITY = 1e3;\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to\n /// EOA, vault itself and `allowedContracts`\n bool public immutable isSoulbound;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @notice deposit/withdraw allow list. Maps wallet address to bool, if true, wallet is allowed to deposit/withdraw\n mapping(address => bool) public allowedWallets;\n\n /// @notice Vault ERC20 receive allow list. Maps contract address to bool, if true, contract is allowed to receive\n /// Vault ERC20 token.\n mapping(address => bool) public allowedContracts;\n\n modifier onlyAllowed() {\n if (isPermissioned() && !allowedWallets[msg.sender]) {\n revert NotAllowed();\n }\n\n _;\n }\n\n /// @dev if _owner == address(0), NftVault is deployed as permissionless\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n /// @param _owner should be address(0) for permissionless vaults. Otherwise, address of the owner.\n /// @param _isSoulbound if true, Vault is soulbound, false otherwise\n constructor(string memory _name, string memory _symbol, address _owner, bool _isSoulbound) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n\n isSoulbound = _isSoulbound;\n _transferOwnership(_owner);\n\n if (_isSoulbound && _owner == address(0)) revert OwnerRequiredForSoulbound();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n allowedCollections.set(collection.addr, nftType);\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n\n emit CollectionAllowed(collection);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isPermissioned() public view returns (bool) {\n return owner() != address(0);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVaultPermissioned\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow being UNIV2_MINIMUM_LIQUIDITY shy\n if (totalSupply() == amountBurned && balanceOf(address(this)) == amountBurned - UNIV2_MINIMUM_LIQUIDITY) {\n amountBurned -= UNIV2_MINIMUM_LIQUIDITY;\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n\n function _beforeTokenTransfer(address, /*from*/ address to, uint256 /*amount*/ ) internal view override {\n /// @dev Soulbound Vault ERC20 token can be transfered to any EOA, this Vault or `allowedContracts`\n if (isSoulbound && to != address(this) && Address.isContract(to) && !allowedContracts[to]) {\n revert SoulboundTransferDisallowed();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = true;\n\n emit AllowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = false;\n\n emit DisallowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = true;\n\n emit AllowedContract(_contractAddress);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = false;\n\n emit DisallowedContract(_contractAddress);\n }\n}\n" + }, + "forge-std/Base.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {StdStorage} from \"./StdStorage.sol\";\nimport {Vm, VmSafe} from \"./Vm.sol\";\n\nabstract contract CommonBase {\n // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.\n address internal constant VM_ADDRESS = address(uint160(uint256(keccak256(\"hevm cheat code\"))));\n // console.sol and console2.sol work by executing a staticcall to this address.\n address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;\n // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.\n address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256(\"foundry default caller\"))));\n // Address of the test contract, deployed by the DEFAULT_SENDER.\n address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;\n // Deterministic deployment address of the Multicall3 contract.\n address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;\n // The order of the secp256k1 curve.\n uint256 internal constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n\n uint256 internal constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n Vm internal constant vm = Vm(VM_ADDRESS);\n StdStorage internal stdstore;\n}\n\nabstract contract TestBase is CommonBase {}\n\nabstract contract ScriptBase is CommonBase {\n VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);\n}\n" + }, + "forge-std/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\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(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", 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, int256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,int256)\", 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" + }, + "forge-std/console2.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {console as console2} from \"./console.sol\";\n" + }, + "forge-std/interfaces/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\ninterface IERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n" + }, + "forge-std/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\n/// @dev Interface of the ERC20 standard as defined in the EIP.\n/// @dev This includes the optional name, symbol, and decimals metadata.\ninterface IERC20 {\n /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`\n /// is the new allowance.\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /// @notice Returns the amount of tokens in existence.\n function totalSupply() external view returns (uint256);\n\n /// @notice Returns the amount of tokens owned by `account`.\n function balanceOf(address account) external view returns (uint256);\n\n /// @notice Moves `amount` tokens from the caller's account to `to`.\n function transfer(address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the remaining number of tokens that `spender` is allowed\n /// to spend on behalf of `owner`\n function allowance(address owner, address spender) external view returns (uint256);\n\n /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.\n /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n function approve(address spender, uint256 amount) external returns (bool);\n\n /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.\n /// `amount` is then deducted from the caller's allowance.\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the name of the token.\n function name() external view returns (string memory);\n\n /// @notice Returns the symbol of the token.\n function symbol() external view returns (string memory);\n\n /// @notice Returns the decimals places of the token.\n function decimals() external view returns (uint8);\n}\n" + }, + "forge-std/interfaces/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\nimport \"./IERC165.sol\";\n\n/// @title ERC-721 Non-Fungible Token Standard\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.\ninterface IERC721 is IERC165 {\n /// @dev This emits when ownership of any NFT changes by any mechanism.\n /// This event emits when NFTs are created (`from` == 0) and destroyed\n /// (`to` == 0). Exception: during contract creation, any number of NFTs\n /// may be created and assigned without emitting Transfer. At the time of\n /// any transfer, the approved address for that NFT (if any) is reset to none.\n event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);\n\n /// @dev This emits when the approved address for an NFT is changed or\n /// reaffirmed. The zero address indicates there is no approved address.\n /// When a Transfer event emits, this also indicates that the approved\n /// address for that NFT (if any) is reset to none.\n event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);\n\n /// @dev This emits when an operator is enabled or disabled for an owner.\n /// The operator can manage all NFTs of the owner.\n event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n /// @notice Count all NFTs assigned to an owner\n /// @dev NFTs assigned to the zero address are considered invalid, and this\n /// function throws for queries about the zero address.\n /// @param _owner An address for whom to query the balance\n /// @return The number of NFTs owned by `_owner`, possibly zero\n function balanceOf(address _owner) external view returns (uint256);\n\n /// @notice Find the owner of an NFT\n /// @dev NFTs assigned to zero address are considered invalid, and queries\n /// about them do throw.\n /// @param _tokenId The identifier for an NFT\n /// @return The address of the owner of the NFT\n function ownerOf(uint256 _tokenId) external view returns (address);\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT. When transfer is complete, this function\n /// checks if `_to` is a smart contract (code size > 0). If so, it calls\n /// `onERC721Received` on `_to` and throws if the return value is not\n /// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n /// @param data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev This works identically to the other function with an extra data parameter,\n /// except this function just sets data to \"\".\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n /// THEY MAY BE PERMANENTLY LOST\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function transferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Change or reaffirm the approved address for an NFT\n /// @dev The zero address indicates there is no approved address.\n /// Throws unless `msg.sender` is the current NFT owner, or an authorized\n /// operator of the current owner.\n /// @param _approved The new approved NFT controller\n /// @param _tokenId The NFT to approve\n function approve(address _approved, uint256 _tokenId) external payable;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage\n /// all of `msg.sender`'s assets\n /// @dev Emits the ApprovalForAll event. The contract MUST allow\n /// multiple operators per owner.\n /// @param _operator Address to add to the set of authorized operators\n /// @param _approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address _operator, bool _approved) external;\n\n /// @notice Get the approved address for a single NFT\n /// @dev Throws if `_tokenId` is not a valid NFT.\n /// @param _tokenId The NFT to find the approved address for\n /// @return The approved address for this NFT, or the zero address if there is none\n function getApproved(uint256 _tokenId) external view returns (address);\n\n /// @notice Query if an address is an authorized operator for another address\n /// @param _owner The address that owns the NFTs\n /// @param _operator The address that acts on behalf of the owner\n /// @return True if `_operator` is an approved operator for `_owner`, false otherwise\n function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n}\n\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\ninterface IERC721TokenReceiver {\n /// @notice Handle the receipt of an NFT\n /// @dev The ERC721 smart contract calls this function on the recipient\n /// after a `transfer`. This function MAY throw to revert and reject the\n /// transfer. Return of other than the magic value MUST result in the\n /// transaction being reverted.\n /// Note: the contract address is always the message sender.\n /// @param _operator The address which called `safeTransferFrom` function\n /// @param _from The address which previously owned the token\n /// @param _tokenId The NFT identifier which is being transferred\n /// @param _data Additional data with no specified format\n /// @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n /// unless throwing\n function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)\n external\n returns (bytes4);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.\ninterface IERC721Metadata is IERC721 {\n /// @notice A descriptive name for a collection of NFTs in this contract\n function name() external view returns (string memory _name);\n\n /// @notice An abbreviated name for NFTs in this contract\n function symbol() external view returns (string memory _symbol);\n\n /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\n /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC\n /// 3986. The URI may point to a JSON file that conforms to the \"ERC721\n /// Metadata JSON Schema\".\n function tokenURI(uint256 _tokenId) external view returns (string memory);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x780e9d63.\ninterface IERC721Enumerable is IERC721 {\n /// @notice Count NFTs tracked by this contract\n /// @return A count of valid NFTs tracked by this contract, where each one of\n /// them has an assigned and queryable owner not equal to the zero address\n function totalSupply() external view returns (uint256);\n\n /// @notice Enumerate valid NFTs\n /// @dev Throws if `_index` >= `totalSupply()`.\n /// @param _index A counter less than `totalSupply()`\n /// @return The token identifier for the `_index`th NFT,\n /// (sort order not specified)\n function tokenByIndex(uint256 _index) external view returns (uint256);\n\n /// @notice Enumerate NFTs assigned to an owner\n /// @dev Throws if `_index` >= `balanceOf(_owner)` or if\n /// `_owner` is the zero address, representing invalid NFTs.\n /// @param _owner An address where we are interested in NFTs owned by them\n /// @param _index A counter less than `balanceOf(_owner)`\n /// @return The token identifier for the `_index`th NFT assigned to `_owner`,\n /// (sort order not specified)\n function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);\n}\n" + }, + "forge-std/interfaces/IMulticall3.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\ninterface IMulticall3 {\n struct Call {\n address target;\n bytes callData;\n }\n\n struct Call3 {\n address target;\n bool allowFailure;\n bytes callData;\n }\n\n struct Call3Value {\n address target;\n bool allowFailure;\n uint256 value;\n bytes callData;\n }\n\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes[] memory returnData);\n\n function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);\n\n function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);\n\n function blockAndAggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n\n function getBasefee() external view returns (uint256 basefee);\n\n function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);\n\n function getBlockNumber() external view returns (uint256 blockNumber);\n\n function getChainId() external view returns (uint256 chainid);\n\n function getCurrentBlockCoinbase() external view returns (address coinbase);\n\n function getCurrentBlockDifficulty() external view returns (uint256 difficulty);\n\n function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);\n\n function getCurrentBlockTimestamp() external view returns (uint256 timestamp);\n\n function getEthBalance(address addr) external view returns (uint256 balance);\n\n function getLastBlockHash() external view returns (bytes32 blockHash);\n\n function tryAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (Result[] memory returnData);\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n}\n" + }, + "forge-std/mocks/MockERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC20} from \"../interfaces/IERC20.sol\";\n\n/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol\ncontract MockERC20 is IERC20 {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n uint8 internal _decimals;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function decimals() external view override returns (uint8) {\n return _decimals;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal _totalSupply;\n\n mapping(address => uint256) internal _balanceOf;\n\n mapping(address => mapping(address => uint256)) internal _allowance;\n\n function totalSupply() external view override returns (uint256) {\n return _totalSupply;\n }\n\n function balanceOf(address owner) external view override returns (uint256) {\n return _balanceOf[owner];\n }\n\n function allowance(address owner, address spender) external view override returns (uint256) {\n return _allowance[owner][spender];\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal INITIAL_CHAIN_ID;\n\n bytes32 internal INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_, uint8 decimals_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n _decimals = decimals_;\n\n INITIAL_CHAIN_ID = _pureChainId();\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount);\n\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n public\n virtual\n {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n _allowance[recoveredAddress][spender] = value;\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(_name)),\n keccak256(\"1\"),\n _pureChainId(),\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n _totalSupply = _add(_totalSupply, amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _totalSupply = _sub(_totalSupply, amount);\n\n emit Transfer(from, address(0), amount);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MATH LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"ERC20: addition overflow\");\n return c;\n }\n\n function _sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(a >= b, \"ERC20: subtraction underflow\");\n return a - b;\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n" + }, + "forge-std/mocks/MockERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC721Metadata, IERC721TokenReceiver} from \"../interfaces/IERC721.sol\";\n\n/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol\ncontract MockERC721 is IERC721Metadata {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE/LOGIC\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function tokenURI(uint256 id) public view virtual override returns (string memory) {}\n\n /*//////////////////////////////////////////////////////////////\n ERC721 BALANCE/OWNER STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _ownerOf;\n\n mapping(address => uint256) internal _balanceOf;\n\n function ownerOf(uint256 id) public view virtual override returns (address owner) {\n require((owner = _ownerOf[id]) != address(0), \"NOT_MINTED\");\n }\n\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ZERO_ADDRESS\");\n\n return _balanceOf[owner];\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 APPROVAL STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _getApproved;\n\n mapping(address => mapping(address => bool)) internal _isApprovedForAll;\n\n function getApproved(uint256 id) public view virtual override returns (address) {\n return _getApproved[id];\n }\n\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _isApprovedForAll[owner][operator];\n }\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 id) public payable virtual override {\n address owner = _ownerOf[id];\n\n require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], \"NOT_AUTHORIZED\");\n\n _getApproved[id] = spender;\n\n emit Approval(owner, spender, id);\n }\n\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _isApprovedForAll[msg.sender][operator] = approved;\n\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function transferFrom(address from, address to, uint256 id) public payable virtual override {\n require(from == _ownerOf[id], \"WRONG_FROM\");\n\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(\n msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id],\n \"NOT_AUTHORIZED\"\n );\n\n // Underflow of the sender's balance is impossible because we check for\n // ownership above and the recipient's balance can't realistically overflow.\n _balanceOf[from]--;\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n delete _getApproved[id];\n\n emit Transfer(from, to, id);\n }\n\n function safeTransferFrom(address from, address to, uint256 id) public payable virtual override {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function safeTransferFrom(address from, address to, uint256 id, bytes memory data)\n public\n payable\n virtual\n override\n {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC165 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721\n || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 id) internal virtual {\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(_ownerOf[id] == address(0), \"ALREADY_MINTED\");\n\n // Counter overflow is incredibly unrealistic.\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n emit Transfer(address(0), to, id);\n }\n\n function _burn(uint256 id) internal virtual {\n address owner = _ownerOf[id];\n\n require(owner != address(0), \"NOT_MINTED\");\n\n _balanceOf[owner]--;\n\n delete _ownerOf[id];\n\n delete _getApproved[id];\n\n emit Transfer(owner, address(0), id);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MINT LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _safeMint(address to, uint256 id) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function _safeMint(address to, uint256 id, bytes memory data) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n function _isContract(address _addr) private view returns (bool) {\n uint256 codeLength;\n\n // Assembly required for versions < 0.8.0 to check extcodesize.\n assembly {\n codeLength := extcodesize(_addr)\n }\n\n return codeLength > 0;\n }\n}\n" + }, + "forge-std/safeconsole.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\n/// @author philogy \n/// @dev Code generated automatically by script.\nlibrary safeconsole {\n uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;\n\n // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)\n // for the view-to-pure log trick.\n function _sendLogPayload(uint256 offset, uint256 size) private pure {\n function(uint256, uint256) internal view fnIn = _sendLogPayloadView;\n function(uint256, uint256) internal pure pureSendLogPayload;\n /// @solidity memory-safe-assembly\n assembly {\n pureSendLogPayload := fnIn\n }\n pureSendLogPayload(offset, size);\n }\n\n function _sendLogPayloadView(uint256 offset, uint256 size) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))\n }\n }\n\n function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {\n function(uint256, uint256, uint256) internal view fnIn = _memcopyView;\n function(uint256, uint256, uint256) internal pure pureMemcopy;\n /// @solidity memory-safe-assembly\n assembly {\n pureMemcopy := fnIn\n }\n pureMemcopy(fromOffset, toOffset, length);\n }\n\n function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))\n }\n }\n\n function logMemory(uint256 offset, uint256 length) internal pure {\n if (offset >= 0x60) {\n // Sufficient memory before slice to prepare call header.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(sub(offset, 0x60))\n m1 := mload(sub(offset, 0x40))\n m2 := mload(sub(offset, 0x20))\n // Selector of `log(bytes)`.\n mstore(sub(offset, 0x60), 0x0be77f56)\n mstore(sub(offset, 0x40), 0x20)\n mstore(sub(offset, 0x20), length)\n }\n _sendLogPayload(offset - 0x44, length + 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(sub(offset, 0x60), m0)\n mstore(sub(offset, 0x40), m1)\n mstore(sub(offset, 0x20), m2)\n }\n } else {\n // Insufficient space, so copy slice forward, add header and reverse.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n uint256 endOffset = offset + length;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(add(endOffset, 0x00))\n m1 := mload(add(endOffset, 0x20))\n m2 := mload(add(endOffset, 0x40))\n }\n _memcopy(offset, offset + 0x60, length);\n /// @solidity memory-safe-assembly\n assembly {\n // Selector of `log(bytes)`.\n mstore(add(offset, 0x00), 0x0be77f56)\n mstore(add(offset, 0x20), 0x20)\n mstore(add(offset, 0x40), length)\n }\n _sendLogPayload(offset + 0x1c, length + 0x44);\n _memcopy(offset + 0x60, offset, length);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(endOffset, 0x00), m0)\n mstore(add(endOffset, 0x20), m1)\n mstore(add(endOffset, 0x40), m2)\n }\n }\n }\n\n function log(address p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(address)`.\n mstore(0x00, 0x2c2ecbc2)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bool p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(bool)`.\n mstore(0x00, 0x32458eed)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(uint256 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(uint256)`.\n mstore(0x00, 0xf82c50f1)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bytes32 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(string)`.\n mstore(0x00, 0x41304fac)\n mstore(0x20, 0x20)\n writeString(0x40, p0)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,address)`.\n mstore(0x00, 0xdaf0d4aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,bool)`.\n mstore(0x00, 0x75b605d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,uint256)`.\n mstore(0x00, 0x8309e8a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,string)`.\n mstore(0x00, 0x759f86bb)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,address)`.\n mstore(0x00, 0x853c4849)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,bool)`.\n mstore(0x00, 0x2a110e83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,uint256)`.\n mstore(0x00, 0x399174d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,string)`.\n mstore(0x00, 0x8feac525)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,address)`.\n mstore(0x00, 0x69276c86)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,bool)`.\n mstore(0x00, 0x1c9d7eb3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,uint256)`.\n mstore(0x00, 0xf666715a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,string)`.\n mstore(0x00, 0x643fd0df)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,address)`.\n mstore(0x00, 0x319af333)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,bool)`.\n mstore(0x00, 0xc3b55635)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,uint256)`.\n mstore(0x00, 0xb60e72cc)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,string)`.\n mstore(0x00, 0x4b5c4277)\n mstore(0x20, 0x40)\n mstore(0x40, 0x80)\n writeString(0x60, p0)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,address)`.\n mstore(0x00, 0x018c84c2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,bool)`.\n mstore(0x00, 0xf2a66286)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,uint256)`.\n mstore(0x00, 0x17fe6185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,address,string)`.\n mstore(0x00, 0x007150be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,address)`.\n mstore(0x00, 0xf11699ed)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,bool)`.\n mstore(0x00, 0xeb830c92)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,uint256)`.\n mstore(0x00, 0x9c4f99fb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,bool,string)`.\n mstore(0x00, 0x212255cc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,address)`.\n mstore(0x00, 0x7bc0d848)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,bool)`.\n mstore(0x00, 0x678209a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,uint256)`.\n mstore(0x00, 0xb69bcaf6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,uint256,string)`.\n mstore(0x00, 0xa1f2e8aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,address)`.\n mstore(0x00, 0xf08744e8)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,bool)`.\n mstore(0x00, 0xcf020fb1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,uint256)`.\n mstore(0x00, 0x67dd6ff1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(address,string,string)`.\n mstore(0x00, 0xfb772265)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,address)`.\n mstore(0x00, 0xd2763667)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,bool)`.\n mstore(0x00, 0x18c9c746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,uint256)`.\n mstore(0x00, 0x5f7b9afb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,address,string)`.\n mstore(0x00, 0xde9a9270)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,address)`.\n mstore(0x00, 0x1078f68d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,bool)`.\n mstore(0x00, 0x50709698)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,uint256)`.\n mstore(0x00, 0x12f21602)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,bool,string)`.\n mstore(0x00, 0x2555fa46)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,address)`.\n mstore(0x00, 0x088ef9d2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,bool)`.\n mstore(0x00, 0xe8defba9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,uint256)`.\n mstore(0x00, 0x37103367)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,uint256,string)`.\n mstore(0x00, 0xc3fc3970)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,address)`.\n mstore(0x00, 0x9591b953)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,bool)`.\n mstore(0x00, 0xdbb4c247)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,uint256)`.\n mstore(0x00, 0x1093ee11)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(bool,string,string)`.\n mstore(0x00, 0xb076847f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,address)`.\n mstore(0x00, 0xbcfd9be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,bool)`.\n mstore(0x00, 0x9b6ec042)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,uint256)`.\n mstore(0x00, 0x5a9b5ed5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,address,string)`.\n mstore(0x00, 0x63cb41f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,address)`.\n mstore(0x00, 0x35085f7b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,bool)`.\n mstore(0x00, 0x20718650)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,uint256)`.\n mstore(0x00, 0x20098014)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,bool,string)`.\n mstore(0x00, 0x85775021)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,address)`.\n mstore(0x00, 0x5c96b331)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,bool)`.\n mstore(0x00, 0x4766da72)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,uint256)`.\n mstore(0x00, 0xd1ed7a3c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,uint256,string)`.\n mstore(0x00, 0x71d04af2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,address)`.\n mstore(0x00, 0x7afac959)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,bool)`.\n mstore(0x00, 0x4ceda75a)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,uint256)`.\n mstore(0x00, 0x37aa7d4c)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(uint256,string,string)`.\n mstore(0x00, 0xb115611f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,address)`.\n mstore(0x00, 0xfcec75e0)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,bool)`.\n mstore(0x00, 0xc91d5ed4)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,uint256)`.\n mstore(0x00, 0x0d26b925)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,address,string)`.\n mstore(0x00, 0xe0e9ad4f)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,address)`.\n mstore(0x00, 0x932bbb38)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,bool)`.\n mstore(0x00, 0x850b7ad6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,uint256)`.\n mstore(0x00, 0xc95958d6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,bool,string)`.\n mstore(0x00, 0xe298f47d)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,address)`.\n mstore(0x00, 0x1c7ec448)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,bool)`.\n mstore(0x00, 0xca7733b1)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,uint256)`.\n mstore(0x00, 0xca47c4eb)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,uint256,string)`.\n mstore(0x00, 0x5970e089)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,address)`.\n mstore(0x00, 0x95ed0195)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,bool)`.\n mstore(0x00, 0xb0e0f9b5)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,uint256)`.\n mstore(0x00, 0x5821efa1)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n // Selector of `log(string,string,string)`.\n mstore(0x00, 0x2ced7cef)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, 0xe0)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n writeString(0x100, p2)\n }\n _sendLogPayload(0x1c, 0x124);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n }\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,address)`.\n mstore(0x00, 0x665bf134)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,bool)`.\n mstore(0x00, 0x0e378994)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,uint256)`.\n mstore(0x00, 0x94250d77)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,address,string)`.\n mstore(0x00, 0xf808da20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,address)`.\n mstore(0x00, 0x9f1bc36e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,bool)`.\n mstore(0x00, 0x2cd4134a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,uint256)`.\n mstore(0x00, 0x3971e78c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,bool,string)`.\n mstore(0x00, 0xaa6540c8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,address)`.\n mstore(0x00, 0x8da6def5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,bool)`.\n mstore(0x00, 0x9b4254e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,uint256)`.\n mstore(0x00, 0xbe553481)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,uint256,string)`.\n mstore(0x00, 0xfdb4f990)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,address)`.\n mstore(0x00, 0x8f736d16)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,bool)`.\n mstore(0x00, 0x6f1a594e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,uint256)`.\n mstore(0x00, 0xef1cefe7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,address,string,string)`.\n mstore(0x00, 0x21bdaf25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,address)`.\n mstore(0x00, 0x660375dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,bool)`.\n mstore(0x00, 0xa6f50b0f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,uint256)`.\n mstore(0x00, 0xa75c59de)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,address,string)`.\n mstore(0x00, 0x2dd778e6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,address)`.\n mstore(0x00, 0xcf394485)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,bool)`.\n mstore(0x00, 0xcac43479)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,uint256)`.\n mstore(0x00, 0x8c4e5de6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,bool,string)`.\n mstore(0x00, 0xdfc4a2e8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,address)`.\n mstore(0x00, 0xccf790a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,bool)`.\n mstore(0x00, 0xc4643e20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,uint256)`.\n mstore(0x00, 0x386ff5f4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,uint256,string)`.\n mstore(0x00, 0x0aa6cfad)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,address)`.\n mstore(0x00, 0x19fd4956)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,bool)`.\n mstore(0x00, 0x50ad461d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,uint256)`.\n mstore(0x00, 0x80e6a20b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,bool,string,string)`.\n mstore(0x00, 0x475c5c33)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,address)`.\n mstore(0x00, 0x478d1c62)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,bool)`.\n mstore(0x00, 0xa1bcc9b3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,uint256)`.\n mstore(0x00, 0x100f650e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,address,string)`.\n mstore(0x00, 0x1da986ea)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,address)`.\n mstore(0x00, 0xa31bfdcc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,bool)`.\n mstore(0x00, 0x3bf5e537)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,uint256)`.\n mstore(0x00, 0x22f6b999)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,bool,string)`.\n mstore(0x00, 0xc5ad85f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,address)`.\n mstore(0x00, 0x20e3984d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,bool)`.\n mstore(0x00, 0x66f1bc67)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,uint256)`.\n mstore(0x00, 0x34f0e636)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,uint256,string)`.\n mstore(0x00, 0x4a28c017)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,address)`.\n mstore(0x00, 0x5c430d47)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,bool)`.\n mstore(0x00, 0xcf18105c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,uint256)`.\n mstore(0x00, 0xbf01f891)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,uint256,string,string)`.\n mstore(0x00, 0x88a8c406)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,address)`.\n mstore(0x00, 0x0d36fa20)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,bool)`.\n mstore(0x00, 0x0df12b76)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,uint256)`.\n mstore(0x00, 0x457fe3cf)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,address,string)`.\n mstore(0x00, 0xf7e36245)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,address)`.\n mstore(0x00, 0x205871c2)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,bool)`.\n mstore(0x00, 0x5f1d5c9f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,uint256)`.\n mstore(0x00, 0x515e38b6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,bool,string)`.\n mstore(0x00, 0xbc0b61fe)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,address)`.\n mstore(0x00, 0x63183678)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,bool)`.\n mstore(0x00, 0x0ef7e050)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,uint256)`.\n mstore(0x00, 0x1dc8e1b8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,uint256,string)`.\n mstore(0x00, 0x448830a8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,address)`.\n mstore(0x00, 0xa04e2f87)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,bool)`.\n mstore(0x00, 0x35a5071f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,uint256)`.\n mstore(0x00, 0x159f8927)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(address,string,string,string)`.\n mstore(0x00, 0x5d02c50b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,address)`.\n mstore(0x00, 0x1d14d001)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,bool)`.\n mstore(0x00, 0x46600be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,uint256)`.\n mstore(0x00, 0x0c66d1be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,address,string)`.\n mstore(0x00, 0xd812a167)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,address)`.\n mstore(0x00, 0x1c41a336)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,bool)`.\n mstore(0x00, 0x6a9c478b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,uint256)`.\n mstore(0x00, 0x07831502)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,bool,string)`.\n mstore(0x00, 0x4a66cb34)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,address)`.\n mstore(0x00, 0x136b05dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,bool)`.\n mstore(0x00, 0xd6019f1c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,uint256)`.\n mstore(0x00, 0x7bf181a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,uint256,string)`.\n mstore(0x00, 0x51f09ff8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,address)`.\n mstore(0x00, 0x6f7c603e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,bool)`.\n mstore(0x00, 0xe2bfd60b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,uint256)`.\n mstore(0x00, 0xc21f64c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,address,string,string)`.\n mstore(0x00, 0xa73c1db6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,address)`.\n mstore(0x00, 0xf4880ea4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,bool)`.\n mstore(0x00, 0xc0a302d8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,uint256)`.\n mstore(0x00, 0x4c123d57)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,address,string)`.\n mstore(0x00, 0xa0a47963)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,address)`.\n mstore(0x00, 0x8c329b1a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,bool)`.\n mstore(0x00, 0x3b2a5ce0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,uint256)`.\n mstore(0x00, 0x6d7045c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,bool,string)`.\n mstore(0x00, 0x2ae408d4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,address)`.\n mstore(0x00, 0x54a7a9a0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,bool)`.\n mstore(0x00, 0x619e4d0e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,uint256)`.\n mstore(0x00, 0x0bb00eab)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,uint256,string)`.\n mstore(0x00, 0x7dd4d0e0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,address)`.\n mstore(0x00, 0xf9ad2b89)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,bool)`.\n mstore(0x00, 0xb857163a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,uint256)`.\n mstore(0x00, 0xe3a9ca2f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,bool,string,string)`.\n mstore(0x00, 0x6d1e8751)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,address)`.\n mstore(0x00, 0x26f560a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,bool)`.\n mstore(0x00, 0xb4c314ff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,uint256)`.\n mstore(0x00, 0x1537dc87)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,address,string)`.\n mstore(0x00, 0x1bb3b09a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,address)`.\n mstore(0x00, 0x9acd3616)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,bool)`.\n mstore(0x00, 0xceb5f4d7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,uint256)`.\n mstore(0x00, 0x7f9bbca2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,bool,string)`.\n mstore(0x00, 0x9143dbb1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,address)`.\n mstore(0x00, 0x00dd87b9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,bool)`.\n mstore(0x00, 0xbe984353)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,uint256)`.\n mstore(0x00, 0x374bb4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,uint256,string)`.\n mstore(0x00, 0x8e69fb5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,address)`.\n mstore(0x00, 0xfedd1fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,bool)`.\n mstore(0x00, 0xe5e70b2b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,uint256)`.\n mstore(0x00, 0x6a1199e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,uint256,string,string)`.\n mstore(0x00, 0xf5bc2249)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,address)`.\n mstore(0x00, 0x2b2b18dc)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,bool)`.\n mstore(0x00, 0x6dd434ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,uint256)`.\n mstore(0x00, 0xa5cada94)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,address,string)`.\n mstore(0x00, 0x12d6c788)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,address)`.\n mstore(0x00, 0x538e06ab)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,bool)`.\n mstore(0x00, 0xdc5e935b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,uint256)`.\n mstore(0x00, 0x1606a393)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,bool,string)`.\n mstore(0x00, 0x483d0416)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,address)`.\n mstore(0x00, 0x1596a1ce)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,bool)`.\n mstore(0x00, 0x6b0e5d53)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,uint256)`.\n mstore(0x00, 0x28863fcb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,uint256,string)`.\n mstore(0x00, 0x1ad96de6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,address)`.\n mstore(0x00, 0x97d394d8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,bool)`.\n mstore(0x00, 0x1e4b87e5)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,uint256)`.\n mstore(0x00, 0x7be0c3eb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(bool,string,string,string)`.\n mstore(0x00, 0x1762e32a)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,address)`.\n mstore(0x00, 0x2488b414)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,bool)`.\n mstore(0x00, 0x091ffaf5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,uint256)`.\n mstore(0x00, 0x736efbb6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,address,string)`.\n mstore(0x00, 0x031c6f73)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,address)`.\n mstore(0x00, 0xef72c513)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,bool)`.\n mstore(0x00, 0xe351140f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,uint256)`.\n mstore(0x00, 0x5abd992a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,bool,string)`.\n mstore(0x00, 0x90fb06aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,address)`.\n mstore(0x00, 0x15c127b5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,bool)`.\n mstore(0x00, 0x5f743a7c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,uint256)`.\n mstore(0x00, 0x0c9cd9c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,uint256,string)`.\n mstore(0x00, 0xddb06521)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,address)`.\n mstore(0x00, 0x9cba8fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,bool)`.\n mstore(0x00, 0xcc32ab07)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,uint256)`.\n mstore(0x00, 0x46826b5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,address,string,string)`.\n mstore(0x00, 0x3e128ca3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,address)`.\n mstore(0x00, 0xa1ef4cbb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,bool)`.\n mstore(0x00, 0x454d54a5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,uint256)`.\n mstore(0x00, 0x078287f5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,address,string)`.\n mstore(0x00, 0xade052c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,address)`.\n mstore(0x00, 0x69640b59)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,bool)`.\n mstore(0x00, 0xb6f577a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,uint256)`.\n mstore(0x00, 0x7464ce23)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,bool,string)`.\n mstore(0x00, 0xdddb9561)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,address)`.\n mstore(0x00, 0x88cb6041)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,bool)`.\n mstore(0x00, 0x91a02e2a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,uint256)`.\n mstore(0x00, 0xc6acc7a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,uint256,string)`.\n mstore(0x00, 0xde03e774)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,address)`.\n mstore(0x00, 0xef529018)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,bool)`.\n mstore(0x00, 0xeb928d7f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,uint256)`.\n mstore(0x00, 0x2c1d0746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,bool,string,string)`.\n mstore(0x00, 0x68c8b8bd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,address)`.\n mstore(0x00, 0x56a5d1b1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,bool)`.\n mstore(0x00, 0x15cac476)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,uint256)`.\n mstore(0x00, 0x88f6e4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,address,string)`.\n mstore(0x00, 0x6cde40b8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,address)`.\n mstore(0x00, 0x9a816a83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,bool)`.\n mstore(0x00, 0xab085ae6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,uint256)`.\n mstore(0x00, 0xeb7f6fd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,bool,string)`.\n mstore(0x00, 0xa5b4fc99)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,address)`.\n mstore(0x00, 0xfa8185af)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,bool)`.\n mstore(0x00, 0xc598d185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,uint256)`.\n mstore(0x00, 0x193fb800)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,uint256,string)`.\n mstore(0x00, 0x59cfcbe3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,address)`.\n mstore(0x00, 0x42d21db7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,bool)`.\n mstore(0x00, 0x7af6ab25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,uint256)`.\n mstore(0x00, 0x5da297eb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,uint256,string,string)`.\n mstore(0x00, 0x27d8afd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,address)`.\n mstore(0x00, 0x6168ed61)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,bool)`.\n mstore(0x00, 0x90c30a56)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,uint256)`.\n mstore(0x00, 0xe8d3018d)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,address,string)`.\n mstore(0x00, 0x9c3adfa1)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,address)`.\n mstore(0x00, 0xae2ec581)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,bool)`.\n mstore(0x00, 0xba535d9c)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,uint256)`.\n mstore(0x00, 0xcf009880)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,bool,string)`.\n mstore(0x00, 0xd2d423cd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,address)`.\n mstore(0x00, 0x3b2279b4)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,bool)`.\n mstore(0x00, 0x691a8f74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,uint256)`.\n mstore(0x00, 0x82c25b74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,uint256,string)`.\n mstore(0x00, 0xb7b914ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,address)`.\n mstore(0x00, 0xd583c602)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,bool)`.\n mstore(0x00, 0xb3a6b6bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,uint256)`.\n mstore(0x00, 0xb028c9bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(uint256,string,string,string)`.\n mstore(0x00, 0x21ad0683)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,address)`.\n mstore(0x00, 0xed8f28f6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,bool)`.\n mstore(0x00, 0xb59dbd60)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,uint256)`.\n mstore(0x00, 0x8ef3f399)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,address,string)`.\n mstore(0x00, 0x800a1c67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,address)`.\n mstore(0x00, 0x223603bd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,bool)`.\n mstore(0x00, 0x79884c2b)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,uint256)`.\n mstore(0x00, 0x3e9f866a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,bool,string)`.\n mstore(0x00, 0x0454c079)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,address)`.\n mstore(0x00, 0x63fb8bc5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,bool)`.\n mstore(0x00, 0xfc4845f0)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,uint256)`.\n mstore(0x00, 0xf8f51b1e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,uint256,string)`.\n mstore(0x00, 0x5a477632)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,address)`.\n mstore(0x00, 0xaabc9a31)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,bool)`.\n mstore(0x00, 0x5f15d28c)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,uint256)`.\n mstore(0x00, 0x91d1112e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,address,string,string)`.\n mstore(0x00, 0x245986f2)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,address)`.\n mstore(0x00, 0x33e9dd1d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,bool)`.\n mstore(0x00, 0x958c28c6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,uint256)`.\n mstore(0x00, 0x5d08bb05)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,address,string)`.\n mstore(0x00, 0x2d8e33a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,address)`.\n mstore(0x00, 0x7190a529)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,bool)`.\n mstore(0x00, 0x895af8c5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,uint256)`.\n mstore(0x00, 0x8e3f78a9)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,bool,string)`.\n mstore(0x00, 0x9d22d5dd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,address)`.\n mstore(0x00, 0x935e09bf)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,bool)`.\n mstore(0x00, 0x8af7cf8a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,uint256)`.\n mstore(0x00, 0x64b5bb67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,uint256,string)`.\n mstore(0x00, 0x742d6ee7)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,address)`.\n mstore(0x00, 0xe0625b29)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,bool)`.\n mstore(0x00, 0x3f8a701d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,uint256)`.\n mstore(0x00, 0x24f91465)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,bool,string,string)`.\n mstore(0x00, 0xa826caeb)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,address)`.\n mstore(0x00, 0x5ea2b7ae)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,bool)`.\n mstore(0x00, 0x82112a42)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,uint256)`.\n mstore(0x00, 0x4f04fdc6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,address,string)`.\n mstore(0x00, 0x9ffb2f93)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,address)`.\n mstore(0x00, 0xe0e95b98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,bool)`.\n mstore(0x00, 0x354c36d6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,uint256)`.\n mstore(0x00, 0xe41b6f6f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,bool,string)`.\n mstore(0x00, 0xabf73a98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,address)`.\n mstore(0x00, 0xe21de278)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,bool)`.\n mstore(0x00, 0x7626db92)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,uint256)`.\n mstore(0x00, 0xa7a87853)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,uint256,string)`.\n mstore(0x00, 0x854b3496)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,address)`.\n mstore(0x00, 0x7c4632a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,bool)`.\n mstore(0x00, 0x7d24491d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,uint256)`.\n mstore(0x00, 0xc67ea9d1)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,uint256,string,string)`.\n mstore(0x00, 0x5ab84e1f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,address)`.\n mstore(0x00, 0x439c7bef)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,bool)`.\n mstore(0x00, 0x5ccd4e37)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,uint256)`.\n mstore(0x00, 0x7cc3c607)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,address,string)`.\n mstore(0x00, 0xeb1bff80)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,address)`.\n mstore(0x00, 0xc371c7db)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,bool)`.\n mstore(0x00, 0x40785869)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,uint256)`.\n mstore(0x00, 0xd6aefad2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,bool,string)`.\n mstore(0x00, 0x5e84b0ea)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,address)`.\n mstore(0x00, 0x1023f7b2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,bool)`.\n mstore(0x00, 0xc3a8a654)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,uint256)`.\n mstore(0x00, 0xf45d7d2c)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,uint256,string)`.\n mstore(0x00, 0x5d1a971a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,address)`.\n mstore(0x00, 0x6d572f44)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,bool)`.\n mstore(0x00, 0x2c1754ed)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,uint256)`.\n mstore(0x00, 0x8eafb02b)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n bytes32 m11;\n bytes32 m12;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n m11 := mload(0x160)\n m12 := mload(0x180)\n // Selector of `log(string,string,string,string)`.\n mstore(0x00, 0xde68f20a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, 0x140)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n writeString(0x160, p3)\n }\n _sendLogPayload(0x1c, 0x184);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n mstore(0x160, m11)\n mstore(0x180, m12)\n }\n }\n}\n" + }, + "forge-std/StdAssertions.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdAssertions {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n event log(string);\n event logs(bytes);\n\n event log_address(address);\n event log_bytes32(bytes32);\n event log_int(int256);\n event log_uint(uint256);\n event log_bytes(bytes);\n event log_string(string);\n\n event log_named_address(string key, address val);\n event log_named_bytes32(string key, bytes32 val);\n event log_named_decimal_int(string key, int256 val, uint256 decimals);\n event log_named_decimal_uint(string key, uint256 val, uint256 decimals);\n event log_named_int(string key, int256 val);\n event log_named_uint(string key, uint256 val);\n event log_named_bytes(string key, bytes val);\n event log_named_string(string key, string val);\n\n event log_array(uint256[] val);\n event log_array(int256[] val);\n event log_array(address[] val);\n event log_named_array(string key, uint256[] val);\n event log_named_array(string key, int256[] val);\n event log_named_array(string key, address[] val);\n\n bool private _failed;\n\n function failed() public view returns (bool) {\n if (_failed) {\n return _failed;\n } else {\n return vm.load(address(vm), bytes32(\"failed\")) != bytes32(0);\n }\n }\n\n function fail() internal virtual {\n vm.store(address(vm), bytes32(\"failed\"), bytes32(uint256(1)));\n _failed = true;\n }\n\n function assertTrue(bool data) internal pure virtual {\n vm.assertTrue(data);\n }\n\n function assertTrue(bool data, string memory err) internal pure virtual {\n vm.assertTrue(data, err);\n }\n\n function assertFalse(bool data) internal pure virtual {\n vm.assertFalse(data);\n }\n\n function assertFalse(bool data, string memory err) internal pure virtual {\n vm.assertFalse(data, err);\n }\n\n function assertEq(bool left, bool right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(int256 left, int256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(address left, address right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address left, address right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertEq(string memory left, string memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n // Legacy helper\n function assertEqUint(uint256 left, uint256 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertNotEq(bool left, bool right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(int256 left, int256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(address left, address right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address left, address right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertNotEq(string memory left, string memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertLt(uint256 left, uint256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertLt(int256 left, int256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertGt(uint256 left, uint256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertGt(int256 left, int256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertLe(uint256 left, uint256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertLe(int256 left, int256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertGe(uint256 left, uint256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertGe(int256 left, int256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n // Inherited from DSTest, not used but kept for backwards-compatibility\n function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {\n return keccak256(left) == keccak256(right);\n }\n\n function assertEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {\n assertEqCall(target, callDataA, target, callDataB, true);\n }\n\n function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)\n internal\n virtual\n {\n assertEqCall(targetA, callDataA, targetB, callDataB, true);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)\n internal\n virtual\n {\n assertEqCall(target, callDataA, target, callDataB, strictRevertData);\n }\n\n function assertEqCall(\n address targetA,\n bytes memory callDataA,\n address targetB,\n bytes memory callDataB,\n bool strictRevertData\n ) internal virtual {\n (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);\n (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);\n\n if (successA && successB) {\n assertEq(returnDataA, returnDataB, \"Call return data does not match\");\n }\n\n if (!successA && !successB && strictRevertData) {\n assertEq(returnDataA, returnDataB, \"Call revert data does not match\");\n }\n\n if (!successA && successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call revert data\", returnDataA);\n emit log_named_bytes(\" Right call return data\", returnDataB);\n revert(\"assertion failed\");\n }\n\n if (successA && !successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call return data\", returnDataA);\n emit log_named_bytes(\" Right call revert data\", returnDataB);\n revert(\"assertion failed\");\n }\n }\n}\n" + }, + "forge-std/StdChains.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n/**\n * StdChains provides information about EVM compatible chains that can be used in scripts/tests.\n * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are\n * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of\n * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the\n * alias used in this contract, which can be found as the first argument to the\n * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.\n *\n * There are two main ways to use this contract:\n * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or\n * `setChain(string memory chainAlias, Chain memory chain)`\n * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.\n *\n * The first time either of those are used, chains are initialized with the default set of RPC URLs.\n * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in\n * `defaultRpcUrls`.\n *\n * The `setChain` function is straightforward, and it simply saves off the given chain data.\n *\n * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say\n * we want to retrieve the RPC URL for `mainnet`:\n * - If you have specified data with `setChain`, it will return that.\n * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it\n * is valid (e.g. a URL is specified, or an environment variable is given and exists).\n * - If neither of the above conditions is met, the default data is returned.\n *\n * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.\n */\nabstract contract StdChains {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n bool private stdChainsInitialized;\n\n struct ChainData {\n string name;\n uint256 chainId;\n string rpcUrl;\n }\n\n struct Chain {\n // The chain name.\n string name;\n // The chain's Chain ID.\n uint256 chainId;\n // The chain's alias. (i.e. what gets specified in `foundry.toml`).\n string chainAlias;\n // A default RPC endpoint for this chain.\n // NOTE: This default RPC URL is included for convenience to facilitate quick tests and\n // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy\n // usage as you will be throttled and this is a disservice to others who need this endpoint.\n string rpcUrl;\n }\n\n // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.\n mapping(string => Chain) private chains;\n // Maps from the chain's alias to it's default RPC URL.\n mapping(string => string) private defaultRpcUrls;\n // Maps from a chain ID to it's alias.\n mapping(uint256 => string) private idToAlias;\n\n bool private fallbackToDefaultRpcUrls = true;\n\n // The RPC URL will be fetched from config or defaultRpcUrls if possible.\n function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {\n require(bytes(chainAlias).length != 0, \"StdChains getChain(string): Chain alias cannot be the empty string.\");\n\n initializeStdChains();\n chain = chains[chainAlias];\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(string): Chain with alias \\\"\", chainAlias, \"\\\" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {\n require(chainId != 0, \"StdChains getChain(uint256): Chain ID cannot be 0.\");\n initializeStdChains();\n string memory chainAlias = idToAlias[chainId];\n\n chain = chains[chainAlias];\n\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(uint256): Chain with ID \", vm.toString(chainId), \" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, ChainData memory chain) internal virtual {\n require(\n bytes(chainAlias).length != 0,\n \"StdChains setChain(string,ChainData): Chain alias cannot be the empty string.\"\n );\n\n require(chain.chainId != 0, \"StdChains setChain(string,ChainData): Chain ID cannot be 0.\");\n\n initializeStdChains();\n string memory foundAlias = idToAlias[chain.chainId];\n\n require(\n bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),\n string(\n abi.encodePacked(\n \"StdChains setChain(string,ChainData): Chain ID \",\n vm.toString(chain.chainId),\n \" already used by \\\"\",\n foundAlias,\n \"\\\".\"\n )\n )\n );\n\n uint256 oldChainId = chains[chainAlias].chainId;\n delete idToAlias[oldChainId];\n\n chains[chainAlias] =\n Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});\n idToAlias[chain.chainId] = chainAlias;\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, Chain memory chain) internal virtual {\n setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));\n }\n\n function _toUpper(string memory str) private pure returns (string memory) {\n bytes memory strb = bytes(str);\n bytes memory copy = new bytes(strb.length);\n for (uint256 i = 0; i < strb.length; i++) {\n bytes1 b = strb[i];\n if (b >= 0x61 && b <= 0x7A) {\n copy[i] = bytes1(uint8(b) - 32);\n } else {\n copy[i] = b;\n }\n }\n return string(copy);\n }\n\n // lookup rpcUrl, in descending order of priority:\n // current -> config (foundry.toml) -> environment variable -> default\n function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)\n private\n view\n returns (Chain memory)\n {\n if (bytes(chain.rpcUrl).length == 0) {\n try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {\n chain.rpcUrl = configRpcUrl;\n } catch (bytes memory err) {\n string memory envName = string(abi.encodePacked(_toUpper(chainAlias), \"_RPC_URL\"));\n if (fallbackToDefaultRpcUrls) {\n chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);\n } else {\n chain.rpcUrl = vm.envString(envName);\n }\n // Distinguish 'not found' from 'cannot read'\n // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions\n bytes memory oldNotFoundError =\n abi.encodeWithSignature(\"CheatCodeError\", string(abi.encodePacked(\"invalid rpc url \", chainAlias)));\n bytes memory newNotFoundError = abi.encodeWithSignature(\n \"CheatcodeError(string)\", string(abi.encodePacked(\"invalid rpc url: \", chainAlias))\n );\n bytes32 errHash = keccak256(err);\n if (\n (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))\n || bytes(chain.rpcUrl).length == 0\n ) {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, err), mload(err))\n }\n }\n }\n }\n return chain;\n }\n\n function setFallbackToDefaultRpcUrls(bool useDefault) internal {\n fallbackToDefaultRpcUrls = useDefault;\n }\n\n function initializeStdChains() private {\n if (stdChainsInitialized) return;\n\n stdChainsInitialized = true;\n\n // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`\n setChainWithDefaultRpcUrl(\"anvil\", ChainData(\"Anvil\", 31337, \"http://127.0.0.1:8545\"));\n setChainWithDefaultRpcUrl(\n \"mainnet\", ChainData(\"Mainnet\", 1, \"https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP\")\n );\n setChainWithDefaultRpcUrl(\n \"sepolia\", ChainData(\"Sepolia\", 11155111, \"https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001\")\n );\n setChainWithDefaultRpcUrl(\"holesky\", ChainData(\"Holesky\", 17000, \"https://rpc.holesky.ethpandaops.io\"));\n setChainWithDefaultRpcUrl(\"optimism\", ChainData(\"Optimism\", 10, \"https://mainnet.optimism.io\"));\n setChainWithDefaultRpcUrl(\n \"optimism_sepolia\", ChainData(\"Optimism Sepolia\", 11155420, \"https://sepolia.optimism.io\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_one\", ChainData(\"Arbitrum One\", 42161, \"https://arb1.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\n \"arbitrum_one_sepolia\", ChainData(\"Arbitrum One Sepolia\", 421614, \"https://sepolia-rollup.arbitrum.io/rpc\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_nova\", ChainData(\"Arbitrum Nova\", 42170, \"https://nova.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\"polygon\", ChainData(\"Polygon\", 137, \"https://polygon-rpc.com\"));\n setChainWithDefaultRpcUrl(\n \"polygon_amoy\", ChainData(\"Polygon Amoy\", 80002, \"https://rpc-amoy.polygon.technology\")\n );\n setChainWithDefaultRpcUrl(\"avalanche\", ChainData(\"Avalanche\", 43114, \"https://api.avax.network/ext/bc/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"avalanche_fuji\", ChainData(\"Avalanche Fuji\", 43113, \"https://api.avax-test.network/ext/bc/C/rpc\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain\", ChainData(\"BNB Smart Chain\", 56, \"https://bsc-dataseed1.binance.org\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain_testnet\",\n ChainData(\"BNB Smart Chain Testnet\", 97, \"https://rpc.ankr.com/bsc_testnet_chapel\")\n );\n setChainWithDefaultRpcUrl(\"gnosis_chain\", ChainData(\"Gnosis Chain\", 100, \"https://rpc.gnosischain.com\"));\n setChainWithDefaultRpcUrl(\"moonbeam\", ChainData(\"Moonbeam\", 1284, \"https://rpc.api.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\n \"moonriver\", ChainData(\"Moonriver\", 1285, \"https://rpc.api.moonriver.moonbeam.network\")\n );\n setChainWithDefaultRpcUrl(\"moonbase\", ChainData(\"Moonbase\", 1287, \"https://rpc.testnet.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\"base_sepolia\", ChainData(\"Base Sepolia\", 84532, \"https://sepolia.base.org\"));\n setChainWithDefaultRpcUrl(\"base\", ChainData(\"Base\", 8453, \"https://mainnet.base.org\"));\n setChainWithDefaultRpcUrl(\"blast_sepolia\", ChainData(\"Blast Sepolia\", 168587773, \"https://sepolia.blast.io\"));\n setChainWithDefaultRpcUrl(\"blast\", ChainData(\"Blast\", 81457, \"https://rpc.blast.io\"));\n setChainWithDefaultRpcUrl(\"fantom_opera\", ChainData(\"Fantom Opera\", 250, \"https://rpc.ankr.com/fantom/\"));\n setChainWithDefaultRpcUrl(\n \"fantom_opera_testnet\", ChainData(\"Fantom Opera Testnet\", 4002, \"https://rpc.ankr.com/fantom_testnet/\")\n );\n setChainWithDefaultRpcUrl(\"fraxtal\", ChainData(\"Fraxtal\", 252, \"https://rpc.frax.com\"));\n setChainWithDefaultRpcUrl(\"fraxtal_testnet\", ChainData(\"Fraxtal Testnet\", 2522, \"https://rpc.testnet.frax.com\"));\n setChainWithDefaultRpcUrl(\n \"berachain_bartio_testnet\", ChainData(\"Berachain bArtio Testnet\", 80084, \"https://bartio.rpc.berachain.com\")\n );\n setChainWithDefaultRpcUrl(\"flare\", ChainData(\"Flare\", 14, \"https://flare-api.flare.network/ext/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"flare_coston2\", ChainData(\"Flare Coston2\", 114, \"https://coston2-api.flare.network/ext/C/rpc\")\n );\n }\n\n // set chain info, with priority to chainAlias' rpc url in foundry.toml\n function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {\n string memory rpcUrl = chain.rpcUrl;\n defaultRpcUrls[chainAlias] = rpcUrl;\n chain.rpcUrl = \"\";\n setChain(chainAlias, chain);\n chain.rpcUrl = rpcUrl; // restore argument\n }\n}\n" + }, + "forge-std/StdCheats.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {console2} from \"./console2.sol\";\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdCheatsSafe {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n bool private gasMeteringOff;\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawTx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n // json value name = function\n string functionSig;\n bytes32 hash;\n // json value name = tx\n RawTx1559Detail txDetail;\n // json value name = type\n string opcode;\n }\n\n struct RawTx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n bytes gas;\n bytes nonce;\n address to;\n bytes txType;\n bytes value;\n }\n\n struct Tx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n bytes32 hash;\n Tx1559Detail txDetail;\n string opcode;\n }\n\n struct Tx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n uint256 gas;\n uint256 nonce;\n address to;\n uint256 txType;\n uint256 value;\n }\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct TxLegacy {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n string hash;\n string opcode;\n TxDetailLegacy transaction;\n }\n\n struct TxDetailLegacy {\n AccessList[] accessList;\n uint256 chainId;\n bytes data;\n address from;\n uint256 gas;\n uint256 gasPrice;\n bytes32 hash;\n uint256 nonce;\n bytes1 opcode;\n bytes32 r;\n bytes32 s;\n uint256 txType;\n address to;\n uint8 v;\n uint256 value;\n }\n\n struct AccessList {\n address accessAddress;\n bytes32[] storageKeys;\n }\n\n // Data structures to parse Receipt objects from the broadcast artifact.\n // The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawReceipt {\n bytes32 blockHash;\n bytes blockNumber;\n address contractAddress;\n bytes cumulativeGasUsed;\n bytes effectiveGasPrice;\n address from;\n bytes gasUsed;\n RawReceiptLog[] logs;\n bytes logsBloom;\n bytes status;\n address to;\n bytes32 transactionHash;\n bytes transactionIndex;\n }\n\n struct Receipt {\n bytes32 blockHash;\n uint256 blockNumber;\n address contractAddress;\n uint256 cumulativeGasUsed;\n uint256 effectiveGasPrice;\n address from;\n uint256 gasUsed;\n ReceiptLog[] logs;\n bytes logsBloom;\n uint256 status;\n address to;\n bytes32 transactionHash;\n uint256 transactionIndex;\n }\n\n // Data structures to parse the entire broadcast artifact, assuming the\n // transactions conform to EIP1559.\n\n struct EIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n Receipt[] receipts;\n uint256 timestamp;\n Tx1559[] transactions;\n TxReturn[] txReturns;\n }\n\n struct RawEIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n RawReceipt[] receipts;\n TxReturn[] txReturns;\n uint256 timestamp;\n RawTx1559[] transactions;\n }\n\n struct RawReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n bytes blockNumber;\n bytes data;\n bytes logIndex;\n bool removed;\n bytes32[] topics;\n bytes32 transactionHash;\n bytes transactionIndex;\n bytes transactionLogIndex;\n }\n\n struct ReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n uint256 blockNumber;\n bytes data;\n uint256 logIndex;\n bytes32[] topics;\n uint256 transactionIndex;\n uint256 transactionLogIndex;\n bool removed;\n }\n\n struct TxReturn {\n string internalType;\n string value;\n }\n\n struct Account {\n address addr;\n uint256 key;\n }\n\n enum AddressType {\n Payable,\n NonPayable,\n ZeroAddress,\n Precompile,\n ForgeAddress\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n function assumeNotBlacklisted(address token, address addr) internal view virtual {\n // Nothing to check if `token` is not a contract.\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.\");\n\n bool success;\n bytes memory returnData;\n\n // 4-byte selector for `isBlacklisted(address)`, used by USDC.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n\n // 4-byte selector for `isBlackListed(address)`, used by USDT.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for\n // backwards compatibility, since this name was used in the original PR which already has\n // a release. This function can be removed in a future release once we want a breaking change.\n function assumeNoBlacklisted(address token, address addr) internal view virtual {\n assumeNotBlacklisted(token, addr);\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {\n if (addressType == AddressType.Payable) {\n assumeNotPayable(addr);\n } else if (addressType == AddressType.NonPayable) {\n assumePayable(addr);\n } else if (addressType == AddressType.ZeroAddress) {\n assumeNotZeroAddress(addr);\n } else if (addressType == AddressType.Precompile) {\n assumeNotPrecompile(addr);\n } else if (addressType == AddressType.ForgeAddress) {\n assumeNotForgeAddress(addr);\n }\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3,\n AddressType addressType4\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n assumeAddressIsNot(addr, addressType4);\n }\n\n // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to\n // `addr` and checking the `success` return value.\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used.\n function _isPayable(address addr) private returns (bool) {\n require(\n addr.balance < UINT256_MAX,\n \"StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds\"\n );\n uint256 origBalanceTest = address(this).balance;\n uint256 origBalanceAddr = address(addr).balance;\n\n vm.deal(address(this), 1);\n (bool success,) = payable(addr).call{value: 1}(\"\");\n\n // reset balances\n vm.deal(address(this), origBalanceTest);\n vm.deal(addr, origBalanceAddr);\n\n return success;\n }\n\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used. See the\n // `_isPayable` method for more information.\n function assumePayable(address addr) internal virtual {\n vm.assume(_isPayable(addr));\n }\n\n function assumeNotPayable(address addr) internal virtual {\n vm.assume(!_isPayable(addr));\n }\n\n function assumeNotZeroAddress(address addr) internal pure virtual {\n vm.assume(addr != address(0));\n }\n\n function assumeNotPrecompile(address addr) internal pure virtual {\n assumeNotPrecompile(addr, _pureChainId());\n }\n\n function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {\n // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific\n // address), but the same rationale for excluding them applies so we include those too.\n\n // These are reserved by Ethereum and may be on all EVM-compatible chains.\n vm.assume(addr < address(0x1) || addr > address(0xff));\n\n // forgefmt: disable-start\n if (chainId == 10 || chainId == 420) {\n // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21\n vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));\n } else if (chainId == 42161 || chainId == 421613) {\n // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains\n vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));\n } else if (chainId == 43114 || chainId == 43113) {\n // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59\n vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));\n vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));\n vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));\n }\n // forgefmt: disable-end\n }\n\n function assumeNotForgeAddress(address addr) internal pure virtual {\n // vm, console, and Create2Deployer addresses\n vm.assume(\n addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67\n && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C\n );\n }\n\n function readEIP1559ScriptArtifact(string memory path)\n internal\n view\n virtual\n returns (EIP1559ScriptArtifact memory)\n {\n string memory data = vm.readFile(path);\n bytes memory parsedData = vm.parseJson(data);\n RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));\n EIP1559ScriptArtifact memory artifact;\n artifact.libraries = rawArtifact.libraries;\n artifact.path = rawArtifact.path;\n artifact.timestamp = rawArtifact.timestamp;\n artifact.pending = rawArtifact.pending;\n artifact.txReturns = rawArtifact.txReturns;\n artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);\n artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);\n return artifact;\n }\n\n function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {\n Tx1559[] memory txs = new Tx1559[](rawTxs.length);\n for (uint256 i; i < rawTxs.length; i++) {\n txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);\n }\n return txs;\n }\n\n function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {\n Tx1559 memory transaction;\n transaction.arguments = rawTx.arguments;\n transaction.contractName = rawTx.contractName;\n transaction.functionSig = rawTx.functionSig;\n transaction.hash = rawTx.hash;\n transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);\n transaction.opcode = rawTx.opcode;\n return transaction;\n }\n\n function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)\n internal\n pure\n virtual\n returns (Tx1559Detail memory)\n {\n Tx1559Detail memory txDetail;\n txDetail.data = rawDetail.data;\n txDetail.from = rawDetail.from;\n txDetail.to = rawDetail.to;\n txDetail.nonce = _bytesToUint(rawDetail.nonce);\n txDetail.txType = _bytesToUint(rawDetail.txType);\n txDetail.value = _bytesToUint(rawDetail.value);\n txDetail.gas = _bytesToUint(rawDetail.gas);\n txDetail.accessList = rawDetail.accessList;\n return txDetail;\n }\n\n function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".transactions\");\n RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));\n return rawToConvertedEIPTx1559s(rawTxs);\n }\n\n function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".transactions[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));\n return rawToConvertedEIPTx1559(rawTx);\n }\n\n // Analogous to readTransactions, but for receipts.\n function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".receipts\");\n RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));\n return rawToConvertedReceipts(rawReceipts);\n }\n\n function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".receipts[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));\n return rawToConvertedReceipt(rawReceipt);\n }\n\n function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {\n Receipt[] memory receipts = new Receipt[](rawReceipts.length);\n for (uint256 i; i < rawReceipts.length; i++) {\n receipts[i] = rawToConvertedReceipt(rawReceipts[i]);\n }\n return receipts;\n }\n\n function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {\n Receipt memory receipt;\n receipt.blockHash = rawReceipt.blockHash;\n receipt.to = rawReceipt.to;\n receipt.from = rawReceipt.from;\n receipt.contractAddress = rawReceipt.contractAddress;\n receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);\n receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);\n receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);\n receipt.status = _bytesToUint(rawReceipt.status);\n receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);\n receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);\n receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);\n receipt.logsBloom = rawReceipt.logsBloom;\n receipt.transactionHash = rawReceipt.transactionHash;\n return receipt;\n }\n\n function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)\n internal\n pure\n virtual\n returns (ReceiptLog[] memory)\n {\n ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);\n for (uint256 i; i < rawLogs.length; i++) {\n logs[i].logAddress = rawLogs[i].logAddress;\n logs[i].blockHash = rawLogs[i].blockHash;\n logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);\n logs[i].data = rawLogs[i].data;\n logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);\n logs[i].topics = rawLogs[i].topics;\n logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);\n logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);\n logs[i].removed = rawLogs[i].removed;\n }\n return logs;\n }\n\n // Deploy a contract by fetching the contract bytecode from\n // the artifacts directory\n // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`\n function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes): Deployment failed.\");\n }\n\n function deployCode(string memory what) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string): Deployment failed.\");\n }\n\n /// @dev deploy contract with value on construction\n function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes,uint256): Deployment failed.\");\n }\n\n function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,uint256): Deployment failed.\");\n }\n\n // creates a labeled address and the corresponding private key\n function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {\n privateKey = uint256(keccak256(abi.encodePacked(name)));\n addr = vm.addr(privateKey);\n vm.label(addr, name);\n }\n\n // creates a labeled address\n function makeAddr(string memory name) internal virtual returns (address addr) {\n (addr,) = makeAddrAndKey(name);\n }\n\n // Destroys an account immediately, sending the balance to beneficiary.\n // Destroying means: balance will be zero, code will be empty, and nonce will be 0\n // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce\n // only after tx ends, this will run immediately.\n function destroyAccount(address who, address beneficiary) internal virtual {\n uint256 currBalance = who.balance;\n vm.etch(who, abi.encode());\n vm.deal(who, 0);\n vm.resetNonce(who);\n\n uint256 beneficiaryBalance = beneficiary.balance;\n vm.deal(beneficiary, currBalance + beneficiaryBalance);\n }\n\n // creates a struct containing both a labeled address and the corresponding private key\n function makeAccount(string memory name) internal virtual returns (Account memory account) {\n (account.addr, account.key) = makeAddrAndKey(name);\n }\n\n function deriveRememberKey(string memory mnemonic, uint32 index)\n internal\n virtual\n returns (address who, uint256 privateKey)\n {\n privateKey = vm.deriveKey(mnemonic, index);\n who = vm.rememberKey(privateKey);\n }\n\n function _bytesToUint(bytes memory b) private pure returns (uint256) {\n require(b.length <= 32, \"StdCheats _bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n function isFork() internal view virtual returns (bool status) {\n try vm.activeFork() {\n status = true;\n } catch (bytes memory) {}\n }\n\n modifier skipWhenForking() {\n if (!isFork()) {\n _;\n }\n }\n\n modifier skipWhenNotForking() {\n if (isFork()) {\n _;\n }\n }\n\n modifier noGasMetering() {\n vm.pauseGasMetering();\n // To prevent turning gas monitoring back on with nested functions that use this modifier,\n // we check if gasMetering started in the off position. If it did, we don't want to turn\n // it back on until we exit the top level function that used the modifier\n //\n // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.\n // funcA will have `gasStartedOff` as false, funcB will have it as true,\n // so we only turn metering back on at the end of the funcA\n bool gasStartedOff = gasMeteringOff;\n gasMeteringOff = true;\n\n _;\n\n // if gas metering was on when this modifier was called, turn it back on at the end\n if (!gasStartedOff) {\n gasMeteringOff = false;\n vm.resumeGasMetering();\n }\n }\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n\n// Wrappers around cheatcodes to avoid footguns\nabstract contract StdCheats is StdCheatsSafe {\n using stdStorage for StdStorage;\n\n StdStorage private stdstore;\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n\n // Skip forward or rewind time by the specified number of seconds\n function skip(uint256 time) internal virtual {\n vm.warp(block.timestamp + time);\n }\n\n function rewind(uint256 time) internal virtual {\n vm.warp(block.timestamp - time);\n }\n\n // Setup a prank from an address that has some ether\n function hoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender, origin);\n }\n\n function hoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender, origin);\n }\n\n // Start perpetual prank from an address that has some ether\n function startHoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender);\n }\n\n function startHoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender);\n }\n\n // Start perpetual prank from an address that has some ether\n // tx.origin is set to the origin parameter\n function startHoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender, origin);\n }\n\n function startHoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender, origin);\n }\n\n function changePrank(address msgSender) internal virtual {\n console2_log_StdCheats(\"changePrank is deprecated. Please use vm.startPrank instead.\");\n vm.stopPrank();\n vm.startPrank(msgSender);\n }\n\n function changePrank(address msgSender, address txOrigin) internal virtual {\n vm.stopPrank();\n vm.startPrank(msgSender, txOrigin);\n }\n\n // The same as Vm's `deal`\n // Use the alternative signature for ERC20 tokens\n function deal(address to, uint256 give) internal virtual {\n vm.deal(to, give);\n }\n\n // Set the balance of an account for any ERC20 token\n // Use the alternative signature to update `totalSupply`\n function deal(address token, address to, uint256 give) internal virtual {\n deal(token, to, give, false);\n }\n\n // Set the balance of an account for any ERC1155 token\n // Use the alternative signature to update `totalSupply`\n function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {\n dealERC1155(token, to, id, give, false);\n }\n\n function deal(address token, address to, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0x18160ddd).checked_write(totSup);\n }\n }\n\n function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));\n require(\n totSupData.length != 0,\n \"StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply.\"\n );\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);\n }\n }\n\n function dealERC721(address token, address to, uint256 id) internal virtual {\n // check if token id is already minted and the actual owner.\n (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));\n require(successMinted, \"StdCheats deal(address,address,uint,bool): id not minted.\");\n\n // get owner current balance\n (, bytes memory fromBalData) =\n token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));\n uint256 fromPrevBal = abi.decode(fromBalData, (uint256));\n\n // get new user current balance\n (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 toPrevBal = abi.decode(toBalData, (uint256));\n\n // update balances\n stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);\n\n // update owner\n stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);\n }\n\n function deployCodeTo(string memory what, address where) internal virtual {\n deployCodeTo(what, \"\", 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {\n deployCodeTo(what, args, 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {\n bytes memory creationCode = vm.getCode(what);\n vm.etch(where, abi.encodePacked(creationCode, args));\n (bool success, bytes memory runtimeBytecode) = where.call{value: value}(\"\");\n require(success, \"StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.\");\n vm.etch(where, runtimeBytecode);\n }\n\n // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.\n function console2_log_StdCheats(string memory p0) private view {\n (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature(\"log(string)\", p0));\n status;\n }\n}\n" + }, + "forge-std/StdError.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdError {\n bytes public constant assertionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x01);\n bytes public constant arithmeticError = abi.encodeWithSignature(\"Panic(uint256)\", 0x11);\n bytes public constant divisionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x12);\n bytes public constant enumConversionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x21);\n bytes public constant encodeStorageError = abi.encodeWithSignature(\"Panic(uint256)\", 0x22);\n bytes public constant popError = abi.encodeWithSignature(\"Panic(uint256)\", 0x31);\n bytes public constant indexOOBError = abi.encodeWithSignature(\"Panic(uint256)\", 0x32);\n bytes public constant memOverflowError = abi.encodeWithSignature(\"Panic(uint256)\", 0x41);\n bytes public constant zeroVarError = abi.encodeWithSignature(\"Panic(uint256)\", 0x51);\n}\n" + }, + "forge-std/StdInvariant.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nabstract contract StdInvariant {\n struct FuzzSelector {\n address addr;\n bytes4[] selectors;\n }\n\n struct FuzzArtifactSelector {\n string artifact;\n bytes4[] selectors;\n }\n\n struct FuzzInterface {\n address addr;\n string[] artifacts;\n }\n\n address[] private _excludedContracts;\n address[] private _excludedSenders;\n address[] private _targetedContracts;\n address[] private _targetedSenders;\n\n string[] private _excludedArtifacts;\n string[] private _targetedArtifacts;\n\n FuzzArtifactSelector[] private _targetedArtifactSelectors;\n\n FuzzSelector[] private _excludedSelectors;\n FuzzSelector[] private _targetedSelectors;\n\n FuzzInterface[] private _targetedInterfaces;\n\n // Functions for users:\n // These are intended to be called in tests.\n\n function excludeContract(address newExcludedContract_) internal {\n _excludedContracts.push(newExcludedContract_);\n }\n\n function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {\n _excludedSelectors.push(newExcludedSelector_);\n }\n\n function excludeSender(address newExcludedSender_) internal {\n _excludedSenders.push(newExcludedSender_);\n }\n\n function excludeArtifact(string memory newExcludedArtifact_) internal {\n _excludedArtifacts.push(newExcludedArtifact_);\n }\n\n function targetArtifact(string memory newTargetedArtifact_) internal {\n _targetedArtifacts.push(newTargetedArtifact_);\n }\n\n function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {\n _targetedArtifactSelectors.push(newTargetedArtifactSelector_);\n }\n\n function targetContract(address newTargetedContract_) internal {\n _targetedContracts.push(newTargetedContract_);\n }\n\n function targetSelector(FuzzSelector memory newTargetedSelector_) internal {\n _targetedSelectors.push(newTargetedSelector_);\n }\n\n function targetSender(address newTargetedSender_) internal {\n _targetedSenders.push(newTargetedSender_);\n }\n\n function targetInterface(FuzzInterface memory newTargetedInterface_) internal {\n _targetedInterfaces.push(newTargetedInterface_);\n }\n\n // Functions for forge:\n // These are called by forge to run invariant tests and don't need to be called in tests.\n\n function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {\n excludedArtifacts_ = _excludedArtifacts;\n }\n\n function excludeContracts() public view returns (address[] memory excludedContracts_) {\n excludedContracts_ = _excludedContracts;\n }\n\n function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {\n excludedSelectors_ = _excludedSelectors;\n }\n\n function excludeSenders() public view returns (address[] memory excludedSenders_) {\n excludedSenders_ = _excludedSenders;\n }\n\n function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {\n targetedArtifacts_ = _targetedArtifacts;\n }\n\n function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {\n targetedArtifactSelectors_ = _targetedArtifactSelectors;\n }\n\n function targetContracts() public view returns (address[] memory targetedContracts_) {\n targetedContracts_ = _targetedContracts;\n }\n\n function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {\n targetedSelectors_ = _targetedSelectors;\n }\n\n function targetSenders() public view returns (address[] memory targetedSenders_) {\n targetedSenders_ = _targetedSenders;\n }\n\n function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {\n targetedInterfaces_ = _targetedInterfaces;\n }\n}\n" + }, + "forge-std/StdJson.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing JSON files\n// To parse:\n// ```\n// using stdJson for string;\n// string memory json = vm.readFile(\"\");\n// json.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdJson for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdJson {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory json, string memory key) internal view returns (bool) {\n return vm.keyExistsJson(json, key);\n }\n\n function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJson(json, key);\n }\n\n function readUint(string memory json, string memory key) internal pure returns (uint256) {\n return vm.parseJsonUint(json, key);\n }\n\n function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseJsonUintArray(json, key);\n }\n\n function readInt(string memory json, string memory key) internal pure returns (int256) {\n return vm.parseJsonInt(json, key);\n }\n\n function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {\n return vm.parseJsonIntArray(json, key);\n }\n\n function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {\n return vm.parseJsonBytes32(json, key);\n }\n\n function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseJsonBytes32Array(json, key);\n }\n\n function readString(string memory json, string memory key) internal pure returns (string memory) {\n return vm.parseJsonString(json, key);\n }\n\n function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {\n return vm.parseJsonStringArray(json, key);\n }\n\n function readAddress(string memory json, string memory key) internal pure returns (address) {\n return vm.parseJsonAddress(json, key);\n }\n\n function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {\n return vm.parseJsonAddressArray(json, key);\n }\n\n function readBool(string memory json, string memory key) internal pure returns (bool) {\n return vm.parseJsonBool(json, key);\n }\n\n function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {\n return vm.parseJsonBoolArray(json, key);\n }\n\n function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJsonBytes(json, key);\n }\n\n function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseJsonBytesArray(json, key);\n }\n\n function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(json, key) ? readUint(json, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(json, key) ? readUintArray(json, key) : defaultValue;\n }\n\n function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(json, key) ? readInt(json, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(json, key) ? readIntArray(json, key) : defaultValue;\n }\n\n function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(json, key) ? readBytes32(json, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;\n }\n\n function readStringOr(string memory json, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(json, key) ? readString(json, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(json, key) ? readStringArray(json, key) : defaultValue;\n }\n\n function readAddressOr(string memory json, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(json, key) ? readAddress(json, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;\n }\n\n function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(json, key) ? readBool(json, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;\n }\n\n function readBytesOr(string memory json, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(json, key) ? readBytes(json, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeJson(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeJson(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdMath {\n int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;\n\n function abs(int256 a) internal pure returns (uint256) {\n // Required or it will fail when `a = type(int256).min`\n if (a == INT256_MIN) {\n return 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n }\n\n return uint256(a > 0 ? a : -a);\n }\n\n function delta(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a - b : b - a;\n }\n\n function delta(int256 a, int256 b) internal pure returns (uint256) {\n // a and b are of the same sign\n // this works thanks to two's complement, the left-most bit is the sign bit\n if ((a ^ b) > -1) {\n return delta(abs(a), abs(b));\n }\n\n // a and b are of opposite signs\n return abs(a) + abs(b);\n }\n\n function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n\n return absDelta * 1e18 / b;\n }\n\n function percentDelta(int256 a, int256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n uint256 absB = abs(b);\n\n return absDelta * 1e18 / absB;\n }\n}\n" + }, + "forge-std/StdStorage.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {Vm} from \"./Vm.sol\";\n\nstruct FindData {\n uint256 slot;\n uint256 offsetLeft;\n uint256 offsetRight;\n bool found;\n}\n\nstruct StdStorage {\n mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;\n bytes32[] _keys;\n bytes4 _sig;\n uint256 _depth;\n address _target;\n bytes32 _set;\n bool _enable_packed_slots;\n bytes _calldata;\n}\n\nlibrary stdStorageSafe {\n event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);\n event WARNING_UninitedSlot(address who, uint256 slot);\n\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return bytes4(keccak256(bytes(sigStr)));\n }\n\n function getCallParams(StdStorage storage self) internal view returns (bytes memory) {\n if (self._calldata.length == 0) {\n return flatten(self._keys);\n } else {\n return self._calldata;\n }\n }\n\n // Calls target contract with configured parameters\n function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {\n bytes memory cald = abi.encodePacked(self._sig, getCallParams(self));\n (bool success, bytes memory rdat) = self._target.staticcall(cald);\n bytes32 result = bytesToBytes32(rdat, 32 * self._depth);\n\n return (success, result);\n }\n\n // Tries mutating slot value to determine if the targeted value is stored in it.\n // If current value is 0, then we are setting slot value to type(uint256).max\n // Otherwise, we set it to 0. That way, return value should always be affected.\n function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n (bool success, bytes32 prevReturnValue) = callTarget(self);\n\n bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);\n vm.store(self._target, slot, testVal);\n\n (, bytes32 newReturnValue) = callTarget(self);\n\n vm.store(self._target, slot, prevSlotValue);\n\n return (success && (prevReturnValue != newReturnValue));\n }\n\n // Tries setting one of the bits in slot to 1 until return value changes.\n // Index of resulted bit is an offset packed slot has from left/right side\n function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {\n for (uint256 offset = 0; offset < 256; offset++) {\n uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);\n vm.store(self._target, slot, bytes32(valueToPut));\n\n (bool success, bytes32 data) = callTarget(self);\n\n if (success && (uint256(data) > 0)) {\n return (true, offset);\n }\n }\n return (false, 0);\n }\n\n function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n\n (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);\n (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);\n\n // `findOffset` may mutate slot value, so we are setting it to initial value\n vm.store(self._target, slot, prevSlotValue);\n return (foundLeft && foundRight, offsetLeft, offsetRight);\n }\n\n function find(StdStorage storage self) internal returns (FindData storage) {\n return find(self, true);\n }\n\n /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against\n // slot complexity:\n // if flat, will be bytes32(uint256(uint));\n // if map, will be keccak256(abi.encode(key, uint(slot)));\n // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));\n // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);\n function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = getCallParams(self);\n\n // calldata to test against\n if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n vm.record();\n (, bytes32 callResult) = callTarget(self);\n (bytes32[] memory reads,) = vm.accesses(address(who));\n\n if (reads.length == 0) {\n revert(\"stdStorage find(StdStorage): No storage use detected for target.\");\n } else {\n for (uint256 i = reads.length; --i >= 0;) {\n bytes32 prev = vm.load(who, reads[i]);\n if (prev == bytes32(0)) {\n emit WARNING_UninitedSlot(who, uint256(reads[i]));\n }\n\n if (!checkSlotMutatesCall(self, reads[i])) {\n continue;\n }\n\n (uint256 offsetLeft, uint256 offsetRight) = (0, 0);\n\n if (self._enable_packed_slots) {\n bool found;\n (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);\n if (!found) {\n continue;\n }\n }\n\n // Check that value between found offsets is equal to the current call result\n uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;\n\n if (uint256(callResult) != curVal) {\n continue;\n }\n\n emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =\n FindData(uint256(reads[i]), offsetLeft, offsetRight, true);\n break;\n }\n }\n\n require(\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,\n \"stdStorage find(StdStorage): Slot(s) not found.\"\n );\n\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n self._target = _target;\n return self;\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n self._sig = _sig;\n return self;\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n self._sig = sigs(_sig);\n return self;\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n self._calldata = _calldata;\n return self;\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n self._keys.push(bytes32(uint256(uint160(who))));\n return self;\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n self._keys.push(bytes32(amt));\n return self;\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n self._keys.push(key);\n return self;\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n self._enable_packed_slots = true;\n return self;\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n self._depth = _depth;\n return self;\n }\n\n function read(StdStorage storage self) private returns (bytes memory) {\n FindData storage data = find(self, false);\n uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);\n uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;\n clear(self);\n return abi.encode(value);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return abi.decode(read(self), (bytes32));\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n int256 v = read_int(self);\n if (v == 0) return false;\n if (v == 1) return true;\n revert(\"stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.\");\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return abi.decode(read(self), (address));\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return abi.decode(read(self), (uint256));\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return abi.decode(read(self), (int256));\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n return (uint256(parent_slot), key);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n bool found;\n bytes32 root_slot;\n bytes32 parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n while (found) {\n root_slot = parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));\n }\n return uint256(root_slot);\n }\n\n function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {\n bytes32 out;\n\n uint256 max = b.length > 32 ? 32 : b.length;\n for (uint256 i = 0; i < max; i++) {\n out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);\n }\n return out;\n }\n\n function flatten(bytes32[] memory b) private pure returns (bytes memory) {\n bytes memory result = new bytes(b.length * 32);\n for (uint256 i = 0; i < b.length; i++) {\n bytes32 k = b[i];\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(result, add(32, mul(32, i))), k)\n }\n }\n\n return result;\n }\n\n function clear(StdStorage storage self) internal {\n delete self._target;\n delete self._sig;\n delete self._keys;\n delete self._depth;\n delete self._enable_packed_slots;\n delete self._calldata;\n }\n\n // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`\n // (slotValue & mask) >> offsetRight will be the value of the given packed variable\n function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {\n // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;\n // using assembly because (1 << 256) causes overflow\n assembly {\n mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))\n }\n }\n\n // Returns slot value with updated packed variable.\n function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)\n internal\n pure\n returns (bytes32 newValue)\n {\n return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));\n }\n}\n\nlibrary stdStorage {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return stdStorageSafe.sigs(sigStr);\n }\n\n function find(StdStorage storage self) internal returns (uint256) {\n return find(self, true);\n }\n\n function find(StdStorage storage self, bool _clear) internal returns (uint256) {\n return stdStorageSafe.find(self, _clear).slot;\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n return stdStorageSafe.target(self, _target);\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, who);\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, amt);\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, key);\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n return stdStorageSafe.with_calldata(self, _calldata);\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n return stdStorageSafe.enable_packed_slots(self);\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n return stdStorageSafe.depth(self, _depth);\n }\n\n function clear(StdStorage storage self) internal {\n stdStorageSafe.clear(self);\n }\n\n function checked_write(StdStorage storage self, address who) internal {\n checked_write(self, bytes32(uint256(uint160(who))));\n }\n\n function checked_write(StdStorage storage self, uint256 amt) internal {\n checked_write(self, bytes32(amt));\n }\n\n function checked_write_int(StdStorage storage self, int256 val) internal {\n checked_write(self, bytes32(uint256(val)));\n }\n\n function checked_write(StdStorage storage self, bool write) internal {\n bytes32 t;\n /// @solidity memory-safe-assembly\n assembly {\n t := write\n }\n checked_write(self, t);\n }\n\n function checked_write(StdStorage storage self, bytes32 set) internal {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = stdStorageSafe.getCallParams(self);\n\n if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n find(self, false);\n }\n FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n if ((data.offsetLeft + data.offsetRight) > 0) {\n uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));\n require(\n uint256(set) < maxVal,\n string(\n abi.encodePacked(\n \"stdStorage find(StdStorage): Packed slot. We can't fit value greater than \",\n vm.toString(maxVal)\n )\n )\n );\n }\n bytes32 curVal = vm.load(who, bytes32(data.slot));\n bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);\n\n vm.store(who, bytes32(data.slot), valToSet);\n\n (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);\n\n if (!success || callResult != set) {\n vm.store(who, bytes32(data.slot), curVal);\n revert(\"stdStorage find(StdStorage): Failed to write value.\");\n }\n clear(self);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return stdStorageSafe.read_bytes32(self);\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n return stdStorageSafe.read_bool(self);\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return stdStorageSafe.read_address(self);\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.read_uint(self);\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return stdStorageSafe.read_int(self);\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n return stdStorageSafe.parent(self);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.root(self);\n }\n}\n" + }, + "forge-std/StdStyle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\nlibrary StdStyle {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n string constant RED = \"\\u001b[91m\";\n string constant GREEN = \"\\u001b[92m\";\n string constant YELLOW = \"\\u001b[93m\";\n string constant BLUE = \"\\u001b[94m\";\n string constant MAGENTA = \"\\u001b[95m\";\n string constant CYAN = \"\\u001b[96m\";\n string constant BOLD = \"\\u001b[1m\";\n string constant DIM = \"\\u001b[2m\";\n string constant ITALIC = \"\\u001b[3m\";\n string constant UNDERLINE = \"\\u001b[4m\";\n string constant INVERSE = \"\\u001b[7m\";\n string constant RESET = \"\\u001b[0m\";\n\n function styleConcat(string memory style, string memory self) private pure returns (string memory) {\n return string(abi.encodePacked(style, self, RESET));\n }\n\n function red(string memory self) internal pure returns (string memory) {\n return styleConcat(RED, self);\n }\n\n function red(uint256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(int256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(address self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(bool self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes(bytes memory self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes32(bytes32 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function green(string memory self) internal pure returns (string memory) {\n return styleConcat(GREEN, self);\n }\n\n function green(uint256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(int256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(address self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(bool self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes(bytes memory self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes32(bytes32 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function yellow(string memory self) internal pure returns (string memory) {\n return styleConcat(YELLOW, self);\n }\n\n function yellow(uint256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(int256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(address self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(bool self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes(bytes memory self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes32(bytes32 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function blue(string memory self) internal pure returns (string memory) {\n return styleConcat(BLUE, self);\n }\n\n function blue(uint256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(int256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(address self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(bool self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes(bytes memory self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes32(bytes32 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function magenta(string memory self) internal pure returns (string memory) {\n return styleConcat(MAGENTA, self);\n }\n\n function magenta(uint256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(int256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(address self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(bool self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes(bytes memory self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes32(bytes32 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function cyan(string memory self) internal pure returns (string memory) {\n return styleConcat(CYAN, self);\n }\n\n function cyan(uint256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(int256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(address self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(bool self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes(bytes memory self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes32(bytes32 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function bold(string memory self) internal pure returns (string memory) {\n return styleConcat(BOLD, self);\n }\n\n function bold(uint256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(int256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(address self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(bool self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes(bytes memory self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes32(bytes32 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function dim(string memory self) internal pure returns (string memory) {\n return styleConcat(DIM, self);\n }\n\n function dim(uint256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(int256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(address self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(bool self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes(bytes memory self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes32(bytes32 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function italic(string memory self) internal pure returns (string memory) {\n return styleConcat(ITALIC, self);\n }\n\n function italic(uint256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(int256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(address self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(bool self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes(bytes memory self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes32(bytes32 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function underline(string memory self) internal pure returns (string memory) {\n return styleConcat(UNDERLINE, self);\n }\n\n function underline(uint256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(int256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(address self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(bool self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes(bytes memory self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes32(bytes32 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function inverse(string memory self) internal pure returns (string memory) {\n return styleConcat(INVERSE, self);\n }\n\n function inverse(uint256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(int256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(address self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(bool self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes(bytes memory self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes32(bytes32 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n}\n" + }, + "forge-std/StdToml.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing TOML files\n// To parse:\n// ```\n// using stdToml for string;\n// string memory toml = vm.readFile(\"\");\n// toml.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdToml for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdToml {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory toml, string memory key) internal view returns (bool) {\n return vm.keyExistsToml(toml, key);\n }\n\n function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseToml(toml, key);\n }\n\n function readUint(string memory toml, string memory key) internal pure returns (uint256) {\n return vm.parseTomlUint(toml, key);\n }\n\n function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseTomlUintArray(toml, key);\n }\n\n function readInt(string memory toml, string memory key) internal pure returns (int256) {\n return vm.parseTomlInt(toml, key);\n }\n\n function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {\n return vm.parseTomlIntArray(toml, key);\n }\n\n function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {\n return vm.parseTomlBytes32(toml, key);\n }\n\n function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseTomlBytes32Array(toml, key);\n }\n\n function readString(string memory toml, string memory key) internal pure returns (string memory) {\n return vm.parseTomlString(toml, key);\n }\n\n function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {\n return vm.parseTomlStringArray(toml, key);\n }\n\n function readAddress(string memory toml, string memory key) internal pure returns (address) {\n return vm.parseTomlAddress(toml, key);\n }\n\n function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {\n return vm.parseTomlAddressArray(toml, key);\n }\n\n function readBool(string memory toml, string memory key) internal pure returns (bool) {\n return vm.parseTomlBool(toml, key);\n }\n\n function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {\n return vm.parseTomlBoolArray(toml, key);\n }\n\n function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseTomlBytes(toml, key);\n }\n\n function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseTomlBytesArray(toml, key);\n }\n\n function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(toml, key) ? readUint(toml, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;\n }\n\n function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(toml, key) ? readInt(toml, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;\n }\n\n function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;\n }\n\n function readStringOr(string memory toml, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(toml, key) ? readString(toml, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;\n }\n\n function readAddressOr(string memory toml, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;\n }\n\n function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(toml, key) ? readBool(toml, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;\n }\n\n function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeToml(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeToml(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {IMulticall3} from \"./interfaces/IMulticall3.sol\";\nimport {MockERC20} from \"./mocks/MockERC20.sol\";\nimport {MockERC721} from \"./mocks/MockERC721.sol\";\nimport {VmSafe} from \"./Vm.sol\";\n\nabstract contract StdUtils {\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS\n //////////////////////////////////////////////////////////////////////////*/\n\n IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n uint256 private constant INT256_MIN_ABS =\n 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n uint256 private constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n require(min <= max, \"StdUtils bound(uint256,uint256,uint256): Max is less than min.\");\n // If x is between min and max, return x directly. This is to ensure that dictionary values\n // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188\n if (x >= min && x <= max) return x;\n\n uint256 size = max - min + 1;\n\n // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.\n // This helps ensure coverage of the min/max values.\n if (x <= 3 && size > x) return min + x;\n if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);\n\n // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.\n if (x > max) {\n uint256 diff = x - max;\n uint256 rem = diff % size;\n if (rem == 0) return max;\n result = min + rem - 1;\n } else if (x < min) {\n uint256 diff = min - x;\n uint256 rem = diff % size;\n if (rem == 0) return min;\n result = max - rem + 1;\n }\n }\n\n function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", result);\n }\n\n function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n require(min <= max, \"StdUtils bound(int256,int256,int256): Max is less than min.\");\n\n // Shifting all int256 values to uint256 to use _bound function. The range of two types are:\n // int256 : -(2**255) ~ (2**255 - 1)\n // uint256: 0 ~ (2**256 - 1)\n // So, add 2**255, INT256_MIN_ABS to the integer values.\n //\n // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.\n // So, use `~uint256(x) + 1` instead.\n uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);\n uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);\n uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);\n\n uint256 y = _bound(_x, _min, _max);\n\n // To move it back to int256 value, subtract INT256_MIN_ABS at here.\n result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);\n }\n\n function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", vm.toString(result));\n }\n\n function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {\n result = _bound(privateKey, 1, SECP256K1_ORDER - 1);\n }\n\n function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {\n require(b.length <= 32, \"StdUtils bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce\n /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol)\n function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {\n console2_log_StdUtils(\"computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.\");\n return vm.computeCreateAddress(deployer, nonce);\n }\n\n function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)\n internal\n pure\n virtual\n returns (address)\n {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initcodeHash, deployer);\n }\n\n /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initCodeHash);\n }\n\n /// @dev returns an initialized mock ERC20 contract\n function deployMockERC20(string memory name, string memory symbol, uint8 decimals)\n internal\n returns (MockERC20 mock)\n {\n mock = new MockERC20();\n mock.initialize(name, symbol, decimals);\n }\n\n /// @dev returns an initialized mock ERC721 contract\n function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) {\n mock = new MockERC721();\n mock.initialize(name, symbol);\n }\n\n /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {\n return hashInitCode(creationCode, \"\");\n }\n\n /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n /// @param args the ABI-encoded arguments to the constructor of C\n function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(creationCode, args));\n }\n\n // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.\n function getTokenBalances(address token, address[] memory addresses)\n internal\n virtual\n returns (uint256[] memory balances)\n {\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdUtils getTokenBalances(address,address[]): Token address is not a contract.\");\n\n // ABI encode the aggregate call to Multicall3.\n uint256 length = addresses.length;\n IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);\n for (uint256 i = 0; i < length; ++i) {\n // 0x70a08231 = bytes4(\"balanceOf(address)\"))\n calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});\n }\n\n // Make the aggregate call.\n (, bytes[] memory returnData) = multicall.aggregate(calls);\n\n // ABI decode the return data and return the balances.\n balances = new uint256[](length);\n for (uint256 i = 0; i < length; ++i) {\n balances[i] = abi.decode(returnData[i], (uint256));\n }\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n PRIVATE FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {\n return address(uint160(uint256(bytesValue)));\n }\n\n // This section is used to prevent the compilation of console, which shortens the compilation time when console is\n // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid\n // any breaking changes to function signatures.\n function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)\n internal\n pure\n returns (function(bytes memory) internal pure fnOut)\n {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castLogPayloadViewToPure(_sendLogPayloadView)(payload);\n }\n\n function _sendLogPayloadView(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE2_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function console2_log_StdUtils(string memory p0) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function console2_log_StdUtils(string memory p0, uint256 p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function console2_log_StdUtils(string memory p0, string memory p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n}\n" + }, + "forge-std/Test.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\n// 💬 ABOUT\n// Forge Std's default Test.\n\n// 🧩 MODULES\nimport {console} from \"./console.sol\";\nimport {console2} from \"./console2.sol\";\nimport {safeconsole} from \"./safeconsole.sol\";\nimport {StdAssertions} from \"./StdAssertions.sol\";\nimport {StdChains} from \"./StdChains.sol\";\nimport {StdCheats} from \"./StdCheats.sol\";\nimport {stdError} from \"./StdError.sol\";\nimport {StdInvariant} from \"./StdInvariant.sol\";\nimport {stdJson} from \"./StdJson.sol\";\nimport {stdMath} from \"./StdMath.sol\";\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {StdStyle} from \"./StdStyle.sol\";\nimport {stdToml} from \"./StdToml.sol\";\nimport {StdUtils} from \"./StdUtils.sol\";\nimport {Vm} from \"./Vm.sol\";\n\n// 📦 BOILERPLATE\nimport {TestBase} from \"./Base.sol\";\n\n// ⭐️ TEST\nabstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {\n // Note: IS_TEST() must return true.\n bool public IS_TEST = true;\n}\n" + }, + "forge-std/Vm.sol": { + "content": "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\n/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may\n/// result in Script simulations differing from on-chain execution. It is recommended to only use\n/// these cheats in scripts.\ninterface VmSafe {\n /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.\n enum CallerMode {\n // No caller modification is currently active.\n None,\n // A one time broadcast triggered by a `vm.broadcast()` call is currently active.\n Broadcast,\n // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.\n RecurrentBroadcast,\n // A one time prank triggered by a `vm.prank()` call is currently active.\n Prank,\n // A recurrent prank triggered by a `vm.startPrank()` call is currently active.\n RecurrentPrank\n }\n\n /// The kind of account access that occurred.\n enum AccountAccessKind {\n // The account was called.\n Call,\n // The account was called via delegatecall.\n DelegateCall,\n // The account was called via callcode.\n CallCode,\n // The account was called via staticcall.\n StaticCall,\n // The account was created.\n Create,\n // The account was selfdestructed.\n SelfDestruct,\n // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).\n Resume,\n // The account's balance was read.\n Balance,\n // The account's codesize was read.\n Extcodesize,\n // The account's codehash was read.\n Extcodehash,\n // The account's code was copied.\n Extcodecopy\n }\n\n /// Forge execution contexts.\n enum ForgeContext {\n // Test group execution context (test, coverage or snapshot).\n TestGroup,\n // `forge test` execution context.\n Test,\n // `forge coverage` execution context.\n Coverage,\n // `forge snapshot` execution context.\n Snapshot,\n // Script group execution context (dry run, broadcast or resume).\n ScriptGroup,\n // `forge script` execution context.\n ScriptDryRun,\n // `forge script --broadcast` execution context.\n ScriptBroadcast,\n // `forge script --resume` execution context.\n ScriptResume,\n // Unknown `forge` execution context.\n Unknown\n }\n\n /// An Ethereum log. Returned by `getRecordedLogs`.\n struct Log {\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The address of the log's emitter.\n address emitter;\n }\n\n /// An RPC URL and its alias. Returned by `rpcUrlStructs`.\n struct Rpc {\n // The alias of the RPC URL.\n string key;\n // The RPC URL.\n string url;\n }\n\n /// An RPC log object. Returned by `eth_getLogs`.\n struct EthGetLogs {\n // The address of the log's emitter.\n address emitter;\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The block hash.\n bytes32 blockHash;\n // The block number.\n uint64 blockNumber;\n // The transaction hash.\n bytes32 transactionHash;\n // The transaction index in the block.\n uint64 transactionIndex;\n // The log index.\n uint256 logIndex;\n // Whether the log was removed.\n bool removed;\n }\n\n /// A single entry in a directory listing. Returned by `readDir`.\n struct DirEntry {\n // The error message, if any.\n string errorMessage;\n // The path of the entry.\n string path;\n // The depth of the entry.\n uint64 depth;\n // Whether the entry is a directory.\n bool isDir;\n // Whether the entry is a symlink.\n bool isSymlink;\n }\n\n /// Metadata information about a file.\n /// This structure is returned from the `fsMetadata` function and represents known\n /// metadata about a file such as its permissions, size, modification\n /// times, etc.\n struct FsMetadata {\n // True if this metadata is for a directory.\n bool isDir;\n // True if this metadata is for a symlink.\n bool isSymlink;\n // The size of the file, in bytes, this metadata is for.\n uint256 length;\n // True if this metadata is for a readonly (unwritable) file.\n bool readOnly;\n // The last modification time listed in this metadata.\n uint256 modified;\n // The last access time of this metadata.\n uint256 accessed;\n // The creation time listed in this metadata.\n uint256 created;\n }\n\n /// A wallet with a public and private key.\n struct Wallet {\n // The wallet's address.\n address addr;\n // The wallet's public key `X`.\n uint256 publicKeyX;\n // The wallet's public key `Y`.\n uint256 publicKeyY;\n // The wallet's private key.\n uint256 privateKey;\n }\n\n /// The result of a `tryFfi` call.\n struct FfiResult {\n // The exit code of the call.\n int32 exitCode;\n // The optionally hex-decoded `stdout` data.\n bytes stdout;\n // The `stderr` data.\n bytes stderr;\n }\n\n /// Information on the chain and fork.\n struct ChainInfo {\n // The fork identifier. Set to zero if no fork is active.\n uint256 forkId;\n // The chain ID of the current fork.\n uint256 chainId;\n }\n\n /// The result of a `stopAndReturnStateDiff` call.\n struct AccountAccess {\n // The chain and fork the access occurred.\n ChainInfo chainInfo;\n // The kind of account access that determines what the account is.\n // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.\n // If kind is Create, then the account is the newly created account.\n // If kind is SelfDestruct, then the account is the selfdestruct recipient.\n // If kind is a Resume, then account represents a account context that has resumed.\n AccountAccessKind kind;\n // The account that was accessed.\n // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.\n address account;\n // What accessed the account.\n address accessor;\n // If the account was initialized or empty prior to the access.\n // An account is considered initialized if it has code, a\n // non-zero nonce, or a non-zero balance.\n bool initialized;\n // The previous balance of the accessed account.\n uint256 oldBalance;\n // The potential new balance of the accessed account.\n // That is, all balance changes are recorded here, even if reverts occurred.\n uint256 newBalance;\n // Code of the account deployed by CREATE.\n bytes deployedCode;\n // Value passed along with the account access\n uint256 value;\n // Input data provided to the CREATE or CALL\n bytes data;\n // If this access reverted in either the current or parent context.\n bool reverted;\n // An ordered list of storage accesses made during an account access operation.\n StorageAccess[] storageAccesses;\n // Call depth traversed during the recording of state differences\n uint64 depth;\n }\n\n /// The storage accessed during an `AccountAccess`.\n struct StorageAccess {\n // The account whose storage was accessed.\n address account;\n // The slot that was accessed.\n bytes32 slot;\n // If the access was a write.\n bool isWrite;\n // The previous value of the slot.\n bytes32 previousValue;\n // The new value of the slot.\n bytes32 newValue;\n // If the access was reverted.\n bool reverted;\n }\n\n /// Gas used. Returned by `lastCallGas`.\n struct Gas {\n // The gas limit of the call.\n uint64 gasLimit;\n // The total gas used.\n uint64 gasTotalUsed;\n // DEPRECATED: The amount of gas used for memory expansion. Ref: \n uint64 gasMemoryUsed;\n // The amount of gas refunded.\n int64 gasRefunded;\n // The amount of gas remaining.\n uint64 gasRemaining;\n }\n\n // ======== Crypto ========\n\n /// Derives a private key from the name, labels the account with that name, and returns the wallet.\n function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key and returns the wallet.\n function createWallet(uint256 privateKey) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.\n function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derives secp256r1 public key from the provided `privateKey`.\n function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);\n\n /// Adds a private key to the local forge wallet and returns the address.\n function rememberKey(uint256 privateKey) external returns (address keyAddr);\n\n /// Signs data with a `Wallet`.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// Raises error if none of the signers passed into the script have provided address.\n function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256r1 curve.\n function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);\n\n /// Signs data with a `Wallet`.\n function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Raises error if none of the signers passed into the script have provided address.\n function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n // ======== Environment ========\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and returns true if it exists, else returns false.\n function envExists(string calldata name) external view returns (bool result);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bool defaultValue) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)\n external\n view\n returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)\n external\n view\n returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)\n external\n view\n returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)\n external\n view\n returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, address defaultValue) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)\n external\n view\n returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)\n external\n view\n returns (uint256[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)\n external\n view\n returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name, string calldata delim) external view returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);\n\n /// Returns true if `forge` command was executed in given context.\n function isContext(ForgeContext context) external view returns (bool result);\n\n /// Sets environment variables.\n function setEnv(string calldata name, string calldata value) external;\n\n // ======== EVM ========\n\n /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.\n function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);\n\n /// Gets the address for a given private key.\n function addr(uint256 privateKey) external pure returns (address keyAddr);\n\n /// Gets all the logs according to specified filter.\n function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)\n external\n returns (EthGetLogs[] memory logs);\n\n /// Gets the current `block.blobbasefee`.\n /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlobBaseFee() external view returns (uint256 blobBaseFee);\n\n /// Gets the current `block.number`.\n /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockNumber() external view returns (uint256 height);\n\n /// Gets the current `block.timestamp`.\n /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockTimestamp() external view returns (uint256 timestamp);\n\n /// Gets the map key and parent of a mapping at a given slot, for a given address.\n function getMappingKeyAndParentOf(address target, bytes32 elementSlot)\n external\n returns (bool found, bytes32 key, bytes32 parent);\n\n /// Gets the number of elements in the mapping at the given slot, for a given address.\n function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length);\n\n /// Gets the elements at index idx of the mapping at the given slot, for a given address. The\n /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).\n function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value);\n\n /// Gets the nonce of an account.\n function getNonce(address account) external view returns (uint64 nonce);\n\n /// Get the nonce of a `Wallet`.\n function getNonce(Wallet calldata wallet) external returns (uint64 nonce);\n\n /// Gets all the recorded logs.\n function getRecordedLogs() external returns (Log[] memory logs);\n\n /// Gets the gas used in the last call.\n function lastCallGas() external view returns (Gas memory gas);\n\n /// Loads a storage slot from an address.\n function load(address target, bytes32 slot) external view returns (bytes32 data);\n\n /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.\n function pauseGasMetering() external;\n\n /// Records all storage reads and writes.\n function record() external;\n\n /// Record all the transaction logs.\n function recordLogs() external;\n\n /// Reset gas metering (i.e. gas usage is set to gas limit).\n function resetGasMetering() external;\n\n /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.\n function resumeGasMetering() external;\n\n /// Performs an Ethereum JSON-RPC request to the current fork URL.\n function rpc(string calldata method, string calldata params) external returns (bytes memory data);\n\n /// Performs an Ethereum JSON-RPC request to the given endpoint.\n function rpc(string calldata urlOrAlias, string calldata method, string calldata params)\n external\n returns (bytes memory data);\n\n /// Starts recording all map SSTOREs for later retrieval.\n function startMappingRecording() external;\n\n /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,\n /// along with the context of the calls\n function startStateDiffRecording() external;\n\n /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.\n function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);\n\n /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.\n function stopMappingRecording() external;\n\n // ======== Filesystem ========\n\n /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.\n /// `path` is relative to the project root.\n function closeFile(string calldata path) external;\n\n /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.\n /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.\n /// Both `from` and `to` are relative to the project root.\n function copyFile(string calldata from, string calldata to) external returns (uint64 copied);\n\n /// Creates a new, empty directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - User lacks permissions to modify `path`.\n /// - A parent of the given path doesn't exist and `recursive` is false.\n /// - `path` already exists and `recursive` is false.\n /// `path` is relative to the project root.\n function createDir(string calldata path, bool recursive) external;\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function deployCode(string calldata artifactPath) external returns (address deployedAddress);\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n /// Additionally accepts abi-encoded constructor arguments.\n function deployCode(string calldata artifactPath, bytes calldata constructorArgs)\n external\n returns (address deployedAddress);\n\n /// Returns true if the given path points to an existing entity, else returns false.\n function exists(string calldata path) external returns (bool result);\n\n /// Performs a foreign function call via the terminal.\n function ffi(string[] calldata commandInput) external returns (bytes memory result);\n\n /// Given a path, query the file system to get information about a file, directory, etc.\n function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);\n\n /// Gets the artifact path from code (aka. creation code).\n function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);\n\n /// Gets the artifact path from deployed code (aka. runtime code).\n function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);\n\n /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);\n\n /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);\n\n /// Returns true if the path exists on disk and is pointing at a directory, else returns false.\n function isDir(string calldata path) external returns (bool result);\n\n /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.\n function isFile(string calldata path) external returns (bool result);\n\n /// Get the path of the current project root.\n function projectRoot() external view returns (string memory path);\n\n /// Prompts the user for a string value in the terminal.\n function prompt(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for an address in the terminal.\n function promptAddress(string calldata promptText) external returns (address);\n\n /// Prompts the user for a hidden string value in the terminal.\n function promptSecret(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for hidden uint256 in the terminal (usually pk).\n function promptSecretUint(string calldata promptText) external returns (uint256);\n\n /// Prompts the user for uint256 in the terminal.\n function promptUint(string calldata promptText) external returns (uint256);\n\n /// Reads the directory at the given path recursively, up to `maxDepth`.\n /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.\n /// Follows symbolic links if `followLinks` is true.\n function readDir(string calldata path) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth, bool followLinks)\n external\n view\n returns (DirEntry[] memory entries);\n\n /// Reads the entire content of file to string. `path` is relative to the project root.\n function readFile(string calldata path) external view returns (string memory data);\n\n /// Reads the entire content of file as binary. `path` is relative to the project root.\n function readFileBinary(string calldata path) external view returns (bytes memory data);\n\n /// Reads next line of file to string.\n function readLine(string calldata path) external view returns (string memory line);\n\n /// Reads a symbolic link, returning the path that the link points to.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` is not a symbolic link.\n /// - `path` does not exist.\n function readLink(string calldata linkPath) external view returns (string memory targetPath);\n\n /// Removes a directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` doesn't exist.\n /// - `path` isn't a directory.\n /// - User lacks permissions to modify `path`.\n /// - The directory is not empty and `recursive` is false.\n /// `path` is relative to the project root.\n function removeDir(string calldata path, bool recursive) external;\n\n /// Removes a file from the filesystem.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` points to a directory.\n /// - The file doesn't exist.\n /// - The user lacks permissions to remove the file.\n /// `path` is relative to the project root.\n function removeFile(string calldata path) external;\n\n /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.\n function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);\n\n /// Returns the time since unix epoch in milliseconds.\n function unixTime() external returns (uint256 milliseconds);\n\n /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFile(string calldata path, string calldata data) external;\n\n /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFileBinary(string calldata path, bytes calldata data) external;\n\n /// Writes line to file, creating a file if it does not exist.\n /// `path` is relative to the project root.\n function writeLine(string calldata path, string calldata data) external;\n\n // ======== JSON ========\n\n /// Checks if `key` exists in a JSON object.\n function keyExistsJson(string calldata json, string calldata key) external view returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `address`.\n function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);\n\n /// Parses a string of JSON data at `key` and coerces it to `address[]`.\n function parseJsonAddressArray(string calldata json, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool`.\n function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool[]`.\n function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes`.\n function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32`.\n function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.\n function parseJsonBytes32Array(string calldata json, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.\n function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256`.\n function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256[]`.\n function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a JSON object.\n function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of JSON data at `key` and coerces it to `string`.\n function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `string[]`.\n function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256`.\n function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.\n function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a JSON object.\n function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a JSON object at `key`.\n function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)\n external\n returns (string memory json);\n\n /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.\n /// Returns the stringified version of the specific JSON file up to that moment.\n function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(string calldata typeDescription, bytes calldata value)\n external\n pure\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(\n string calldata objectKey,\n string calldata valueKey,\n string calldata typeDescription,\n bytes calldata value\n ) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)\n external\n returns (string memory json);\n\n /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.\n function writeJson(string calldata json, string calldata path) external;\n\n /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = \n /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.\n function writeJson(string calldata json, string calldata path, string calldata valueKey) external;\n\n /// Checks if `key` exists in a JSON object\n /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.\n function keyExists(string calldata json, string calldata key) external view returns (bool);\n\n // ======== Scripting ========\n\n /// Takes a signed transaction and broadcasts it to the network.\n function broadcastRawTransaction(bytes calldata data) external;\n\n /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function broadcast() external;\n\n /// Has the next call (at this call depth only) create a transaction with the address provided\n /// as the sender that can later be signed and sent onchain.\n function broadcast(address signer) external;\n\n /// Has the next call (at this call depth only) create a transaction with the private key\n /// provided as the sender that can later be signed and sent onchain.\n function broadcast(uint256 privateKey) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function startBroadcast() external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the address\n /// provided that can later be signed and sent onchain.\n function startBroadcast(address signer) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the private key\n /// provided that can later be signed and sent onchain.\n function startBroadcast(uint256 privateKey) external;\n\n /// Stops collecting onchain transactions.\n function stopBroadcast() external;\n\n // ======== String ========\n\n /// Returns the index of the first occurrence of a `key` in an `input` string.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.\n /// Returns 0 in case of an empty `key`.\n function indexOf(string calldata input, string calldata key) external pure returns (uint256);\n\n /// Parses the given `string` into an `address`.\n function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);\n\n /// Parses the given `string` into a `bool`.\n function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);\n\n /// Parses the given `string` into `bytes`.\n function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);\n\n /// Parses the given `string` into a `bytes32`.\n function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);\n\n /// Parses the given `string` into a `int256`.\n function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);\n\n /// Parses the given `string` into a `uint256`.\n function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);\n\n /// Replaces occurrences of `from` in the given `string` with `to`.\n function replace(string calldata input, string calldata from, string calldata to)\n external\n pure\n returns (string memory output);\n\n /// Splits the given `string` into an array of strings divided by the `delimiter`.\n function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);\n\n /// Converts the given `string` value to Lowercase.\n function toLowercase(string calldata input) external pure returns (string memory output);\n\n /// Converts the given value to a `string`.\n function toString(address value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes calldata value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes32 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bool value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(uint256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(int256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given `string` value to Uppercase.\n function toUppercase(string calldata input) external pure returns (string memory output);\n\n /// Trims leading and trailing whitespace from the given `string` value.\n function trim(string calldata input) external pure returns (string memory output);\n\n // ======== Testing ========\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n int256 left,\n int256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are equal.\n function assertEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are equal.\n function assertEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are equal and includes error message into revert string on failure.\n function assertEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are equal.\n function assertEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are equal.\n function assertEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256 values are equal.\n function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are equal.\n function assertEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal.\n function assertEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are equal.\n function assertEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.\n function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are equal.\n function assertEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.\n function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal.\n function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal.\n function assertEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are equal.\n function assertEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are equal and includes error message into revert string on failure.\n function assertEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are equal.\n function assertEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is false.\n function assertFalse(bool condition) external pure;\n\n /// Asserts that the given condition is false and includes error message into revert string on failure.\n function assertFalse(bool condition, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n function assertGe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n function assertGe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n function assertGt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n function assertGt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n function assertLe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n function assertLe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n function assertLt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n function assertLt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are not equal.\n function assertNotEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are not equal.\n function assertNotEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are not equal.\n function assertNotEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal.\n function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal.\n function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal.\n function assertNotEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal.\n function assertNotEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are not equal.\n function assertNotEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal.\n function assertNotEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are not equal.\n function assertNotEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are not equal.\n function assertNotEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is true.\n function assertTrue(bool condition) external pure;\n\n /// Asserts that the given condition is true and includes error message into revert string on failure.\n function assertTrue(bool condition, string calldata error) external pure;\n\n /// If the condition is false, discard this run's fuzz inputs and generate new ones.\n function assume(bool condition) external pure;\n\n /// Discard this run's fuzz inputs and generate new ones if next call reverted.\n function assumeNoRevert() external pure;\n\n /// Writes a breakpoint to jump to in the debugger.\n function breakpoint(string calldata char) external;\n\n /// Writes a conditional breakpoint to jump to in the debugger.\n function breakpoint(string calldata char, bool value) external;\n\n /// Returns the Foundry version.\n /// Format: ++\n /// Sample output: 0.2.0+faa94c384+202407110019\n /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.\n /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000)\n /// to compare timestamps while ignoring minor time differences.\n function getFoundryVersion() external view returns (string memory version);\n\n /// Returns the RPC url for the given alias.\n function rpcUrl(string calldata rpcAlias) external view returns (string memory json);\n\n /// Returns all rpc urls and their aliases as structs.\n function rpcUrlStructs() external view returns (Rpc[] memory urls);\n\n /// Returns all rpc urls and their aliases `[alias, url][]`.\n function rpcUrls() external view returns (string[2][] memory urls);\n\n /// Suspends execution of the main thread for `duration` milliseconds.\n function sleep(uint256 duration) external;\n\n // ======== Toml ========\n\n /// Checks if `key` exists in a TOML table.\n function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `address`.\n function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);\n\n /// Parses a string of TOML data at `key` and coerces it to `address[]`.\n function parseTomlAddressArray(string calldata toml, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool`.\n function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool[]`.\n function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes`.\n function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32`.\n function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.\n function parseTomlBytes32Array(string calldata toml, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.\n function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256`.\n function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256[]`.\n function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a TOML table.\n function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of TOML data at `key` and coerces it to `string`.\n function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `string[]`.\n function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256`.\n function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.\n function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a TOML table.\n function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a TOML table at `key`.\n function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.\n function writeToml(string calldata json, string calldata path) external;\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = \n /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.\n function writeToml(string calldata json, string calldata path, string calldata valueKey) external;\n\n // ======== Utilities ========\n\n /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer)\n external\n pure\n returns (address);\n\n /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);\n\n /// Compute the address a contract will be deployed at for a given deployer address and nonce.\n function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);\n\n /// Utility cheatcode to copy storage of `from` contract to another `to` contract.\n function copyStorage(address from, address to) external;\n\n /// Returns ENS namehash for provided string.\n function ensNamehash(string calldata name) external pure returns (bytes32);\n\n /// Gets the label for the specified address.\n function getLabel(address account) external view returns (string memory currentLabel);\n\n /// Labels an address in call traces.\n function label(address account, string calldata newLabel) external;\n\n /// Pauses collection of call traces. Useful in cases when you want to skip tracing of\n /// complex calls which are not useful for debugging.\n function pauseTracing() external view;\n\n /// Returns a random `address`.\n function randomAddress() external returns (address);\n\n /// Returns an random `bool`.\n function randomBool() external view returns (bool);\n\n /// Returns an random byte array value of the given length.\n function randomBytes(uint256 len) external view returns (bytes memory);\n\n /// Returns an random `int256` value.\n function randomInt() external view returns (int256);\n\n /// Returns an random `int256` value of given bits.\n function randomInt(uint256 bits) external view returns (int256);\n\n /// Returns a random uint256 value.\n function randomUint() external returns (uint256);\n\n /// Returns random uint256 value between the provided range (=min..=max).\n function randomUint(uint256 min, uint256 max) external returns (uint256);\n\n /// Returns an random `uint256` value of given bits.\n function randomUint(uint256 bits) external view returns (uint256);\n\n /// Unpauses collection of call traces.\n function resumeTracing() external view;\n\n /// Utility cheatcode to set arbitrary storage for given target address.\n function setArbitraryStorage(address target) external;\n\n /// Encodes a `bytes` value to a base64url string.\n function toBase64URL(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64url string.\n function toBase64URL(string calldata data) external pure returns (string memory);\n\n /// Encodes a `bytes` value to a base64 string.\n function toBase64(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64 string.\n function toBase64(string calldata data) external pure returns (string memory);\n}\n\n/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used\n/// in tests, but it is not recommended to use these cheats in scripts.\ninterface Vm is VmSafe {\n // ======== EVM ========\n\n /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.\n function activeFork() external view returns (uint256 forkId);\n\n /// In forking mode, explicitly grant the given address cheatcode access.\n function allowCheatcodes(address account) external;\n\n /// Sets `block.blobbasefee`\n function blobBaseFee(uint256 newBlobBaseFee) external;\n\n /// Sets the blobhashes in the transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function blobhashes(bytes32[] calldata hashes) external;\n\n /// Sets `block.chainid`.\n function chainId(uint256 newChainId) external;\n\n /// Clears all mocked calls.\n function clearMockedCalls() external;\n\n /// Sets `block.coinbase`.\n function coinbase(address newCoinbase) external;\n\n /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Sets an address' balance.\n function deal(address account, uint256 newBalance) external;\n\n /// Removes the snapshot with the given ID created by `snapshot`.\n /// Takes the snapshot ID to delete.\n /// Returns `true` if the snapshot was successfully deleted.\n /// Returns `false` if the snapshot does not exist.\n function deleteSnapshot(uint256 snapshotId) external returns (bool success);\n\n /// Removes _all_ snapshots previously created by `snapshot`.\n function deleteSnapshots() external;\n\n /// Sets `block.difficulty`.\n /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.\n /// Reverts if used on unsupported EVM versions.\n function difficulty(uint256 newDifficulty) external;\n\n /// Dump a genesis JSON file's `allocs` to disk.\n function dumpState(string calldata pathToStateJson) external;\n\n /// Sets an address' code.\n function etch(address target, bytes calldata newRuntimeBytecode) external;\n\n /// Sets `block.basefee`.\n function fee(uint256 newBasefee) external;\n\n /// Gets the blockhashes from the current transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function getBlobhashes() external view returns (bytes32[] memory hashes);\n\n /// Returns true if the account is marked as persistent.\n function isPersistent(address account) external view returns (bool persistent);\n\n /// Load a genesis JSON file's `allocs` into the in-memory revm state.\n function loadAllocs(string calldata pathToAllocsJson) external;\n\n /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup\n /// Meaning, changes made to the state of this account will be kept when switching forks.\n function makePersistent(address account) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1, address account2) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address[] calldata accounts) external;\n\n /// Reverts a call to an address with specified revert data.\n function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;\n\n /// Reverts a call to an address with a specific `msg.value`, with specified revert data.\n function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)\n external;\n\n /// Mocks a call to an address, returning specified data.\n /// Calldata can either be strict or a partial match, e.g. if you only\n /// pass a Solidity selector to the expected calldata, then the entire Solidity\n /// function will be mocked.\n function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;\n\n /// Mocks a call to an address with a specific `msg.value`, returning specified data.\n /// Calldata match takes precedence over `msg.value` in case of ambiguity.\n function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;\n\n /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls\n /// `target` with the same calldata. This functionality is similar to a delegate call made to\n /// `target` contract from `callee`.\n /// Can be used to substitute a call to a function with another implementation that captures\n /// the primary logic of the original function but is easier to reason about.\n /// If calldata is not a strict match then partial match by selector is attempted.\n function mockFunction(address callee, address target, bytes calldata data) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address.\n function prank(address msgSender) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.\n function prank(address msgSender, address txOrigin) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(bytes32 newPrevrandao) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(uint256 newPrevrandao) external;\n\n /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.\n function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin);\n\n /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.\n function resetNonce(address account) external;\n\n /// Revert the state of the EVM to a previous snapshot\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted.\n /// Returns `false` if the snapshot does not exist.\n /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`.\n function revertTo(uint256 snapshotId) external returns (bool success);\n\n /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted and deleted.\n /// Returns `false` if the snapshot does not exist.\n function revertToAndDelete(uint256 snapshotId) external returns (bool success);\n\n /// Revokes persistent status from the address, previously added via `makePersistent`.\n function revokePersistent(address account) external;\n\n /// See `revokePersistent(address)`.\n function revokePersistent(address[] calldata accounts) external;\n\n /// Sets `block.height`.\n function roll(uint256 newHeight) external;\n\n /// Updates the currently active fork to given block number\n /// This is similar to `roll` but for the currently active fork.\n function rollFork(uint256 blockNumber) external;\n\n /// Updates the currently active fork to given transaction. This will `rollFork` with the number\n /// of the block the transaction was mined in and replays all transaction mined before it in the block.\n function rollFork(bytes32 txHash) external;\n\n /// Updates the given fork to given block number.\n function rollFork(uint256 forkId, uint256 blockNumber) external;\n\n /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.\n function rollFork(uint256 forkId, bytes32 txHash) external;\n\n /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.\n function selectFork(uint256 forkId) external;\n\n /// Set blockhash for the current block.\n /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.\n function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;\n\n /// Sets the nonce of an account. Must be higher than the current nonce of the account.\n function setNonce(address account, uint64 newNonce) external;\n\n /// Sets the nonce of an account to an arbitrary value.\n function setNonceUnsafe(address account, uint64 newNonce) external;\n\n /// Snapshot the current state of the evm.\n /// Returns the ID of the snapshot that was created.\n /// To revert a snapshot use `revertTo`.\n function snapshot() external returns (uint256 snapshotId);\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.\n function startPrank(address msgSender) external;\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.\n function startPrank(address msgSender, address txOrigin) external;\n\n /// Resets subsequent calls' `msg.sender` to be `address(this)`.\n function stopPrank() external;\n\n /// Stores a value to an address' storage slot.\n function store(address target, bytes32 slot, bytes32 value) external;\n\n /// Fetches the given transaction from the active fork and executes it on the current state.\n function transact(bytes32 txHash) external;\n\n /// Fetches the given transaction from the given fork and executes it on the current state.\n function transact(uint256 forkId, bytes32 txHash) external;\n\n /// Sets `tx.gasprice`.\n function txGasPrice(uint256 newGasPrice) external;\n\n /// Sets `block.timestamp`.\n function warp(uint256 newTimestamp) external;\n\n // ======== Testing ========\n\n /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;\n\n /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)\n external;\n\n /// Expects a call to an address with the specified calldata.\n /// Calldata can either be a strict or a partial match.\n function expectCall(address callee, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified calldata.\n function expectCall(address callee, bytes calldata data, uint64 count) external;\n\n /// Expects a call to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;\n\n /// Expect a call to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;\n\n /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)\n external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(\n bool checkTopic0,\n bool checkTopic1,\n bool checkTopic2,\n bool checkTopic3,\n bool checkData,\n address emitter\n ) external;\n\n /// Prepare an expected anonymous log with all topic and data checks enabled.\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmitAnonymous() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(address emitter) external;\n\n /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)\n external;\n\n /// Prepare an expected log with all topic and data checks enabled.\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmit() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(address emitter) external;\n\n /// Expects an error on next call that starts with the revert data.\n function expectPartialRevert(bytes4 revertData) external;\n\n /// Expects an error on next call to reverter address, that starts with the revert data.\n function expectPartialRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error on next call with any revert data.\n function expectRevert() external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes4 revertData) external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes calldata revertData) external;\n\n /// Expects an error with any revert data on next call to reverter address.\n function expectRevert(address reverter) external;\n\n /// Expects an error from reverter address on next call, with any revert data.\n function expectRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error from reverter address on next call, that exactly matches the revert data.\n function expectRevert(bytes calldata revertData, address reverter) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other\n /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.\n function expectSafeMemory(uint64 min, uint64 max) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.\n /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges\n /// to the set.\n function expectSafeMemoryCall(uint64 min, uint64 max) external;\n\n /// Marks a test as skipped. Must be called at the top level of a test.\n function skip(bool skipTest) external;\n\n /// Marks a test as skipped with a reason. Must be called at the top level of a test.\n function skip(bool skipTest, string calldata reason) external;\n\n /// Stops all safe memory expectation in the current subcontext.\n function stopExpectSafeMemory() external;\n}\n" + }, + "lib/ERC1155Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport 'lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol';\n\ncontract ERC1155Mintable is ERC1155(\"//uri\"), ERC1155Burnable {\n function mint(address to, uint256 id, uint256 amount) public {\n _mint(to, id, amount, bytes(\"\"));\n }\n}\n" + }, + "lib/ERC20Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\n\ncontract ERC20Mintable is ERC20(\"n\", \"s\") {\n function mint(address to, uint256 amount) public {\n _mint(to, amount);\n }\n}\n" + }, + "lib/ERC721Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol\";\n\ncontract ERC721Mintable is ERC721(\"n\", \"s\") {\n function mint(address to, uint256 tokenId) public {\n _mint(to, tokenId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() external {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC1155.sol\";\nimport \"./IERC1155Receiver.sol\";\nimport \"./extensions/IERC1155MetadataURI.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n *\n * _Available since v3.1._\n */\ncontract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {\n using Address for address;\n\n // Mapping from token ID to account balances\n mapping(uint256 => mapping(address => uint256)) private _balances;\n\n // Mapping from account to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256) public view virtual override returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {\n require(account != address(0), \"ERC1155: address zero is not a valid owner\");\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] memory accounts, uint256[] memory ids)\n public\n view\n virtual\n override\n returns (uint256[] memory)\n {\n require(accounts.length == ids.length, \"ERC1155: accounts and ids length mismatch\");\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts[i], ids[i]);\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeTransferFrom(from, to, id, amount, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeBatchTransferFrom(from, to, ids, amounts, data);\n }\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n\n emit TransferSingle(operator, from, to, id, amount);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n }\n\n emit TransferBatch(operator, from, to, ids, amounts);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the amounts in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _balances[id][to] += amount;\n emit TransferSingle(operator, address(0), to, id, amount);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; i++) {\n _balances[ids[i]][to] += amounts[i];\n }\n\n emit TransferBatch(operator, address(0), to, ids, amounts);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);\n }\n\n /**\n * @dev Destroys `amount` tokens of token type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `amount` tokens of token type `id`.\n */\n function _burn(\n address from,\n uint256 id,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n\n emit TransferSingle(operator, from, address(0), id, amount);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n */\n function _burnBatch(\n address from,\n uint256[] memory ids,\n uint256[] memory amounts\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n for (uint256 i = 0; i < ids.length; i++) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n }\n\n emit TransferBatch(operator, from, address(0), ids, amounts);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC1155: setting approval status for self\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `ids` and `amounts` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `id` and `amount` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {\n uint256[] memory array = new uint256[](1);\n array[0] = element;\n\n return array;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1155.sol\";\n\n/**\n * @dev Extension of {ERC1155} that allows token holders to destroy both their\n * own tokens and those that they have been approved to use.\n *\n * _Available since v3.1._\n */\nabstract contract ERC1155Burnable is ERC1155 {\n function burn(\n address account,\n uint256 id,\n uint256 value\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burn(account, id, value);\n }\n\n function burnBatch(\n address account,\n uint256[] memory ids,\n uint256[] memory values\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burnBatch(account, ids, values);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)\n external\n view\n returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes calldata data\n ) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) external;\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC1155Receiver.sol\";\n\n/**\n * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.\n *\n * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be\n * stuck.\n *\n * @dev _Available since v3.1._\n */\ncontract ERC1155Holder is ERC1155Receiver {\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155Receiver.sol\";\nimport \"../../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\nabstract contract ERC1155Receiver is ERC165, IERC1155Receiver {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.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 * For a generic mechanism see {ERC20PresetMinterPauser}.\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 * 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 *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => 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 * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\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 override 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 override 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 value {ERC20} uses, unless this function is\n * 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 override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override 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 `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` 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 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\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 `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `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 * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` 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 function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\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" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\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 amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` 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(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256, /* firstTokenId */\n uint256 batchSize\n ) internal virtual {\n if (batchSize > 1) {\n if (from != address(0)) {\n _balances[from] -= batchSize;\n }\n if (to != address(0)) {\n _balances[to] += batchSize;\n }\n }\n }\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Receiver.sol\";\n\n/**\n * @dev Implementation of the {IERC721Receiver} interface.\n *\n * Accepts all token transfers.\n * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.\n */\ncontract ERC721Holder is IERC721Receiver {\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n *\n * Always returns `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "lib/openzeppelin-contracts/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface.\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n // prepare call\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n\n // perform static call\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly {\n success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0x00)\n }\n\n return success && returnSize >= 0x20 && returnValue > 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableMap.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableMap.js.\n\npragma solidity ^0.8.0;\n\nimport \"./EnumerableSet.sol\";\n\n/**\n * @dev Library for managing an enumerable variant of Solidity's\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\n * type.\n *\n * Maps have the following properties:\n *\n * - Entries are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableMap for EnumerableMap.UintToAddressMap;\n *\n * // Declare a set state variable\n * EnumerableMap.UintToAddressMap private myMap;\n * }\n * ```\n *\n * The following map types are supported:\n *\n * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0\n * - `address -> uint256` (`AddressToUintMap`) since v4.6.0\n * - `bytes32 -> bytes32` (`Bytes32ToBytes32Map`) since v4.6.0\n * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0\n * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableMap.\n * ====\n */\nlibrary EnumerableMap {\n using EnumerableSet for EnumerableSet.Bytes32Set;\n\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Map type with\n // bytes32 keys and values.\n // The Map implementation uses private functions, and user-facing\n // implementations (such as Uint256ToAddressMap) are just wrappers around\n // the underlying Map.\n // This means that we can only create new EnumerableMaps for types that fit\n // in bytes32.\n\n struct Bytes32ToBytes32Map {\n // Storage of keys\n EnumerableSet.Bytes32Set _keys;\n mapping(bytes32 => bytes32) _values;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n bytes32 value\n ) internal returns (bool) {\n map._values[key] = value;\n return map._keys.add(key);\n }\n\n /**\n * @dev Removes a key-value pair from a map. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {\n delete map._values[key];\n return map._keys.remove(key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) {\n return map._keys.contains(key);\n }\n\n /**\n * @dev Returns the number of key-value pairs in the map. O(1).\n */\n function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) {\n return map._keys.length();\n }\n\n /**\n * @dev Returns the key-value pair stored at position `index` in the map. O(1).\n *\n * Note that there are no guarantees on the ordering of entries inside the\n * array, and it may change when more entries are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) {\n bytes32 key = map._keys.at(index);\n return (key, map._values[key]);\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) {\n bytes32 value = map._values[key];\n if (value == bytes32(0)) {\n return (contains(map, key), bytes32(0));\n } else {\n return (true, value);\n }\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), \"EnumerableMap: nonexistent key\");\n return value;\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), errorMessage);\n return value;\n }\n\n // UintToUintMap\n\n struct UintToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToUintMap storage map,\n uint256 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToUintMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key)));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToUintMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key), errorMessage));\n }\n\n // UintToAddressMap\n\n struct UintToAddressMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToAddressMap storage map,\n uint256 key,\n address value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToAddressMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), address(uint160(uint256(value))));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, address(uint160(uint256(value))));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToAddressMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage))));\n }\n\n // AddressToUintMap\n\n struct AddressToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n AddressToUintMap storage map,\n address key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(AddressToUintMap storage map, address key) internal returns (bool) {\n return remove(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(AddressToUintMap storage map, address key) internal view returns (bool) {\n return contains(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(AddressToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (address(uint160(uint256(key))), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key))));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(AddressToUintMap storage map, address key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n AddressToUintMap storage map,\n address key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage));\n }\n\n // Bytes32ToUintMap\n\n struct Bytes32ToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToUintMap storage map,\n bytes32 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, key, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) {\n return remove(map._inner, key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) {\n return contains(map._inner, key);\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(Bytes32ToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (key, uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, key);\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) {\n return uint256(get(map._inner, key));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToUintMap storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, key, errorMessage));\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableSet for EnumerableSet.AddressSet;\n *\n * // Declare a set state variable\n * EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSet {\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Set type with\n // bytes32 values.\n // The Set implementation uses private functions, and user-facing\n // implementations (such as AddressSet) are just wrappers around the\n // underlying Set.\n // This means that we can only create new EnumerableSets for types that fit\n // in bytes32.\n\n struct Set {\n // Storage of set values\n bytes32[] _values;\n // Position of the value in the `values` array, plus 1 because index 0\n // means a value is not in the set.\n mapping(bytes32 => uint256) _indexes;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function _add(Set storage set, bytes32 value) private returns (bool) {\n if (!_contains(set, value)) {\n set._values.push(value);\n // The value is stored at length-1, but we add 1 to all indexes\n // and use 0 as a sentinel value\n set._indexes[value] = set._values.length;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function _remove(Set storage set, bytes32 value) private returns (bool) {\n // We read and store the value's index to prevent multiple reads from the same storage slot\n uint256 valueIndex = set._indexes[value];\n\n if (valueIndex != 0) {\n // Equivalent to contains(set, value)\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n // the array, and then remove the last element (sometimes called as 'swap and pop').\n // This modifies the order of the array, as noted in {at}.\n\n uint256 toDeleteIndex = valueIndex - 1;\n uint256 lastIndex = set._values.length - 1;\n\n if (lastIndex != toDeleteIndex) {\n bytes32 lastValue = set._values[lastIndex];\n\n // Move the last value to the index where the value to delete is\n set._values[toDeleteIndex] = lastValue;\n // Update the index for the moved value\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\n }\n\n // Delete the slot where the moved value was stored\n set._values.pop();\n\n // Delete the index for the deleted slot\n delete set._indexes[value];\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\n return set._indexes[value] != 0;\n }\n\n /**\n * @dev Returns the number of values on the set. O(1).\n */\n function _length(Set storage set) private view returns (uint256) {\n return set._values.length;\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\n return set._values[index];\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function _values(Set storage set) private view returns (bytes32[] memory) {\n return set._values;\n }\n\n // Bytes32Set\n\n struct Bytes32Set {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _add(set._inner, value);\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _remove(set._inner, value);\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n return _contains(set._inner, value);\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(Bytes32Set storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n return _at(set._inner, index);\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n bytes32[] memory store = _values(set._inner);\n bytes32[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // AddressSet\n\n struct AddressSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(AddressSet storage set, address value) internal returns (bool) {\n return _add(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(AddressSet storage set, address value) internal returns (bool) {\n return _remove(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(AddressSet storage set, address value) internal view returns (bool) {\n return _contains(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(AddressSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\n return address(uint160(uint256(_at(set._inner, index))));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(AddressSet storage set) internal view returns (address[] memory) {\n bytes32[] memory store = _values(set._inner);\n address[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // UintSet\n\n struct UintSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(UintSet storage set, uint256 value) internal returns (bool) {\n return _add(set._inner, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\n return _remove(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n return _contains(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(UintSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n return uint256(_at(set._inner, index));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(UintSet storage set) internal view returns (uint256[] memory) {\n bytes32[] memory store = _values(set._inner);\n uint256[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n}\n" + }, + "lib/solmate/src/tokens/ERC20.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\nabstract contract ERC20 {\n /*//////////////////////////////////////////////////////////////\n EVENTS\n //////////////////////////////////////////////////////////////*/\n\n event Transfer(address indexed from, address indexed to, uint256 amount);\n\n event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string public name;\n\n string public symbol;\n\n uint8 public immutable decimals;\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 public totalSupply;\n\n mapping(address => uint256) public balanceOf;\n\n mapping(address => mapping(address => uint256)) public allowance;\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal immutable INITIAL_CHAIN_ID;\n\n bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n CONSTRUCTOR\n //////////////////////////////////////////////////////////////*/\n\n constructor(\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n\n INITIAL_CHAIN_ID = block.chainid;\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual returns (bool) {\n allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual returns (bool) {\n balanceOf[msg.sender] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual returns (bool) {\n uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;\n\n balanceOf[from] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n // Unchecked because the only math done is incrementing\n // the owner's nonce which cannot realistically overflow.\n unchecked {\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n allowance[recoveredAddress][spender] = value;\n }\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return\n keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(\"1\"),\n block.chainid,\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n totalSupply += amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n balanceOf[from] -= amount;\n\n // Cannot underflow because a user's balance\n // will never be larger than the total supply.\n unchecked {\n totalSupply -= amount;\n }\n\n emit Transfer(from, address(0), amount);\n }\n}\n" + }, + "lib/solmate/src/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Gas optimized reentrancy protection for smart contracts.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)\nabstract contract ReentrancyGuard {\n uint256 private locked = 1;\n\n modifier nonReentrant() virtual {\n require(locked == 1, \"REENTRANCY\");\n\n locked = 2;\n\n _;\n\n locked = 1;\n }\n}\n" + }, + "lib/solmate/src/utils/SafeTransferLib.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20} from \"../tokens/ERC20.sol\";\n\n/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)\n/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.\n/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.\nlibrary SafeTransferLib {\n /*//////////////////////////////////////////////////////////////\n ETH OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferETH(address to, uint256 amount) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Transfer the ETH and store if it succeeded or not.\n success := call(gas(), to, amount, 0, 0, 0, 0)\n }\n\n require(success, \"ETH_TRANSFER_FAILED\");\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferFrom(\n ERC20 token,\n address from,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), from) // Append the \"from\" argument.\n mstore(add(freeMemoryPointer, 36), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 68), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FROM_FAILED\");\n }\n\n function safeTransfer(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FAILED\");\n }\n\n function safeApprove(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"APPROVE_FAILED\");\n }\n}\n" + } + }, + "settings": { + "evmVersion": "paris", + "optimizer": { + "enabled": true, + "mode": "3" + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout" + ], + "": [ + "ast" + ] + } + }, + "detectMissingLibraries": false, + "forceEVMLA": false, + "enableEraVMExtensions": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/deployments/zkSyncSepolia/solcInputs/5ce2fc077c07b62f4a56303c32131ea8.json b/deployments/zkSyncSepolia/solcInputs/5ce2fc077c07b62f4a56303c32131ea8.json new file mode 100644 index 0000000..d20c15a --- /dev/null +++ b/deployments/zkSyncSepolia/solcInputs/5ce2fc077c07b62f4a56303c32131ea8.json @@ -0,0 +1,343 @@ +{ + "language": "Solidity", + "sources": { + "contracts/Rewards/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\n/// @dev Adapted to pragma solidity 0.8 from https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/FullMath.sol\nlibrary FullMath {\n /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n function mulDiv(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = a * b\n // Compute the product mod 2**256 and mod 2**256 - 1\n // then use the Chinese Remainder Theorem to reconstruct\n // the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2**256 + prod0\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(a, b, not(0))\n prod0 := mul(a, b)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division\n if (prod1 == 0) {\n require(denominator > 0);\n assembly {\n result := div(prod0, denominator)\n }\n return result;\n }\n\n // Make sure the result is less than 2**256.\n // Also prevents denominator == 0\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0]\n // Compute remainder using mulmod\n uint256 remainder;\n assembly {\n remainder := mulmod(a, b, denominator)\n }\n // Subtract 256 bit number from 512 bit number\n assembly {\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator\n // Compute largest power of two divisor of denominator.\n // Always >= 1.\n uint256 twos = (0 - denominator) & denominator;\n // Divide denominator by power of two\n assembly {\n denominator := div(denominator, twos)\n }\n\n // Divide [prod1 prod0] by the factors of two\n assembly {\n prod0 := div(prod0, twos)\n }\n // Shift in bits from prod1 into prod0. For this we need\n // to flip `twos` such that it is 2**256 / twos.\n // If twos is zero, then it becomes one\n assembly {\n twos := add(div(sub(0, twos), twos), 1)\n }\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2**256\n // Now that denominator is an odd number, it has an inverse\n // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n // Compute the inverse by starting with a seed that is correct\n // correct for four bits. That is, denominator * inv = 1 mod 2**4\n uint256 inv = (3 * denominator) ^ 2;\n // Now use Newton-Raphson iteration to improve the precision.\n // Thanks to Hensel's lifting lemma, this also works in modular\n // arithmetic, doubling the correct bits in each step.\n inv *= 2 - denominator * inv; // inverse mod 2**8\n inv *= 2 - denominator * inv; // inverse mod 2**16\n inv *= 2 - denominator * inv; // inverse mod 2**32\n inv *= 2 - denominator * inv; // inverse mod 2**64\n inv *= 2 - denominator * inv; // inverse mod 2**128\n inv *= 2 - denominator * inv; // inverse mod 2**256\n\n // Because the division is now exact we can divide by multiplying\n // with the modular inverse of denominator. This will give us the\n // correct result modulo 2**256. Since the precoditions guarantee\n // that the outcome is less than 2**256, this is the final result.\n // We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inv;\n return result;\n }\n }\n\n /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n function mulDivRoundingUp(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n result = mulDiv(a, b, denominator);\n if (mulmod(a, b, denominator) > 0) {\n require(result < type(uint256).max);\n result++;\n }\n }\n}" + }, + "contracts/Rewards/libraries/PackedUint144.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.0;\n\nlibrary PackedUint144 {\n\n uint256 private constant MAX_UINT24 = type(uint24).max;\n uint256 private constant MAX_UINT48 = type(uint48).max;\n uint256 private constant MAX_UINT72 = type(uint72).max;\n uint256 private constant MAX_UINT96 = type(uint96).max;\n uint256 private constant MAX_UINT120 = type(uint120).max;\n uint256 private constant MAX_UINT144 = type(uint144).max;\n\n error NonZero();\n error FullyPacked();\n\n function pushUint24Value(uint144 packedUint144, uint24 value) internal pure returns (uint144) {\n if (value == 0) revert NonZero(); // Not strictly necessairy for our use-case since value (incentiveId) can't be 0.\n if (packedUint144 > MAX_UINT120) revert FullyPacked();\n return (packedUint144 << 24) + value;\n }\n\n function countStoredUint24Values(uint144 packedUint144) internal pure returns (uint256) {\n if (packedUint144 == 0) return 0;\n if (packedUint144 <= MAX_UINT24) return 1;\n if (packedUint144 <= MAX_UINT48) return 2;\n if (packedUint144 <= MAX_UINT72) return 3;\n if (packedUint144 <= MAX_UINT96) return 4;\n if (packedUint144 <= MAX_UINT120) return 5;\n return 6;\n }\n\n function getUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint24) {\n return uint24(packedUint144 >> (i * 24));\n }\n\n function removeUint24ValueAt(uint144 packedUint144, uint256 i) internal pure returns (uint144) {\n if (i > 5) return packedUint144;\n uint256 rightMask = MAX_UINT144 >> (24 * (6 - i));\n uint256 leftMask = (~rightMask) << 24;\n uint256 left = packedUint144 & leftMask;\n uint256 right = packedUint144 & rightMask;\n return uint144((left >> 24) | right);\n }\n\n}\n" + }, + "contracts/Rewards/StakingContractMainnet.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity >=0.8.11;\n\nimport \"lib/solmate/src/utils/SafeTransferLib.sol\";\nimport \"lib/solmate/src/utils/ReentrancyGuard.sol\";\nimport \"./libraries/PackedUint144.sol\";\nimport \"./libraries/FullMath.sol\";\n\n/// @title Fork of https://github.com/sushiswap/StakingContract\n/// @notice Permissionless staking contract that allows any number of incentives to be running for any token (erc20).\n/// Incentives can be created by anyone, the total reward amount must be sent at creation.\n/// Incentives can be updated (change reward rate / duration).\n/// Users can deposit their assets into the contract and then subscribe to any of the available incentives, up to 6 per token.\ncontract StakingContractMainnet is ReentrancyGuard {\n\n using SafeTransferLib for ERC20;\n using PackedUint144 for uint144;\n\n struct Incentive {\n address creator; // 1st slot\n address token; // 2nd slot\n address rewardToken; // 3rd slot\n uint32 endTime; // 3rd slot\n uint256 rewardPerLiquidity; // 4th slot\n uint32 lastRewardTime; // 5th slot\n uint112 rewardRemaining; // 5th slot\n uint112 liquidityStaked; // 5th slot\n }\n\n uint256 public incentiveCount;\n\n // Starts with 1. Zero is an invalid incentive.\n mapping(uint256 => Incentive) public incentives;\n\n /// @dev rewardPerLiquidityLast[user][incentiveId]\n /// @dev Semantic overload: if value is zero user isn't subscribed to the incentive.\n mapping(address => mapping(uint256 => uint256)) public rewardPerLiquidityLast;\n\n /// @dev userStakes[user][stakedToken]\n mapping(address => mapping(address => UserStake)) public userStakes;\n\n // Incentive count won't be greater than type(uint24).max on mainnet.\n // This means we can use uint24 values to identify incentives.\n struct UserStake {\n uint112 liquidity;\n uint144 subscribedIncentiveIds; // Six packed uint24 values.\n }\n\n error InvalidTimeFrame();\n error IncentiveOverflow();\n error AlreadySubscribed();\n error AlreadyUnsubscribed();\n error NotSubscribed();\n error OnlyCreator();\n error NoToken();\n error InvalidInput();\n error BatchError(bytes innerErorr);\n error InsufficientStakedAmount();\n error NotStaked();\n error InvalidIndex();\n\n event IncentiveCreated(address indexed token, address indexed rewardToken, address indexed creator, uint256 id, uint256 amount, uint256 startTime, uint256 endTime);\n event IncentiveUpdated(uint256 indexed id, int256 changeAmount, uint256 newStartTime, uint256 newEndTime);\n event Stake(address indexed token, address indexed user, uint256 amount);\n event Unstake(address indexed token, address indexed user, uint256 amount);\n event Subscribe(uint256 indexed id, address indexed user);\n event Unsubscribe(uint256 indexed id, address indexed user);\n event Claim(uint256 indexed id, address indexed user, uint256 amount);\n\n function createIncentive(\n address token,\n address rewardToken,\n uint112 rewardAmount,\n uint32 startTime,\n uint32 endTime\n ) external nonReentrant returns (uint256 incentiveId) {\n\n if (rewardAmount <= 0) revert InvalidInput();\n\n if (startTime < block.timestamp) startTime = uint32(block.timestamp);\n\n if (startTime >= endTime) revert InvalidTimeFrame();\n\n unchecked { incentiveId = ++incentiveCount; }\n\n if (incentiveId > type(uint24).max) revert IncentiveOverflow();\n\n _saferTransferFrom(rewardToken, rewardAmount);\n\n incentives[incentiveId] = Incentive({\n creator: msg.sender,\n token: token,\n rewardToken: rewardToken,\n lastRewardTime: startTime,\n endTime: endTime,\n rewardRemaining: rewardAmount,\n liquidityStaked: 0,\n // Initial value of rewardPerLiquidity can be arbitrarily set to a non-zero value.\n rewardPerLiquidity: type(uint256).max / 2\n });\n\n emit IncentiveCreated(token, rewardToken, msg.sender, incentiveId, rewardAmount, startTime, endTime);\n\n }\n\n function updateIncentive(\n uint256 incentiveId,\n int112 changeAmount,\n uint32 newStartTime,\n uint32 newEndTime\n ) external nonReentrant {\n\n Incentive storage incentive = incentives[incentiveId];\n\n if (msg.sender != incentive.creator) revert OnlyCreator();\n\n _accrueRewards(incentive);\n\n if (newStartTime != 0) {\n\n if (newStartTime < block.timestamp) newStartTime = uint32(block.timestamp);\n\n incentive.lastRewardTime = newStartTime;\n\n }\n\n if (newEndTime != 0) {\n\n if (newEndTime < block.timestamp) newEndTime = uint32(block.timestamp);\n\n incentive.endTime = newEndTime;\n\n }\n\n if (incentive.lastRewardTime >= incentive.endTime) revert InvalidTimeFrame();\n\n if (changeAmount > 0) {\n\n incentive.rewardRemaining += uint112(changeAmount);\n\n ERC20(incentive.rewardToken).safeTransferFrom(msg.sender, address(this), uint112(changeAmount));\n\n } else if (changeAmount < 0) {\n\n uint112 transferOut = uint112(-changeAmount);\n\n if (transferOut > incentive.rewardRemaining) transferOut = incentive.rewardRemaining;\n\n unchecked { incentive.rewardRemaining -= transferOut; }\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, transferOut);\n\n }\n\n emit IncentiveUpdated(incentiveId, changeAmount, incentive.lastRewardTime, incentive.endTime);\n\n }\n\n function stakeAndSubscribeToIncentives(\n address token,\n uint112 amount,\n uint256[] memory incentiveIds,\n bool transferExistingRewards\n ) external {\n\n stakeToken(token, amount, transferExistingRewards);\n\n uint256 n = incentiveIds.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n subscribeToIncentive(incentiveIds[i]);\n\n }\n\n }\n\n function stakeToken(address token, uint112 amount, bool transferExistingRewards) public nonReentrant {\n\n _saferTransferFrom(token, amount);\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n userStake.liquidity += amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) { // Loop through already subscribed incentives.\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards) {\n\n _claimReward(incentive, incentiveId, previousLiquidity);\n\n } else {\n\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n\n }\n\n incentive.liquidityStaked += amount;\n\n }\n\n emit Stake(token, msg.sender, amount);\n\n }\n\n function unstakeToken(address token, uint112 amount, bool transferExistingRewards) external nonReentrant {\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n uint112 previousLiquidity = userStake.liquidity;\n\n if (amount > previousLiquidity) revert InsufficientStakedAmount();\n\n userStake.liquidity -= amount;\n\n uint256 n = userStake.subscribedIncentiveIds.countStoredUint24Values();\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(i);\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n if (transferExistingRewards || userStake.liquidity == 0) {\n\n _claimReward(incentive, incentiveId, previousLiquidity);\n\n } else {\n\n _saveReward(incentive, incentiveId, previousLiquidity, userStake.liquidity);\n\n }\n\n incentive.liquidityStaked -= amount;\n\n }\n\n ERC20(token).safeTransfer(msg.sender, amount);\n\n emit Unstake(token, msg.sender, amount);\n\n }\n\n function subscribeToIncentive(uint256 incentiveId) public nonReentrant {\n\n if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput();\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] != 0) revert AlreadySubscribed();\n\n Incentive storage incentive = incentives[incentiveId];\n\n if (userStakes[msg.sender][incentive.token].liquidity <= 0) revert NotStaked();\n\n _accrueRewards(incentive);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity;\n\n UserStake storage userStake = userStakes[msg.sender][incentive.token];\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.pushUint24Value(uint24(incentiveId));\n\n incentive.liquidityStaked += userStake.liquidity;\n\n emit Subscribe(incentiveId, msg.sender);\n\n }\n\n /// @param incentiveIndex ∈ [0,5]\n function unsubscribeFromIncentive(address token, uint256 incentiveIndex, bool ignoreRewards) external nonReentrant {\n\n UserStake storage userStake = userStakes[msg.sender][token];\n\n if (incentiveIndex >= userStake.subscribedIncentiveIds.countStoredUint24Values()) revert InvalidIndex();\n\n uint256 incentiveId = userStake.subscribedIncentiveIds.getUint24ValueAt(incentiveIndex);\n\n if (rewardPerLiquidityLast[msg.sender][incentiveId] == 0) revert AlreadyUnsubscribed();\n\n Incentive storage incentive = incentives[incentiveId];\n\n _accrueRewards(incentive);\n\n /// In case there is a token specific issue we can ignore rewards.\n if (!ignoreRewards) _claimReward(incentive, incentiveId, userStake.liquidity);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = 0;\n\n incentive.liquidityStaked -= userStake.liquidity;\n\n userStake.subscribedIncentiveIds = userStake.subscribedIncentiveIds.removeUint24ValueAt(incentiveIndex);\n\n emit Unsubscribe(incentiveId, msg.sender);\n\n }\n\n function accrueRewards(uint256 incentiveId) external nonReentrant {\n\n if (incentiveId > incentiveCount || incentiveId <= 0) revert InvalidInput();\n\n _accrueRewards(incentives[incentiveId]);\n\n }\n\n function claimRewards(uint256[] calldata incentiveIds) external nonReentrant returns (uint256[] memory rewards) {\n\n uint256 n = incentiveIds.length;\n\n rewards = new uint256[](n);\n\n for(uint256 i = 0; i < n; i = _increment(i)) {\n\n if (incentiveIds[i] > incentiveCount || incentiveIds[i] <= 0) revert InvalidInput();\n\n Incentive storage incentive = incentives[incentiveIds[i]];\n\n _accrueRewards(incentive);\n\n rewards[i] = _claimReward(incentive, incentiveIds[i], userStakes[msg.sender][incentive.token].liquidity);\n\n }\n\n }\n\n function _accrueRewards(Incentive storage incentive) internal {\n\n uint256 lastRewardTime = incentive.lastRewardTime;\n\n uint256 endTime = incentive.endTime;\n\n unchecked {\n\n uint256 maxTime = block.timestamp < endTime ? block.timestamp : endTime;\n\n if (incentive.liquidityStaked > 0 && lastRewardTime < maxTime) {\n\n uint256 totalTime = endTime - lastRewardTime;\n\n uint256 passedTime = maxTime - lastRewardTime;\n\n uint256 reward = uint256(incentive.rewardRemaining) * passedTime / totalTime;\n\n // Increments of less than type(uint224).max - overflow is unrealistic.\n incentive.rewardPerLiquidity += reward * type(uint112).max / incentive.liquidityStaked;\n\n incentive.rewardRemaining -= uint112(reward);\n\n incentive.lastRewardTime = uint32(maxTime);\n\n } else if (incentive.liquidityStaked == 0 && lastRewardTime < block.timestamp) {\n\n incentive.lastRewardTime = uint32(maxTime);\n\n }\n\n }\n\n }\n\n function _claimReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity) internal returns (uint256 reward) {\n\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity;\n\n ERC20(incentive.rewardToken).safeTransfer(msg.sender, reward);\n\n emit Claim(incentiveId, msg.sender, reward);\n\n }\n\n // We offset the rewardPerLiquidityLast snapshot so that the current reward is included next time we call _claimReward.\n function _saveReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity, uint112 newLiquidity) internal returns (uint256 reward) {\n\n reward = _calculateReward(incentive, incentiveId, usersLiquidity);\n\n uint256 rewardPerLiquidityDelta = reward * type(uint112).max / newLiquidity;\n\n rewardPerLiquidityLast[msg.sender][incentiveId] = incentive.rewardPerLiquidity - rewardPerLiquidityDelta;\n\n }\n\n function _calculateReward(Incentive storage incentive, uint256 incentiveId, uint112 usersLiquidity) internal view returns (uint256 reward) {\n\n uint256 userRewardPerLiquidtyLast = rewardPerLiquidityLast[msg.sender][incentiveId];\n\n if (userRewardPerLiquidtyLast == 0) revert NotSubscribed();\n\n uint256 rewardPerLiquidityDelta;\n\n unchecked { rewardPerLiquidityDelta = incentive.rewardPerLiquidity - userRewardPerLiquidtyLast; }\n\n reward = FullMath.mulDiv(rewardPerLiquidityDelta, usersLiquidity, type(uint112).max);\n\n }\n\n function _saferTransferFrom(address token, uint256 amount) internal {\n\n if (token.code.length == 0) revert NoToken();\n\n ERC20(token).safeTransferFrom(msg.sender, address(this), amount);\n\n }\n\n function _increment(uint256 i) internal pure returns (uint256) {\n\n unchecked { return i + 1; }\n\n }\n\n function batch(bytes[] calldata datas) external {\n\n uint256 n = datas.length;\n\n for (uint256 i = 0; i < n; i = _increment(i)) {\n\n (bool success, bytes memory result) = address(this).delegatecall(datas[i]);\n\n if (!success) {\n\n revert BatchError(result);\n\n }\n\n }\n\n }\n\n}\n" + }, + "contracts/Rewards/test/Console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n function _sendLogPayload(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE_ADDRESS;\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function log() internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n\n function logInt(int p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(int)\", p0));\n }\n\n function logUint(uint p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function logString(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n }\n\n function log(string memory p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint)\", p0, p1));\n }\n\n function log(uint p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string)\", p0, p1));\n }\n\n function log(uint p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool)\", p0, p1));\n }\n\n function log(uint p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address)\", p0, p1));\n }\n\n function log(string memory p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool)\", p0, p1, p2));\n }\n\n function log(uint p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n }\n\n function log(uint p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, string memory p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, bool p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint p0, address p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, string memory p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, bool p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint p1, address p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal view {\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 view {\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 view {\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, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, string memory p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, bool p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint p2, address p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, uint p3) internal view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal view {\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 view {\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 view {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n\n}" + }, + "contracts/Rewards/test/mock/Token.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"lib/solmate/src/tokens/ERC20.sol\";\n\ncontract Token is ERC20 {\n constructor() ERC20(\"\", \"\", 18) {}\n function mint(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n}\n" + }, + "contracts/Rewards/test/PackedUint144.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport { Test } from \"forge-std/Test.sol\";\nimport \"../libraries/PackedUint144.sol\";\n\ncontract PackedUintTest is Test {\n\n using PackedUint144 for uint144;\n\n function testCountStoredUint24Values(uint24 a) public {\n uint144 packed = 0;\n assertEq(packed.countStoredUint24Values(), 0);\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 1);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 2);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 3);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 4);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 5);\n packed = packed.pushUint24Value(a);\n assertEq(packed.countStoredUint24Values(), 6);\n }\n\n function proveFail_pushUint24Value(uint144 a, uint24 b) public pure {\n while (a.countStoredUint24Values() < 7) {\n a = a.pushUint24Value(b);\n }\n }\n\n function testPushUint24Value(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint24 nil = 0;\n uint144 packed = 0;\n if (a == 0) return;\n packed = packed.pushUint24Value(a);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, nil, a))));\n if (b == 0) return;\n packed = packed.pushUint24Value(b);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, nil, a, b))));\n if (c == 0) return;\n packed = packed.pushUint24Value(c);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, nil, a, b, c))));\n if (d == 0) return;\n packed = packed.pushUint24Value(d);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, nil, a, b, c, d))));\n if (e == 0) return;\n packed = packed.pushUint24Value(e);\n assertEq(packed, uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n if (f == 0) return;\n packed = packed.pushUint24Value(f);\n assertEq(packed, uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n\n function testGetUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n assertEq(packed.getUint24ValueAt(6), uint24(0));\n assertEq(packed.getUint24ValueAt(5), a);\n assertEq(packed.getUint24ValueAt(4), b);\n assertEq(packed.getUint24ValueAt(3), c);\n assertEq(packed.getUint24ValueAt(2), d);\n assertEq(packed.getUint24ValueAt(1), e);\n assertEq(packed.getUint24ValueAt(0), f);\n }\n\n function testRemoveUint24ValueAt(uint24 a, uint24 b, uint24 c, uint24 d, uint24 e, uint24 f) public {\n uint144 packed = uint144(bytes18(abi.encodePacked(a, b, c, d, e, f)));\n uint24 nil = 0;\n assertEq(packed.removeUint24ValueAt(0), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, e))));\n assertEq(packed.removeUint24ValueAt(1), uint144(bytes18(abi.encodePacked(nil, a, b, c, d, f))));\n assertEq(packed.removeUint24ValueAt(2), uint144(bytes18(abi.encodePacked(nil, a, b, c, e, f))));\n assertEq(packed.removeUint24ValueAt(3), uint144(bytes18(abi.encodePacked(nil, a, b, d, e, f))));\n assertEq(packed.removeUint24ValueAt(4), uint144(bytes18(abi.encodePacked(nil, a, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(5), uint144(bytes18(abi.encodePacked(nil, b, c, d, e, f))));\n assertEq(packed.removeUint24ValueAt(6), uint144(bytes18(abi.encodePacked(a, b, c, d, e, f))));\n }\n\n}\n" + }, + "contracts/Rewards/test/StakingContractMainnet.t.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"./TestSetup.sol\";\n\ncontract CreateIncentiveTest is TestSetup {\n\n function testCreateIncentive(\n uint112 amount,\n uint32 startTime,\n uint32 endTime\n ) public {\n _createIncentive(address(tokenA), address(tokenB), amount, startTime, endTime);\n }\n\n function testFailCreateIncentiveInvalidRewardToken(uint32 startTime, uint32 endTime) public {\n _createIncentive(address(tokenA), zeroAddress, 1, startTime, endTime);\n }\n\n function testUpdateIncentive(\n int112 changeAmount0,\n int112 changeAmount1,\n uint32 startTime0,\n uint32 startTime1,\n uint32 endTime0,\n uint32 endTime1\n ) public {\n _updateIncentive(ongoingIncentive, changeAmount0, startTime0, endTime0);\n _updateIncentive(ongoingIncentive, changeAmount1, startTime1, endTime1);\n }\n\n function testStake(uint112 amount0, uint112 amount1) public {\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount0, janeDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _stake(address(tokenA), amount1, johnDoe, true);\n }\n\n function testSubscribe() public {\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribeSeparate(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n }\n\n function testStakeAndSubscribe(uint112 amount) public {\n uint256[] memory idsToSubscribe = new uint256[](2);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n _stakeAndSubscribeToIncentives(address(tokenA), amount, idsToSubscribe, johnDoe, true);\n }\n\n function testAccrue(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n uint256 step = testIncentiveDuration / 2;\n vm.warp(block.timestamp + step);\n _accrueRewards(pastIncentive);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(ongoingIncentive);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n vm.warp(block.timestamp + step);\n _accrueRewards(futureIncentive);\n _accrueRewards(0);\n _accrueRewards(stakingContract.incentiveCount() + 1);\n }\n\n function testClaimRewards0() public {\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(pastIncentive, johnDoe);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n _subscribeToIncentive(futureIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(pastIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(futureIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n _claimReward(ongoingIncentive, johnDoe);\n }\n\n function testClaimRewards1(uint112 amount) public {\n if (amount == 0) return;\n _stake(address(tokenA), amount, johnDoe, true);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n vm.warp(incentive.endTime);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEqInexact(reward, totalReward, 1);\n incentive = _getIncentive(ongoingIncentive);\n assertEq(incentive.rewardRemaining, 0);\n }\n\n function testClaimRewards2(uint96 amount0, uint96 amount1) public {\n if (amount0 == 0 || amount1 == 0) return;\n uint256 maxRatio = 1000000;\n if (amount0 / amount1 > 1000000) return; // to avoid rounding innacuracies for easier testing\n if (amount1 / amount0 > 1000000) return;\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 totalReward = incentive.rewardRemaining;\n _stake(address(tokenA), amount0, johnDoe, true);\n _stake(address(tokenA), amount1, janeDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n uint256 soloReward = _claimReward(ongoingIncentive, johnDoe);\n\n _subscribeToIncentive(ongoingIncentive, janeDoe);\n vm.warp(incentive.endTime);\n\n uint256 reward0 = _claimReward(ongoingIncentive, johnDoe);\n uint256 reward1 = _claimReward(ongoingIncentive, janeDoe);\n\n incentive = _getIncentive(ongoingIncentive);\n uint256 ratio;\n if (amount0 / amount1 > 0) {\n ratio = maxRatio * amount0 / amount1;\n assertEqInexact(maxRatio * reward0 / reward1, ratio, 10);\n }\n if (amount1 / amount0 > 0) {\n ratio = maxRatio * amount1 / amount0;\n assertEqInexact(maxRatio * reward1 / reward0, ratio, 10);\n }\n assertEqInexact(reward0 + reward1 + soloReward, totalReward, 10);\n }\n\n function testUnstakeSaveRewards() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n StakingContractMainnet.Incentive memory incentive = _getIncentive(ongoingIncentive);\n uint256 rewardRemaining = incentive.rewardRemaining;\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp((incentive.lastRewardTime + incentive.endTime) / 2 + 100);\n _stake(address(tokenA), 1, johnDoe, false);\n vm.warp(incentive.endTime);\n _unstake(address(tokenA), 1, johnDoe, false);\n uint256 reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, rewardRemaining);\n reward = _claimReward(ongoingIncentive, johnDoe);\n assertEq(reward, 0);\n }\n\n function testFalseStakeAndSubscribe(uint112 amount) public {\n _stake(address(tokenA), amount, johnDoe, true);\n _subscribeToIncentive(0, johnDoe);\n _subscribeToIncentive(stakingContract.incentiveCount() + 1, johnDoe);\n }\n\n function testStakeInvalidToken() public {\n vm.prank(johnDoe);\n vm.expectRevert(noToken);\n stakingContract.stakeToken(janeDoe, 1, true);\n }\n\n function testRewardRate() public {\n _stake(address(tokenA), 1, johnDoe, true);\n _subscribeToIncentive(ongoingIncentive, johnDoe);\n uint256 oldRate = _rewardRate(ongoingIncentive);\n vm.warp(block.timestamp + testIncentiveDuration / 2);\n stakingContract.accrueRewards(ongoingIncentive);\n uint256 newRate = _rewardRate(ongoingIncentive);\n assertEq(oldRate, newRate);\n }\n\n function testBatch() public {\n bytes[] memory data = new bytes[](2);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n assertEq(liquidity, 1);\n assertEq(subscriptions, ongoingIncentive);\n }\n\n function testBatch2() public {\n bytes[] memory data = new bytes[](3);\n uint256[] memory idsToSubscribe = new uint256[](3);\n idsToSubscribe[0] = pastIncentive;\n idsToSubscribe[1] = ongoingIncentive;\n idsToSubscribe[2] = futureIncentive;\n\n data[0] = abi.encodeCall(stakingContract.stakeAndSubscribeToIncentives, (address(tokenA), 1, idsToSubscribe, true));\n data[1] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 1, false));\n data[2] = abi.encodeCall(stakingContract.unsubscribeFromIncentive, (address(tokenA), 0, false));\n\n vm.prank(johnDoe);\n stakingContract.batch(data);\n (uint112 liquidity, uint144 subscriptions) = stakingContract.userStakes(johnDoe, address(tokenA));\n\n assertEq(liquidity, 1);\n assertEq(subscriptions, pastIncentive);\n }\n\n function testFailedBatchRaisesProperError() public {\n bytes[] memory data = new bytes[](3);\n data[0] = abi.encodeCall(stakingContract.stakeToken, (address(tokenA), 1, true));\n data[1] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n data[2] = abi.encodeCall(stakingContract.subscribeToIncentive, (ongoingIncentive));\n vm.prank(johnDoe);\n vm.expectRevert(alreadySubscribed);\n stakingContract.batch(data);\n }\n\n}\n" + }, + "contracts/Rewards/test/TestSetup.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\nimport \"../StakingContractMainnet.sol\";\nimport \"./mock/Token.sol\";\n\ncontract TestSetup is Test {\n\n address johnDoe = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266;\n address janeDoe = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8;\n address zeroAddress = 0x0000000000000000000000000000000000000000;\n\n uint256 MAX_UINT256 = type(uint256).max;\n uint112 MAX_UINT112 = type(uint112).max;\n uint32 testIncentiveDuration = 2592000;\n uint112 testIncentiveAmount = 1e21;\n\n bytes4 invalidTimeFrame = bytes4(keccak256(\"InvalidTimeFrame()\"));\n bytes4 notSubscribed = bytes4(keccak256(\"NotSubscribed()\"));\n bytes4 alreadySubscribed = bytes4(keccak256(\"AlreadySubscribed()\"));\n bytes4 noToken = bytes4(keccak256(\"NoToken()\"));\n bytes4 invalidInput = bytes4(keccak256(\"InvalidInput()\"));\n bytes4 insufficientStakedAmount = bytes4(keccak256(\"InsufficientStakedAmount\"));\n bytes4 notStaked = bytes4(keccak256(\"NotStaked()\"));\n bytes4 invalidIndex = bytes4(keccak256(\"InvalidIndex()\"));\n bytes4 panic = 0x4e487b71;\n bytes overflow = abi.encodePacked(panic, bytes32(uint256(0x11)));\n\n StakingContractMainnet stakingContract = new StakingContractMainnet();\n\n Token tokenA = new Token();\n Token tokenB = new Token();\n Token tokenC = new Token();\n\n uint256 pastIncentive;\n uint256 ongoingIncentive;\n uint256 futureIncentive;\n\n function setUp() public {\n tokenA.mint(MAX_UINT256);\n tokenB.mint(MAX_UINT256);\n tokenC.mint(MAX_UINT256);\n\n tokenA.approve(address(stakingContract), MAX_UINT256);\n tokenB.approve(address(stakingContract), MAX_UINT256);\n tokenC.approve(address(stakingContract), MAX_UINT256);\n\n tokenA.transfer(johnDoe, MAX_UINT112);\n tokenA.transfer(janeDoe, MAX_UINT112);\n\n vm.prank(johnDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n vm.prank(janeDoe);\n tokenA.approve(address(stakingContract), MAX_UINT256);\n\n uint112 amount = testIncentiveAmount;\n uint256 currentTime = testIncentiveDuration * 30;\n uint256 duration = testIncentiveDuration;\n\n vm.warp(currentTime - duration);\n pastIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration));\n vm.warp(currentTime);\n ongoingIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp), uint32(block.timestamp + duration));\n futureIncentive = _createIncentive(address(tokenA), address(tokenB), amount, uint32(block.timestamp + duration), uint32(block.timestamp + duration * 2));\n }\n\n function testFail_basic_sanity() public {\n assertTrue(false);\n }\n\n function test_basic_sanity() public {\n assertTrue(true);\n }\n\n function _createIncentive(\n address token,\n address rewardToken,\n uint112 amount,\n uint32 startTime,\n uint32 endTime\n ) public returns(uint256) {\n uint256 count = stakingContract.incentiveCount();\n uint256 thisBalance = Token(rewardToken).balanceOf(address(this));\n uint256 stakingContractBalance = Token(rewardToken).balanceOf(address(stakingContract));\n\n if (amount <= 0) {\n vm.expectRevert(invalidInput);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n }\n\n if (endTime <= startTime || endTime <= block.timestamp) {\n vm.expectRevert(invalidTimeFrame);\n return stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n }\n\n uint256 id = stakingContract.createIncentive(token, rewardToken, amount, startTime, endTime);\n\n StakingContractMainnet.Incentive memory incentive = _getIncentive(id);\n\n assertEq(incentive.creator, address(this));\n assertEq(incentive.token, token);\n assertEq(incentive.rewardToken, rewardToken);\n assertEq(incentive.lastRewardTime, startTime < block.timestamp ? uint32(block.timestamp) : startTime);\n assertEq(incentive.endTime, endTime);\n assertEq(incentive.rewardRemaining, amount);\n assertEq(incentive.liquidityStaked, 0);\n assertEq(incentive.rewardPerLiquidity, type(uint256).max / 2);\n assertEq(count + 1, id);\n assertEq(stakingContract.incentiveCount(), id);\n assertEq(thisBalance - amount, Token(rewardToken).balanceOf(address(this)));\n assertEq(stakingContractBalance + amount, Token(rewardToken).balanceOf(address(stakingContract)));\n return id;\n }\n\n function _updateIncentive(\n uint256 incentiveId,\n int112 changeAmount,\n uint32 startTime,\n uint32 endTime\n ) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n Token(incentive.rewardToken).balanceOf(address(this));\n Token(incentive.rewardToken).balanceOf(address(stakingContract));\n uint32 newStartTime = startTime == 0 ? incentive.lastRewardTime : (startTime < uint32(block.timestamp) ? uint32(block.timestamp) : startTime);\n uint32 newEndTime = endTime == 0 ? incentive.endTime : (endTime < uint32(block.timestamp) ? uint32(block.timestamp) : endTime);\n\n if (newStartTime >= newEndTime) {\n vm.expectRevert(invalidTimeFrame);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount == type(int112).min) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n if (changeAmount > 0 && uint112(changeAmount) + uint256(incentive.rewardRemaining) > type(uint112).max) {\n vm.expectRevert(overflow);\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n return;\n }\n\n stakingContract.updateIncentive(incentiveId, changeAmount, startTime, endTime);\n\n if (changeAmount < 0 && uint112(-changeAmount) > incentive.rewardRemaining) {\n changeAmount = -int112(incentive.rewardRemaining);\n }\n\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.lastRewardTime, newStartTime);\n assertEq(updatedIncentive.endTime, newEndTime);\n assertEq(updatedIncentive.rewardRemaining, changeAmount < 0 ? incentive.rewardRemaining - uint112(-changeAmount) : incentive.rewardRemaining + uint112(changeAmount));\n assertEq(updatedIncentive.creator, incentive.creator);\n assertEq(updatedIncentive.token, incentive.token);\n assertEq(updatedIncentive.rewardToken, incentive.rewardToken);\n assertEq(updatedIncentive.liquidityStaked, incentive.liquidityStaked);\n }\n\n function _stake(address token, uint112 amount, address from, bool transferRewards) public {\n // todo check if current incentives stakes got updates correctly\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(\"TRANSFER_FROM_FAILED\");\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n }\n\n function _unstake(address token, uint112 amount, address from, bool transferRewards) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n\n if (amount > userLiquidityBefore) {\n vm.expectRevert(insufficientStakedAmount);\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.unstakeToken(token, amount, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n\n assertEq(userBalanceBefore + amount, userBalanceAfter);\n assertEq(userLiquidityBefore - amount, userLiquidityAfter);\n }\n\n function _subscribeToIncentive(uint256 incentiveId, address from) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint112 liquidity = _getUsersLiquidityStaked(from, incentive.token);\n\n (uint256 rpl) = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.prank(from);\n vm.expectRevert(invalidInput);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (rpl != 0) {\n vm.prank(from);\n vm.expectRevert(alreadySubscribed);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n if (liquidity == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n return stakingContract.subscribeToIncentive(incentiveId);\n }\n\n vm.prank(from);\n stakingContract.subscribeToIncentive(incentiveId);\n\n StakingContractMainnet.Incentive memory incentiveAfter = _getIncentive(incentiveId);\n uint144 subscribedIncentives = _getUsersSubscribedIncentives(from, incentive.token);\n\n assertEq(incentive.liquidityStaked + liquidity, incentiveAfter.liquidityStaked);\n assertEq(uint24(subscribedIncentives), uint24(incentiveId));\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), incentiveAfter.rewardPerLiquidity);\n if (block.timestamp > incentive.lastRewardTime) {\n assertEq(incentiveAfter.lastRewardTime, block.timestamp > incentiveAfter.endTime ? incentiveAfter.endTime : block.timestamp);\n } else {\n assertEq(incentiveAfter.lastRewardTime, incentive.lastRewardTime);\n }\n }\n\n function _stakeAndSubscribeToIncentives(address token, uint112 amount, uint256[] memory incentiveIds, address from, bool transferRewards) public {\n uint256 userBalanceBefore = Token(token).balanceOf(from);\n uint256 stakingContractBalanceBefore = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityBefore = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesBefore = _getUsersSubscribedIncentives(from, token);\n\n if (amount > userBalanceBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount > type(uint112).max - userLiquidityBefore) {\n vm.expectRevert(overflow);\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n if (amount == 0) {\n vm.prank(from);\n vm.expectRevert(notStaked);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n return;\n }\n\n vm.prank(from);\n stakingContract.stakeAndSubscribeToIncentives(token, amount, incentiveIds, transferRewards);\n\n uint256 userBalanceAfter = Token(token).balanceOf(from);\n uint256 stakingContractBalanceAfter = Token(token).balanceOf(address(stakingContract));\n uint256 userLiquidityAfter = _getUsersLiquidityStaked(from, token);\n uint144 subscribedIncentivesAfter = _getUsersSubscribedIncentives(from, token);\n\n assertEq(userBalanceBefore - amount, userBalanceAfter);\n assertEq(userLiquidityBefore + amount, userLiquidityAfter);\n assertEq(stakingContractBalanceBefore + amount, stakingContractBalanceAfter);\n assertLt(subscribedIncentivesBefore, subscribedIncentivesAfter);\n }\n\n function _accrueRewards(uint256 incentiveId) public {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 rewardPerLiquidity;\n uint256 rewardRemaining;\n uint256 lastRewardTime;\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n if (\n incentive.liquidityStaked > 0 &&\n incentive.lastRewardTime < maxTime\n ) {\n (rewardPerLiquidity, rewardRemaining, lastRewardTime) = _calculateAccrueChange(incentiveId);\n } else {\n rewardPerLiquidity = incentive.rewardPerLiquidity;\n rewardRemaining = incentive.rewardRemaining;\n if (incentive.lastRewardTime < block.timestamp){\n lastRewardTime = maxTime;\n } else {\n lastRewardTime = incentive.lastRewardTime;\n }\n }\n\n if (incentiveId > stakingContract.incentiveCount() || incentiveId <= 0) {\n vm.expectRevert(invalidInput);\n stakingContract.accrueRewards(incentiveId);\n return;\n }\n\n stakingContract.accrueRewards(incentiveId);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(updatedIncentive.lastRewardTime, lastRewardTime);\n assertEq(updatedIncentive.rewardRemaining, rewardRemaining);\n }\n\n function _calculateAccrueChange(uint256 incentiveId) public view returns (uint256 rewardPerLiquidity, uint256 rewardRemaining, uint256 lastRewardTime) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 totalTime = incentive.endTime - incentive.lastRewardTime;\n if (totalTime == 0 || incentive.liquidityStaked == 0 || block.timestamp < incentive.lastRewardTime) {\n return (incentive.rewardPerLiquidity, incentive.rewardRemaining, incentive.lastRewardTime);\n }\n uint256 maxTime = block.timestamp < incentive.endTime ? block.timestamp : incentive.endTime;\n uint256 passedTime = maxTime - incentive.lastRewardTime;\n uint256 reward = uint256(passedTime) * incentive.rewardRemaining / totalTime;\n uint256 rplChange = reward * type(uint112).max / incentive.liquidityStaked;\n rewardPerLiquidity = incentive.rewardPerLiquidity + rplChange;\n rewardRemaining = incentive.rewardRemaining - reward;\n lastRewardTime = maxTime;\n }\n\n function _claimReward(uint256 incentiveId, address from) public returns(uint256 reward) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n uint256 oldBalance = Token(incentive.rewardToken).balanceOf(from);\n (uint256 rewardPerLiquidityLast, uint256 rewardPerLiquidity, uint256 expectedReward) = _calculateReward(incentiveId, from);\n uint256[] memory incentiveIds = new uint256[](1);\n incentiveIds[0] = incentiveId;\n if (rewardPerLiquidityLast == 0) {\n vm.prank(from);\n vm.expectRevert(notSubscribed);\n stakingContract.claimRewards(incentiveIds);\n return 0;\n }\n vm.prank(from);\n uint256[] memory rewards = stakingContract.claimRewards(incentiveIds);\n reward = rewards[0];\n assertEq(reward, expectedReward);\n uint256 newBalance = Token(incentive.rewardToken).balanceOf(from);\n assertEq(newBalance - oldBalance, reward);\n StakingContractMainnet.Incentive memory updatedIncentive = _getIncentive(incentiveId);\n assertEq(updatedIncentive.rewardPerLiquidity, rewardPerLiquidity);\n assertEq(stakingContract.rewardPerLiquidityLast(from, incentiveId), rewardPerLiquidity);\n }\n\n function _calculateReward(uint256 incentiveId, address from) internal view returns (uint256 rplLast, uint256 newRewardPerLiquidity, uint256 reward) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n (newRewardPerLiquidity,,) = _calculateAccrueChange(incentiveId);\n uint256 usersLiquidity = _getUsersLiquidityStaked(from, incentive.token);\n rplLast = stakingContract.rewardPerLiquidityLast(from, incentiveId);\n if (rplLast != 0) {\n reward = (newRewardPerLiquidity - rplLast) * usersLiquidity / type(uint112).max;\n }\n }\n\n function _getUsersLiquidityStaked(address user, address token) public view returns (uint112) {\n (uint112 liquidity,) = stakingContract.userStakes(user, token);\n return liquidity;\n }\n\n function _getUsersSubscribedIncentives(address user, address token) public view returns (uint144) {\n (, uint144 incentiveIds) = stakingContract.userStakes(user, token);\n return incentiveIds;\n }\n\n function _rewardRate(uint256 incentiveId) public view returns (uint256) {\n StakingContractMainnet.Incentive memory incentive = _getIncentive(incentiveId);\n if (incentive.endTime != incentive.lastRewardTime) {\n return incentive.rewardRemaining * uint256(type(uint112).max) / (incentive.endTime - incentive.lastRewardTime);\n } else {\n return 0;\n }\n }\n\n function _getIncentive(uint256 id) public view returns (StakingContractMainnet.Incentive memory incentive) {\n (\n address creator,\n address token,\n address rewardToken,\n uint32 endTime,\n uint256 rewardPerLiquidity,\n uint32 lastRewardTime,\n uint112 rewardRemaining,\n uint112 liquidityStaked\n ) = stakingContract.incentives(id);\n incentive = StakingContractMainnet.Incentive(\n creator,\n token,\n rewardToken,\n endTime,\n rewardPerLiquidity,\n lastRewardTime,\n rewardRemaining,\n liquidityStaked\n );\n }\n\n function assertEqInexact(uint256 value, uint256 shouldBe, uint256 err) public {\n assertTrue(value <= shouldBe + err);\n assertTrue(value >= shouldBe - err);\n }\n}\n" + }, + "contracts/Router/IMagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../UniswapV2/periphery/interfaces/IUniswapV2Router01.sol\";\nimport \"../Vault/INftVault.sol\";\n\n/// @title Router contract for swapping, managing liquidity and interacting with vaults\ninterface IMagicSwapV2Router is IUniswapV2Router01 {\n /// @dev Amounts does not match\n error MagicSwapV2WrongAmounts();\n error MagicSwapV2WrongAmountDeposited();\n error MagicSwapV2WrongAmountADeposited();\n error MagicSwapV2WrongAmountBDeposited();\n error MagicSwapV2InvalidPath();\n\n /// @notice Struct that specifies data for liquidity-related operations on vault.\n /// @param token address of NFT vault\n /// @param collection list of NFT addresses\n /// @param tokenId list of token IDs\n /// @param amount list of token amounts. For ERC721 amount is always 1.\n struct NftVaultLiquidityData {\n INftVault token;\n address[] collection;\n uint256[] tokenId;\n uint256[] amount;\n }\n\n /// @notice Emitted when NFT-ERC20 liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vault vault data of deposited NFTs\n event NFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is added\n /// @param to address that receives LP tokens\n /// @param pair address of pair where NFTs are deposited\n /// @param vaultA vault data of deposited NFTs for first side\n /// @param vaultB vault data of deposited NFTs for second side\n event NFTNFTLiquidityAdded(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Emitted when NFT-ERC20 liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vault vault data of withdrawn NFTs\n event NFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vault);\n\n /// @notice Emitted when NFT-NFT liquidity is removed\n /// @param to address that receives withdrawn assets\n /// @param pair address of pair where NFTs are withdrawn\n /// @param vaultA vault data of withdrawn NFTs for first side\n /// @param vaultB vault data of withdrawn NFTs for second side\n event NFTNFTLiquidityRemoved(address indexed to, address pair, NftVaultLiquidityData vaultA, NftVaultLiquidityData vaultB);\n\n /// @notice Deposit NFTs to vault\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to deposit\n /// @param _tokenId list of token IDs to deposit\n /// @param _amount list of token amounts to deposit. For ERC721 amount is always 1.\n /// @param _vault address of the vault where NFTs are deposited\n /// @param _to address that gets ERC20 for deposited NFTs\n /// @return amountMinted amount of ERC20 minted for deposited NFTs\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted);\n\n /// @dev Withdraw NFTs from vault\n /// @dev Vault token must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to withdraw\n /// @param _tokenId list of token IDs to withdraw\n /// @param _amount list of token amounts to withdraw. For ERC721 amount is always 1.\n /// @param _vault address of the vault to withdraw NFTs from\n /// @param _to address that gets withdrawn NFTs\n /// @return amountBurned amount of ERC20 redeemed for NFTs\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and second ERC20 token\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _tokenB address of token B\n /// @param _amountBDesired desired amount of token B to be added as liquidity\n /// @param _amountBMin minimum amount of token B to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using NFTs and ETH\n /// @dev All NFTs and ERC20 token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to deposit as liquidity\n /// @param _amountETHMin desired amount of ETH to be added as liquidity\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountToken amount of vault token added as liquidity\n /// @return amountETH amount of ETH added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount);\n\n /// @notice Add liquidity to UniV2 pool using two NFT vaults\n /// @dev All NFTs must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to deposit as liquidity for first side\n /// @param _vaultB vault data for NFTs to deposit as liquidity for second side\n /// @param _amountAMin minimum amount of token A to be deposited\n /// @param _amountBMin minimum amount of token B to be deposited\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A added as liquidity\n /// @return amountB amount of token B added as liquidity\n /// @return lpAmount amount of LP token minted and sent to `_to`\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 lpAmount);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ERC20 token\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _tokenB address of token B\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to Token B\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs and ETH\n /// @dev Lp token must be approved for transfer. `_vault.collection`,\n /// `_vault.tokenId` and `_vault.amount` must be of the same length.\n /// @param _vault vault data for NFTs to withdraw from liquidity\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountTokenMin minimum amount of vault token to be redeemed\n /// @param _amountETHMin minimum amount of ETH to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @param _swapLeftover if true, fraction of vault token will be swaped to ETH\n /// @return amountToken amount of vault token redeemed\n /// @return amountETH amount of ETH redeemed\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH);\n\n /// @notice Remove liquidity from UniV2 pool and get NFTs\n /// @dev Lp token must be approved for transfer. `_vaultA.collection`,\n /// `_vaultA.tokenId` and `_vaultA.amount` must be of the same length.\n /// `_vaultB.collection`, `_vaultB.tokenId` and `_vaultB.amount` must be of the same length.\n /// @param _vaultA vault data for NFTs to withdraw from liquidity for first side\n /// @param _vaultB vault data for NFTs to withdraw from liquidity for second side\n /// @param _lpAmount amount of LP token to redeem\n /// @param _amountAMin minimum amount of token A to be redeemed\n /// @param _amountBMin minimum amount of token B to be redeemed\n /// @param _to address that gets LP tokens\n /// @param _deadline transaction deadline\n /// @return amountA amount of token A redeemed\n /// @return amountB amount of token B redeemed\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB);\n\n /// @notice Swap NFTs for ERC20\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for token\n /// @param _tokenId list of token IDs to swap for token\n /// @param _amount list of token amounts to swap for token. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of output token expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets output token\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for ETH\n /// @dev All NFTs must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to swap for ETH\n /// @param _tokenId list of token IDs to swap for ETH\n /// @param _amount list of token amounts to swap for ETH. For ERC721 amount is always 1.\n /// @param _amountOutMin minimum amount of ETH expected after swap\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets ETH\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap ERC20 for NFTs\n /// @dev ERC20 must be approved for transfer. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for tokens\n /// @param _tokenId list of token IDs to receive for tokens\n /// @param _amount list of token amounts to receive for tokens. For ERC721 amount is always 1.\n /// @param _amountInMax maximum acceptable amount of token to swap for NFTs\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n /// @notice Swap ETH for NFTs\n /// @dev Does not require any approvals. `_collection`, `_tokenId`\n /// and `_amount` must be of the same length.\n /// @param _collection list of NFT addresses to receive for ETH\n /// @param _tokenId list of token IDs to receive for ETH\n /// @param _amount list of token amounts to receive for ETH. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts);\n\n /// @notice Swap NFTs for NFTs\n /// @dev All input NFTs must be approved for transfer. It is most likely that input NFTs create a leftover\n /// during the swap. That leftover is returend to the pool as LP rewards. `_collectionIn`, `_tokenIdIn` and `_amountIn`\n /// as well as `_collectionOut`, `_tokenIdOut` and `_amountOut` must be of the same length.\n /// @param _collectionIn list of input NFT addresses\n /// @param _tokenIdIn list of input token IDs\n /// @param _amountIn list of input token amounts. For ERC721 amount is always 1.\n /// @param _collectionOut list of output NFT addresses\n /// @param _tokenIdOut list of output token IDs\n /// @param _amountOut list of output token amounts. For ERC721 amount is always 1.\n /// @param _path list of token addresses to swap over\n /// @param _to address that gets NFTs\n /// @param _deadline transaction deadline\n /// @return amounts input and output amounts of swaps\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts);\n\n}\n" + }, + "contracts/Router/MagicSwapV2Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"./IMagicSwapV2Router.sol\";\nimport \"../UniswapV2/periphery/UniswapV2Router02.sol\";\nimport \"../UniswapV2/core/interfaces/IUniswapV2Pair.sol\";\n\ncontract MagicSwapV2Router is IMagicSwapV2Router, UniswapV2Router02 {\n uint256 public constant ONE = 1e18;\n address public constant BURN_ADDRESS = address(0xdead);\n\n constructor(address _factory, address _WETH) UniswapV2Router02(_factory, _WETH) {}\n\n /// @inheritdoc IMagicSwapV2Router\n function depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountMinted) {\n amountMinted = _depositVault(_collection, _tokenId, _amount, _vault, _to);\n }\n\n function _depositVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) internal returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n INftVault.CollectionData memory collectionData = _vault.getAllowedCollectionData(_collection[i]);\n if (collectionData.nftType == INftVault.NftType.ERC721) {\n IERC721(_collection[i]).safeTransferFrom(msg.sender, address(_vault), _tokenId[i]);\n } else if (collectionData.nftType == INftVault.NftType.ERC1155) {\n IERC1155(_collection[i]).safeTransferFrom(\n msg.sender, address(_vault), _tokenId[i], _amount[i], bytes(\"\")\n );\n } else {\n revert INftVault.UnsupportedNft();\n }\n }\n\n amountMinted = _vault.depositBatch(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _to\n ) external returns (uint256 amountBurned) {\n amountBurned = _withdrawVault(_collection, _tokenId, _amount, _vault, msg.sender, _to);\n }\n\n function _withdrawVault(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n INftVault _vault,\n address _from,\n address _to\n ) internal returns (uint256 amountBurned) {\n IERC20 vaultToken = IERC20(address(_vault));\n uint256 amountToBurn = nftAmountToERC20(_amount);\n uint256 fromBalance = vaultToken.balanceOf(_from);\n uint256 totalSupply = vaultToken.totalSupply();\n\n /// @dev if user withdraws all NFT tokens but does not have totalSupply of ERC20 tokens (some are locked\n /// in UniV2 pool), we optimistically assume that user has enough and adjust `amountToBurn`\n /// to user balance. If user balance does not meet required minimum then Vault will revert anyway.\n if (amountToBurn == totalSupply && fromBalance < totalSupply) {\n amountToBurn = fromBalance;\n }\n\n if (_from == address(this)) _approveIfNeeded(address(_vault), amountToBurn);\n\n vaultToken.transferFrom(_from, address(_vault), amountToBurn);\n amountBurned = _vault.withdrawBatch(_to, _collection, _tokenId, _amount);\n\n if (amountToBurn != amountBurned) revert MagicSwapV2WrongAmounts();\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _amountBDesired,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vault.token), _tokenB, amountAMinted, _amountBDesired, amountAMinted, _amountBMin);\n\n if(amountAMinted != amountA) revert MagicSwapV2WrongAmountDeposited();\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n TransferHelper.safeTransfer(address(_vault.token), pair, amountA);\n TransferHelper.safeTransferFrom(_tokenB, msg.sender, pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 lpAmount) {\n uint256 amountMinted = _depositVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this));\n\n _approveIfNeeded(address(_vault.token), amountMinted);\n\n (amountToken, amountETH, lpAmount) =\n _addLiquidityETH(address(_vault.token), amountMinted, amountMinted, _amountETHMin, address(this), _to, _deadline);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityAdded(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function addLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external ensure(_deadline) returns (uint256 amountA, uint256 amountB, uint256 lpAmount) {\n uint256 amountAMinted = _depositVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this));\n uint256 amountBMinted = _depositVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this));\n\n (amountA, amountB) =\n _addLiquidity(address(_vaultA.token), address(_vaultB.token), amountAMinted, amountBMinted, _amountAMin, _amountBMin);\n\n if (amountAMinted != amountA) {\n if (amountAMinted < amountA) {\n revert MagicSwapV2WrongAmountADeposited();\n }\n \n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountAMinted - amountA);\n }\n\n if (amountBMinted != amountB) {\n if (amountBMinted < amountB) {\n revert MagicSwapV2WrongAmountBDeposited();\n }\n\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountBMinted - amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n TransferHelper.safeTransfer(address(_vaultA.token), pair, amountA);\n TransferHelper.safeTransfer(address(_vaultB.token), pair, amountB);\n lpAmount = IUniswapV2Pair(pair).mint(_to);\n\n emit NFTNFTLiquidityAdded(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFT(\n NftVaultLiquidityData calldata _vault,\n address _tokenB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vault.token), _tokenB, _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountA -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), _tokenB, amountA);\n\n amountA = 0;\n amountB += amountOut;\n } else if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountA);\n }\n\n TransferHelper.safeTransfer(_tokenB, _to, amountB);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), _tokenB);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTETH(\n NftVaultLiquidityData calldata _vault,\n uint256 _lpAmount,\n uint256 _amountTokenMin,\n uint256 _amountETHMin,\n address _to,\n uint256 _deadline,\n bool _swapLeftover\n ) external returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(address(_vault.token), WETH, _lpAmount, _amountTokenMin, _amountETHMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurned = _withdrawVault(_vault.collection, _vault.tokenId, _vault.amount, _vault.token, address(this), _to);\n\n amountToken -= amountBurned;\n\n if (_swapLeftover) {\n uint256 amountOut = swapLeftover(address(_vault.token), WETH, amountToken);\n\n amountToken = 0;\n amountETH += amountOut;\n } else if (amountToken > 0) {\n TransferHelper.safeTransfer(address(_vault.token), _to, amountToken);\n }\n\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(_to, amountETH);\n\n address pair = UniswapV2Library.pairFor(factory, address(_vault.token), WETH);\n\n emit NFTLiquidityRemoved(_to, pair, _vault);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function removeLiquidityNFTNFT(\n NftVaultLiquidityData calldata _vaultA,\n NftVaultLiquidityData calldata _vaultB,\n uint256 _lpAmount,\n uint256 _amountAMin,\n uint256 _amountBMin,\n address _to,\n uint256 _deadline\n ) external returns (uint256 amountA, uint256 amountB) {\n (amountA, amountB) =\n removeLiquidity(address(_vaultA.token), address(_vaultB.token), _lpAmount, _amountAMin, _amountBMin, address(this), _deadline);\n\n // withdraw NFTs and send to user\n uint256 amountBurnedA = _withdrawVault(_vaultA.collection, _vaultA.tokenId, _vaultA.amount, _vaultA.token, address(this), _to);\n uint256 amountBurnedB = _withdrawVault(_vaultB.collection, _vaultB.tokenId, _vaultB.amount, _vaultB.token, address(this), _to);\n\n amountA -= amountBurnedA;\n amountB -= amountBurnedB;\n\n if (amountA > 0) {\n TransferHelper.safeTransfer(address(_vaultA.token), BURN_ADDRESS, amountA);\n }\n\n if (amountB > 0) {\n TransferHelper.safeTransfer(address(_vaultB.token), BURN_ADDRESS, amountB);\n }\n\n address pair = UniswapV2Library.pairFor(factory, address(_vaultA.token), address(_vaultB.token));\n \n emit NFTNFTLiquidityRemoved(_to, pair, _vaultA, _vaultB);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForTokens(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), _to, _deadline);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForETH(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountOutMin,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n if(_path[_path.length - 1] != WETH) revert MagicSwapV2InvalidPath();\n\n uint256 amountIn = _depositVault(_collection, _tokenId, _amount, INftVault(_path[0]), address(this));\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, _amountOutMin, _path, address(this), address(this), _deadline);\n\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(_to, amounts[amounts.length - 1]);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapTokensForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n uint256 _amountInMax,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = _swapTokensForExactTokens(amountOut, _amountInMax, _path, msg.sender, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapETHForNft(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external payable returns (uint256[] memory amounts) {\n uint256 amountOut = nftAmountToERC20(_amount);\n\n amounts = swapETHForExactTokens(amountOut, _path, address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collection, _tokenId, _amount, INftVault(_path[_path.length - 1]), address(this), _to);\n }\n\n /// @inheritdoc IMagicSwapV2Router\n function swapNftForNft(\n address[] memory _collectionIn,\n uint256[] memory _tokenIdIn,\n uint256[] memory _amountIn,\n address[] memory _collectionOut,\n uint256[] memory _tokenIdOut,\n uint256[] memory _amountOut,\n address[] calldata _path,\n address _to,\n uint256 _deadline\n ) external returns (uint256[] memory amounts) {\n uint256 amountIn = _depositVault(_collectionIn, _tokenIdIn, _amountIn, INftVault(_path[0]), address(this));\n address vaultOut = _path[_path.length - 1];\n uint256 amountOutMin = nftAmountToERC20(_amountOut);\n\n _approveIfNeeded(_path[0], amountIn);\n\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, _path, address(this), address(this), _deadline);\n\n // withdraw NFTs and send to user\n _withdrawVault(_collectionOut, _tokenIdOut, _amountOut, INftVault(vaultOut), address(this), _to);\n\n uint256 dust = amounts[amounts.length - 1] - amountOutMin;\n\n // send leftover of input token back to the pool and sync\n if (dust > 0) {\n // refund user unused token\n address pair = UniswapV2Library.pairFor(factory, _path[_path.length - 2], vaultOut);\n TransferHelper.safeTransfer(vaultOut, pair, dust);\n IUniswapV2Pair(pair).sync();\n }\n }\n\n function swapLeftover(address _tokenA, address _tokenB, uint256 _amountIn) internal returns (uint256 amountOut) {\n if (_amountIn == 0) return 0;\n\n address[] memory path = new address[](2);\n path[0] = _tokenA;\n path[1] = _tokenB;\n\n _approveIfNeeded(_tokenA, _amountIn);\n\n // swap leftover to tokenB\n // TODO: can be front-run, issue?\n uint256[] memory amounts =\n _swapExactTokensForTokens(_amountIn, 1, path, address(this), address(this), block.timestamp);\n\n return amounts[1];\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal pure returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function _approveIfNeeded(address _token, uint256 _amount) internal {\n if (IERC20(_token).allowance(address(this), address(this)) < _amount) {\n SafeERC20.safeApprove(IERC20(_token), address(this), 0);\n SafeERC20.safeApprove(IERC20(_token), address(this), type(uint256).max);\n }\n }\n}\n" + }, + "contracts/Router/test/MagicSwapV2Router.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"./mock/WETH.sol\";\nimport \"../MagicSwapV2Router.sol\";\nimport \"../../UniswapV2/core/UniswapV2Factory.sol\";\nimport \"../../Vault/NftVaultFactory.sol\";\n\ncontract MagicSwapV2RouterTest is Test {\n WETH weth;\n UniswapV2Factory factory;\n MagicSwapV2Router magicSwapV2Router;\n NftVaultFactory nftVaultFactory;\n ERC721Mintable nft1;\n ERC1155Mintable nft2;\n\n uint256 ONE;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData[] public collections1;\n INftVault.CollectionData[] public collections2;\n\n INftVault vault1;\n INftVault vault2;\n\n address[] public collectionArray;\n uint256[] public tokenIdArray;\n uint256[] public amountArray;\n\n address[] public collectionArray1;\n uint256[] public tokenIdArray1;\n uint256[] public amountArray1;\n\n function setUp() public {\n weth = new WETH();\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n magicSwapV2Router = new MagicSwapV2Router(address(factory), address(weth));\n\n nftVaultFactory = new NftVaultFactory();\n\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections1.push(collectionERC721all);\n vault1 = nftVaultFactory.createVault(collections1);\n nft1 = ERC721Mintable(collectionERC721all.addr);\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collections2.push(collectionERC721all);\n collections2.push(collectionERC1155all);\n vault2 = nftVaultFactory.createVault(collections2);\n nft2 = ERC1155Mintable(collectionERC1155all.addr);\n\n ONE = vault1.ONE();\n }\n\n function _dealWeth(address _user, uint256 _amount) public {\n vm.deal(_user, _amount);\n vm.prank(_user);\n weth.deposit{value: _amount}();\n vm.prank(_user);\n weth.approve(address(magicSwapV2Router), _amount);\n }\n\n function _copyStorage()\n public\n view\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n _collection = collectionArray;\n _tokenId = tokenIdArray;\n _amount = amountArray;\n }\n\n function _mintTokens(address _user)\n public\n returns (address[] memory _collection, uint256[] memory _tokenId, uint256[] memory _amount)\n {\n (_collection, _tokenId, _amount) = _copyStorage();\n\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n nft1.mint(_user, _tokenId[i]);\n vm.prank(_user);\n nft1.setApprovalForAll(address(magicSwapV2Router), true);\n } else {\n nft2.mint(_user, _tokenId[i], _amount[i]);\n vm.prank(_user);\n nft2.setApprovalForAll(address(magicSwapV2Router), true);\n }\n }\n }\n\n function _checkNftBalances(\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount,\n address _owner\n ) public {\n for (uint256 i = 0; i < _collection.length; i++) {\n if (_collection[i] == address(nft1)) {\n assertEq(nft1.ownerOf(_tokenId[i]), _owner);\n } else {\n assertEq(nft2.balanceOf(_owner, _tokenId[i]), _amount[i]);\n }\n }\n }\n\n function _checkERC20Balances(\n address[] memory _collection,\n uint256[] memory,\n uint256[] memory _amount,\n address _vault,\n address _owner,\n uint256 _prevBalance\n ) public {\n uint256 totalAmount;\n\n for (uint256 i = 0; i < _collection.length; i++) {\n totalAmount += _amount[i];\n }\n\n assertEq(IERC20(_vault).balanceOf(_owner), totalAmount * ONE + _prevBalance);\n }\n\n function nftAmountToERC20(uint256[] memory _list) internal view returns (uint256 amount) {\n for (uint256 i = 0; i < _list.length; i++) {\n amount += _list[i];\n }\n\n amount *= ONE;\n }\n\n function testDepositWithdrawVault(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 50);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint64).max);\n\n // deposit 1\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n vm.prank(user1);\n uint256 amountMinted1 = magicSwapV2Router.depositVault(_collection1, _tokenId1, _amount1, vault1, user1);\n\n assertEq(amountMinted1, nftAmountToERC20(_amount1));\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault1));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault1), user1, 0);\n\n // deposit 2\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n vm.prank(user2);\n uint256 amountMinted2 = magicSwapV2Router.depositVault(_collection2, _tokenId2, _amount2, vault2, user2);\n\n assertEq(amountMinted2, nftAmountToERC20(_amount2));\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), user2, 0);\n\n // withdraw 1\n vm.startPrank(user1);\n IERC20(address(vault1)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount1));\n\n uint256 amountBurned1 = magicSwapV2Router.withdrawVault(_collection1, _tokenId1, _amount1, vault1, user3);\n vm.stopPrank();\n\n assertEq(amountBurned1, amountMinted1);\n assertEq(IERC20(address(vault1)).balanceOf(user1), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(vault1)), 0);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user3);\n\n // withdraw 2\n\n collectionArray = [address(nft1), address(nft1), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n (address[] memory _collection3,,) = _mintTokens(user2);\n\n vm.startPrank(user2);\n IERC20(address(vault2)).approve(address(magicSwapV2Router), nftAmountToERC20(_amount2));\n\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2WrongAmounts.selector);\n magicSwapV2Router.withdrawVault(_collection3, _tokenId2, _amount2, vault2, user4);\n\n uint256 leftover = vault2.ONE() - vault2.LAST_NFT_AMOUNT();\n IERC20(address(vault2)).transfer(user4, leftover + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n vm.stopPrank();\n\n vm.prank(user4);\n IERC20(address(vault2)).transfer(user2, 1);\n\n vm.prank(user2);\n uint256 amountBurned2 = magicSwapV2Router.withdrawVault(_collection2, _tokenId2, _amount2, vault2, user4);\n\n assertEq(amountBurned2 + leftover, amountMinted2);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(vault2)), 0);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, user4);\n }\n\n function testAddLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n // UniswapV2Pair balance is using uint112\n // and amount of NFTs is multiplied by 1e18 when transformed to ERC20\n // and we are depositing multple NFTs\n // so trying to avoid overflow revert\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testAddLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n console2.logBytes32(keccak256(type(UniswapV2Pair).creationCode));\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n vm.deal(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired1\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n amountBMin1,\n user1,\n block.timestamp\n );\n\n assertEq(amountA1, nftAmountToERC20(_amount1));\n assertEq(amountB1, amountBDesired1);\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n assertEq(weth.balanceOf(pair), amountB1);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n _checkERC20Balances(_collection1, _tokenId1, _amount1, address(vault2), pair, 0);\n\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = amountBDesired2;\n\n vm.deal(user2, amountBDesired2);\n\n vm.prank(user2);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.addLiquidityNFTETH{value: amountBDesired2}(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n uint256 prevBalance = IERC20(address(vault2)).balanceOf(pair);\n\n amountBMin2 = 10e18;\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTETH{\n value: amountBDesired2\n }(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n amountBMin2,\n user2,\n block.timestamp\n );\n\n assertEq(amountA2, nftAmountToERC20(_amount2));\n assertEq(amountB2, amountBMin2);\n\n assertEq(weth.balanceOf(pair), amountB1 + amountBMin2);\n\n _checkNftBalances(_collection2, _tokenId2, _amount2, address(vault2));\n _checkERC20Balances(_collection2, _tokenId2, _amount2, address(vault2), pair, prevBalance);\n\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testAddLiquidityNFTNFT(uint256 _tokenId) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1, 1, 1];\n\n (address[] memory _collectionA1, uint256[] memory _tokenIdA1, uint256[] memory _amountA1) = _mintTokens(user1);\n\n collectionArray = [address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++];\n amountArray = [5, 5];\n \n (address[] memory _collectionB1, uint256[] memory _tokenIdB1, uint256[] memory _amountB1) = _mintTokens(user1);\n\n vm.prank(user1);\n\n address pair;\n uint256 amountA1;\n uint256 amountB1;\n {\n (uint256 __amountA1, uint256 __amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA1,\n tokenId: _tokenIdA1,\n amount: _amountA1\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB1,\n tokenId: _tokenIdB1,\n amount: _amountB1\n }),\n nftAmountToERC20(_amountA1),\n nftAmountToERC20(_amountB1),\n user1,\n block.timestamp\n );\n\n amountA1 = __amountA1;\n amountB1 = __amountB1;\n\n // All amounts were used\n assertEq(amountA1, nftAmountToERC20(_amountA1));\n assertEq(amountB1, nftAmountToERC20(_amountB1));\n\n // All vault tokens were transferred to the pair\n pair = UniswapV2Library.pairFor(address(factory), address(vault1), address(vault2));\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA1, _tokenIdA1, _amountA1, address(vault1));\n _checkNftBalances(_collectionB1, _tokenIdB1, _amountB1, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user1), lpAmount1);\n }\n\n // user2 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [1, 1, 1];\n\n (address[] memory _collectionA2, uint256[] memory _tokenIdA2, uint256[] memory _amountA2) = _mintTokens(user2);\n\n collectionArray = [address(nft2)];\n tokenIdArray = [_tokenId++];\n amountArray = [5];\n \n (address[] memory _collectionB2, uint256[] memory _tokenIdB2, uint256[] memory _amountB2) = _mintTokens(user2);\n\n vm.prank(user2);\n (uint256 amountA2, uint256 amountB2, uint256 lpAmount2) = magicSwapV2Router.addLiquidityNFTNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collectionA2,\n tokenId: _tokenIdA2,\n amount: _amountA2\n }),\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collectionB2,\n tokenId: _tokenIdB2,\n amount: _amountB2\n }),\n nftAmountToERC20(_amountA2) - ONE,\n nftAmountToERC20(_amountB2),\n user2,\n block.timestamp\n );\n\n // Optimal amounts where used\n assertEq(amountA2, 2.5 * 10 ** 18);\n assertEq(amountB2, nftAmountToERC20(_amountB2));\n\n // Optimal vault tokens were transferred to the pair\n assertEq(IERC20(address(vault1)).balanceOf(pair), amountA1 + amountA2);\n assertEq(IERC20(address(vault2)).balanceOf(pair), amountB1 + amountB2);\n\n // Leftover vault tokens were transferred to the burn address\n assertEq(IERC20(address(vault1)).balanceOf(address(0xdead)), nftAmountToERC20(_amountA2) - amountA2);\n\n // All NFTs were transferred to the vault\n _checkNftBalances(_collectionA2, _tokenIdA2, _amountA2, address(vault1));\n _checkNftBalances(_collectionB2, _tokenIdB2, _amountB2, address(vault2));\n\n // LP tokens were transferred to the user\n assertEq(IERC20(pair).balanceOf(user2), lpAmount2);\n }\n\n function testRemoveLiquidityNFT(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevWETHBalance = weth.balanceOf(user1);\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, weth.balanceOf(user1) - prevWETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testRemoveLiquidityNFTETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n // user1 liquidity deposit\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 10e18;\n uint256 amountBMin1 = 9.5e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n (uint256 amountA1, uint256 amountB1, uint256 lpAmount1) = magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n {\n // user 2 liquidity deposit\n collectionArray = [address(nft1), address(nft2), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n // I know, but it's easier to follow values this way\n amountArray = amountArray;\n\n (address[] memory _collection2, uint256[] memory _tokenId2, uint256[] memory _amount2) = _mintTokens(user2);\n\n uint256 amountBDesired2 = 10.1e18;\n uint256 amountBMin2 = 10e18;\n\n _dealWeth(user2, amountBDesired2);\n\n vm.prank(user2);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection2,\n tokenId: _tokenId2,\n amount: _amount2\n }),\n address(weth),\n amountBDesired2,\n amountBMin2,\n user2,\n block.timestamp\n );\n }\n\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n\n vm.prank(user1);\n IERC20(pair).approve(address(magicSwapV2Router), lpAmount1);\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientAAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(IUniswapV2Router01.UniswapV2RouterInsufficientBAmount.selector);\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n vm.prank(user1);\n vm.expectRevert(\"ERC20: transfer amount exceeds balance\");\n magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n 0,\n 0,\n user1,\n block.timestamp,\n true\n );\n\n _amount1[3] -= 1;\n amountA1 -= 1e18;\n amountB1 -= 1e6;\n\n uint256 prevETHBalance = user1.balance;\n\n vm.prank(user1);\n (uint256 amountA3, uint256 amountB3) = magicSwapV2Router.removeLiquidityNFTETH(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n lpAmount1,\n amountA1,\n amountB1,\n user1,\n block.timestamp,\n true\n );\n\n assertEq(amountA3, 0);\n assertEq(amountB3, user1.balance - prevETHBalance);\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user1);\n\n assertEq(weth.balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(user1), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user1), 0);\n assertEq(IERC20(pair).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function _seedLiquidity1(uint256 _tokenId) public returns (uint256 tokenId) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1)\n ];\n collectionArray1 = collectionArray;\n\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n tokenIdArray1 = tokenIdArray;\n\n amountArray = [uint256(1), 1, 1, 1, uint256(1), 1, 1, 1];\n amountArray1 = amountArray;\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18 / 2;\n uint256 amountBMin1 = 9500e18 / 2;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault1,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return _tokenId;\n }\n\n function _seedLiquidity2(uint256 _tokenId, uint256 _amount) public returns (uint256 tokenId, uint256 amount) {\n collectionArray = [\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft1),\n address(nft2),\n address(nft2),\n address(nft2),\n address(nft2)\n ];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1, 1, _amount++, _amount++, _amount++, _amount++];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user1);\n\n uint256 amountBDesired1 = 1000e18;\n uint256 amountBMin1 = 9500e18;\n\n _dealWeth(user1, amountBDesired1);\n\n vm.prank(user1);\n magicSwapV2Router.addLiquidityNFT(\n IMagicSwapV2Router.NftVaultLiquidityData({\n token: vault2,\n collection: _collection1,\n tokenId: _tokenId1,\n amount: _amount1\n }),\n address(weth),\n amountBDesired1,\n amountBMin1,\n user1,\n block.timestamp\n );\n\n return (_tokenId, _amount);\n }\n\n function testSwapNftForTokens(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForTokens(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), amountOut);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, 0);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForETH(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [address(nft1), address(nft1), address(nft2), address(nft2)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, _amount, _amount];\n\n (address[] memory _collection1, uint256[] memory _tokenId1, uint256[] memory _amount1) = _mintTokens(user2);\n\n address[] memory path = new address[](2);\n path[0] = address(vault2);\n path[1] = address(weth);\n\n address[] memory wrongPath = new address[](2);\n wrongPath[0] = address(vault2);\n wrongPath[1] = address(vault1);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountIn = nftAmountToERC20(_amount1);\n uint256 amountOut = UniswapV2Library.getAmountOut(amountIn, reserveVault, reserveWeth, pair, address(factory));\n uint256 amountOutMin = amountOut;\n\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n vm.expectRevert(IMagicSwapV2Router.MagicSwapV2InvalidPath.selector);\n magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, wrongPath, user2, block.timestamp\n );\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapNftForETH(\n _collection1, _tokenId1, _amount1, amountOutMin, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, address(vault2));\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance + amountOut);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapTokensForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n uint256 amountInMax = amountIn;\n\n _dealWeth(user2, amountIn);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapTokensForNft(\n _collection1, _tokenId1, _amount1, amountInMax, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapETHForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[0], collectionArray[3], collectionArray[4]];\n tokenIdArray = [tokenIdArray[0], tokenIdArray[3], tokenIdArray[4]];\n amountArray = [amountArray[0], amountArray[3], amountArray[4]];\n\n address[] memory _collection1 = collectionArray;\n uint256[] memory _tokenId1 = tokenIdArray;\n uint256[] memory _amount1 = amountArray;\n\n address[] memory path = new address[](2);\n path[0] = address(weth);\n path[1] = address(vault2);\n\n (uint256 reserveVault, uint256 reserveWeth) =\n UniswapV2Library.getReserves(address(factory), address(vault2), address(weth));\n address pair = UniswapV2Library.pairFor(address(factory), address(vault2), address(weth));\n uint256 amountOut = nftAmountToERC20(_amount1);\n uint256 amountIn = UniswapV2Library.getAmountIn(amountOut, reserveWeth, reserveVault, pair, address(factory));\n\n uint256 dust = 1e18;\n vm.deal(user2, amountIn + dust);\n uint256 prevETHBalance = user2.balance;\n\n vm.prank(user2);\n uint256[] memory amounts = magicSwapV2Router.swapETHForNft{value: amountIn + dust}(\n _collection1, _tokenId1, _amount1, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collection1, _tokenId1, _amount1, user2);\n assertEq(amounts[0], amountIn);\n assertEq(amounts[1], amountOut);\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(user2.balance, prevETHBalance - amountIn);\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n\n function testSwapNftForNft(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_tokenId < type(uint256).max - 100);\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint112).max / ONE / 10);\n\n _tokenId = _seedLiquidity1(_tokenId);\n (_tokenId, _amount) = _seedLiquidity2(_tokenId, _amount);\n\n collectionArray = [collectionArray[7]];\n tokenIdArray = [tokenIdArray[7]];\n amountArray = [amountArray[7]];\n\n address[] memory _collectionOut = collectionArray;\n uint256[] memory _tokenIdOut = tokenIdArray;\n uint256[] memory _amountOut = amountArray;\n\n collectionArray = [address(nft1), address(nft1), address(nft1)];\n tokenIdArray = [_tokenId++, _tokenId++, _tokenId++];\n amountArray = [uint256(1), 1, 1];\n\n (address[] memory _collectionIn, uint256[] memory _tokenIdIn, uint256[] memory _amountIn) = _mintTokens(user2);\n\n address[] memory path = new address[](3);\n path[0] = address(vault1);\n path[1] = address(weth);\n path[2] = address(vault2);\n\n uint256 amountIn;\n uint256 amountOut;\n {\n amountIn = nftAmountToERC20(_amountIn);\n uint256[] memory amounts = UniswapV2Library.getAmountsOut(address(factory), amountIn, path);\n amountOut = amounts[amounts.length - 1];\n console2.log(\"amountOut\", amountOut);\n }\n\n _amountOut[0] = amountOut / ONE;\n\n assertTrue(nftAmountToERC20(_amountOut) < amountOut);\n assertEq(nftAmountToERC20(_amountOut) / ONE, amountOut / ONE);\n\n uint256 prevPairVault2Balance;\n {\n address pair = UniswapV2Library.pairFor(address(factory), path[1], path[2]);\n prevPairVault2Balance = IERC20(address(vault2)).balanceOf(pair);\n }\n\n vm.prank(user2);\n uint256[] memory swapAmounts = magicSwapV2Router.swapNftForNft(\n _collectionIn, _tokenIdIn, _amountIn, _collectionOut, _tokenIdOut, _amountOut, path, user2, block.timestamp\n );\n\n _checkNftBalances(_collectionIn, _tokenIdIn, _amountIn, address(vault1));\n _checkNftBalances(_collectionOut, _tokenIdOut, _amountOut, user2);\n assertEq(swapAmounts[0], amountIn);\n assertEq(swapAmounts[2], amountOut);\n\n uint256 dust = swapAmounts[swapAmounts.length - 1] - amountOut / ONE * ONE;\n console2.log(\"dust\", dust);\n assertTrue(dust > 0);\n assertEq(\n IERC20(address(vault2)).balanceOf(UniswapV2Library.pairFor(address(factory), path[1], path[2])),\n prevPairVault2Balance - amountOut + dust\n );\n\n assertEq(weth.balanceOf(user2), 0);\n assertEq(weth.balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(IERC20(address(vault1)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault1)).balanceOf(address(magicSwapV2Router)), 0);\n assertEq(IERC20(address(vault2)).balanceOf(user2), 0);\n assertEq(IERC20(address(vault2)).balanceOf(address(magicSwapV2Router)), 0);\n\n assertEq(address(magicSwapV2Router).balance, 0);\n }\n}\n" + }, + "contracts/Router/test/mock/WETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ncontract WETH {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed src, address indexed guy, uint256 wad);\n event Transfer(address indexed src, address indexed dst, uint256 wad);\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n receive() external payable {\n deposit();\n }\n\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n emit Deposit(msg.sender, msg.value);\n }\n\n function withdraw(uint256 wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n (bool success,) = payable(msg.sender).call{value: wad}(\"\");\n require(success, \"Transfer failed\");\n emit Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint256) {\n return address(this).balance;\n }\n\n function approve(address guy, uint256 wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n emit Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint256 wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint256 wad) public returns (bool) {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n emit Transfer(src, dst, wad);\n\n return true;\n }\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Callee.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Callee {\n function uniswapV2Call(address sender, uint256 amount0, uint256 amount1, bytes calldata data) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2ERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external pure returns (string memory);\n function symbol() external pure returns (string memory);\n function decimals() external pure returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint256);\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Factory {\n struct DefaultFees {\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n }\n\n struct Fees {\n address royaltiesBeneficiary;\n /// @dev in basis point, denominated by 10000\n uint256 royaltiesFee;\n /// @dev in basis point, denominated by 10000\n uint256 protocolFee;\n /// @dev in basis point, denominated by 10000\n uint256 lpFee;\n /// @dev if true, Fees.protocolFee is used even if set to 0\n bool protocolFeeOverride;\n /// @dev if true, Fees.lpFee is used even if set to 0\n bool lpFeeOverride;\n }\n\n event PairCreated(address indexed token0, address indexed token1, address pair, uint256);\n event DefaultFeesSet(DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(address indexed pair, address beneficiary, uint256 royaltiesFee);\n event ProtocolFeesSet(address indexed pair, uint256 protocolFee, bool overrideFee);\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n /// @notice Returns total fee pair charges\n /// @dev Fee is capped at MAX_FEE\n /// @param pair address of pair for which to calculate fees\n /// @return totalFee total fee amount denominated in basis points\n function getTotalFee(address pair) external view returns (uint256 totalFee);\n\n /// @notice Returns all fees for pair\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFees(address _pair) external view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee);\n\n /// @notice Returns all fees for pair and beneficiaries\n /// @dev Fees are capped in total by MAX_FEE value. If by mistake or otherwise owner of this contract\n /// does a combination of transactions and tries to achive total fees above MAX_FEE, fees are allocatied\n /// by priority:\n /// 1. lp fee\n /// 2. royalties\n /// 3. protocol fee\n /// If MAX_FEE == 5000, lpFee == 500, royaltiesFee == 4000 and protocolFee == 4000 then\n /// effective fees will be allocated acording to the fee priority up to MAX_FEE value.\n /// In this example: lpFee == 500, royaltiesFee == 4000 and protocolFee == 500.\n /// @param pair address of pair for which to calculate fees and beneficiaries\n /// @return lpFee fee changed by liquidity providers, denominated in basis points\n /// @return royaltiesBeneficiary address that gets royalties\n /// @return royaltiesFee royalties paid to NFT creators, denominated in basis points\n /// @return protocolBeneficiary address that gets protocol fees\n /// @return protocolFee fee paid to the protocol, denominated in basis points\n function getFeesAndRecipients(address pair)\n external\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n );\n\n /// @return protocolFeeBeneficiary address that gets protocol fees\n function protocolFeeBeneficiary() external view returns (address protocolFeeBeneficiary);\n\n /// @notice Internal mapping to store fees for pair. It is exposed for advanced integrations\n /// and in most cases contracts should use fee getters.\n function pairFees(address pair) external view returns (address, uint256, uint256, uint256, bool, bool);\n\n function getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs() external view returns (address[] memory pairs);\n function allPairs(uint256) external view returns (address pair);\n function allPairsLength() external view returns (uint256);\n\n function createPair(address tokenA, address tokenB) external returns (address pair);\n\n /// @notice Sets default fees for all pairs\n /// @param fees struct with default fees\n function setDefaultFees(DefaultFees memory fees) external;\n\n /// @notice Sets royalties fee and beneficiary for pair\n /// @param pair address of pair for which to set fee\n /// @param beneficiary address that gets royalties\n /// @param royaltiesFee amount of royalties fee denominated in basis points\n function setRoyaltiesFee(address pair, address beneficiary, uint256 royaltiesFee) external;\n\n /// @notice Sets protocol fee for pair\n /// @param pair address of pair for which to set fee\n /// @param protocolFee amount of protocol fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setProtocolFee(address pair, uint256 protocolFee, bool overrideFee) external;\n\n /// @notice Sets lp fee for pair\n /// @param pair address of pair for which to set fee\n /// @param lpFee amount of lp fee denominated in basis points\n /// @param overrideFee if true, fee will be overriden even if set to 0\n function setLpFee(address pair, uint256 lpFee, bool overrideFee) external;\n\n /// @notice Sets protocol fee beneficiary\n /// @param _beneficiary address that gets protocol fees\n function setProtocolFeeBeneficiary(address _beneficiary) external;\n}\n" + }, + "contracts/UniswapV2/core/interfaces/IUniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Pair {\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n /// @notice Emitted by the pool for increases to the number of observations that can be stored\n /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n /// just before a mint/swap/burn.\n /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n event IncreaseObservationCardinalityNext(\n uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew\n );\n\n function MINIMUM_LIQUIDITY() external pure returns (uint256);\n function factory() external view returns (address);\n function token0() external view returns (address);\n function token1() external view returns (address);\n function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\n function observations(uint256 index)\n external\n view\n returns (uint32 blockTimestamp, uint256 priceCumulative, bool initialized);\n\n function observe(uint32[] calldata secondsAgos) external view returns (uint256[] memory tickCumulatives);\n function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n\n function mint(address to) external returns (uint256 liquidity);\n function burn(address to) external returns (uint256 amount0, uint256 amount1);\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;\n function skim(address to) external;\n function sync() external;\n\n function initialize(address, address) external;\n}\n" + }, + "contracts/UniswapV2/core/libraries/Oracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Oracle (modifier version of Oracle.sol from UniswapV3)\n/// @notice Provides price data useful for a wide variety of system designs\n/// @dev Instances of stored oracle data, \"observations\", are collected in the oracle array\n/// Every pool is initialized with an oracle array length of 1. Anyone can pay the SSTOREs to increase the\n/// maximum length of the oracle array. New slots will be added when the array is fully populated.\n/// Observations are overwritten when the full length of the oracle array is populated.\n/// The most recent observation is available, independent of the length of the oracle array, by passing 0 to observe()\nlibrary Oracle {\n struct Observation {\n // the block timestamp of the observation\n uint32 blockTimestamp;\n // the price accumulator, i.e. price * time elapsed since the pool was first initialized\n uint256 priceCumulative;\n // whether or not the observation is initialized\n bool initialized;\n }\n\n /// @notice Transforms a previous observation into a new observation, given the passage of time and the current price values\n /// @dev blockTimestamp _must_ be chronologically equal to or greater than last.blockTimestamp, safe for 0 or 1 overflows\n /// @param last The specified observation to be transformed\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @return Observation The newly populated observation\n function transform(Observation memory last, uint32 blockTimestamp, uint256 lastPrice)\n private\n pure\n returns (Observation memory)\n {\n uint32 delta = blockTimestamp - last.blockTimestamp;\n return Observation({\n blockTimestamp: blockTimestamp,\n priceCumulative: last.priceCumulative + lastPrice * delta,\n initialized: true\n });\n }\n\n /// @notice Initialize the oracle array by writing the first slot. Called once for the lifecycle of the observations array\n /// @param self The stored oracle array\n /// @param time The time of the oracle initialization, via block.timestamp truncated to uint32\n /// @return cardinality The number of populated elements in the oracle array\n /// @return cardinalityNext The new length of the oracle array, independent of population\n function initialize(Observation[65535] storage self, uint32 time)\n internal\n returns (uint16 cardinality, uint16 cardinalityNext)\n {\n self[0] = Observation({blockTimestamp: time, priceCumulative: 0, initialized: true});\n return (1, 1);\n }\n\n /// @notice Writes an oracle observation to the array\n /// @dev Writable at most once per block. Index represents the most recently written element. cardinality and index must be tracked externally.\n /// If the index is at the end of the allowable array length (according to cardinality), and the next cardinality\n /// is greater than the current one, cardinality may be increased. This restriction is created to preserve ordering.\n /// @param self The stored oracle array\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param blockTimestamp The timestamp of the new observation\n /// @param lastPrice The active price at the time of the new observation\n /// @param cardinality The number of populated elements in the oracle array\n /// @param cardinalityNext The new length of the oracle array, independent of population\n /// @return indexUpdated The new index of the most recently written element in the oracle array\n /// @return cardinalityUpdated The new cardinality of the oracle array\n function write(\n Observation[65535] storage self,\n uint16 index,\n uint32 blockTimestamp,\n uint256 lastPrice,\n uint16 cardinality,\n uint16 cardinalityNext\n ) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated) {\n Observation memory last = self[index];\n\n // early return if we've already written an observation this block\n if (last.blockTimestamp == blockTimestamp) return (index, cardinality);\n\n // if the conditions are right, we can bump the cardinality\n if (cardinalityNext > cardinality && index == (cardinality - 1)) {\n cardinalityUpdated = cardinalityNext;\n } else {\n cardinalityUpdated = cardinality;\n }\n\n indexUpdated = (index + 1) % cardinalityUpdated;\n self[indexUpdated] = transform(last, blockTimestamp, lastPrice);\n }\n\n /// @notice Prepares the oracle array to store up to `next` observations\n /// @param self The stored oracle array\n /// @param current The current next cardinality of the oracle array\n /// @param next The proposed next cardinality which will be populated in the oracle array\n /// @return next The next cardinality which will be populated in the oracle array\n function grow(Observation[65535] storage self, uint16 current, uint16 next) internal returns (uint16) {\n require(current > 0, \"I\");\n // no-op if the passed next value isn't greater than the current next value\n if (next <= current) return current;\n // store in each slot to prevent fresh SSTOREs in swaps\n // this data will not be used because the initialized boolean is still false\n for (uint16 i = current; i < next; i++) {\n self[i].blockTimestamp = 1;\n }\n return next;\n }\n\n /// @notice comparator for 32-bit timestamps\n /// @dev safe for 0 or 1 overflows, a and b _must_ be chronologically before or equal to time\n /// @param time A timestamp truncated to 32 bits\n /// @param a A comparison timestamp from which to determine the relative position of `time`\n /// @param b From which to determine the relative position of `time`\n /// @return bool Whether `a` is chronologically <= `b`\n function lte(uint32 time, uint32 a, uint32 b) private pure returns (bool) {\n // if there hasn't been overflow, no need to adjust\n if (a <= time && b <= time) return a <= b;\n\n uint256 aAdjusted = a > time ? a : a + 2 ** 32;\n uint256 bAdjusted = b > time ? b : b + 2 ** 32;\n\n return aAdjusted <= bAdjusted;\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a target, i.e. where [beforeOrAt, atOrAfter] is satisfied.\n /// The result may be the same observation, or adjacent observations.\n /// @dev The answer must be contained in the array, used when the target is located within the stored observation\n /// boundaries: older than the most recent observation and younger, or the same age as, the oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation recorded before, or at, the target\n /// @return atOrAfter The observation recorded at, or after, the target\n function binarySearch(Observation[65535] storage self, uint32 time, uint32 target, uint16 index, uint16 cardinality)\n private\n view\n returns (Observation memory beforeOrAt, Observation memory atOrAfter)\n {\n uint256 l = (index + 1) % cardinality; // oldest observation\n uint256 r = l + cardinality - 1; // newest observation\n uint256 i;\n while (true) {\n i = (l + r) / 2;\n\n beforeOrAt = self[i % cardinality];\n\n // we've landed on an uninitialized price, keep searching higher (more recently)\n if (!beforeOrAt.initialized) {\n l = i + 1;\n continue;\n }\n\n atOrAfter = self[(i + 1) % cardinality];\n\n bool targetAtOrAfter = lte(time, beforeOrAt.blockTimestamp, target);\n\n // check if we've found the answer!\n if (targetAtOrAfter && lte(time, target, atOrAfter.blockTimestamp)) break;\n\n if (!targetAtOrAfter) r = i - 1;\n else l = i + 1;\n }\n }\n\n /// @notice Fetches the observations beforeOrAt and atOrAfter a given target, i.e. where [beforeOrAt, atOrAfter] is satisfied\n /// @dev Assumes there is at least 1 initialized observation.\n /// Used by observeSingle() to compute the counterfactual accumulator values as of a given block timestamp.\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param target The timestamp at which the reserved observation should be for\n /// @param lastPrice The active price at the time of the returned or simulated observation\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return beforeOrAt The observation which occurred at, or before, the given timestamp\n /// @return atOrAfter The observation which occurred at, or after, the given timestamp\n function getSurroundingObservations(\n Observation[65535] storage self,\n uint32 time,\n uint32 target,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n // optimistically set before to the newest observation\n beforeOrAt = self[index];\n\n // if the target is chronologically at or after the newest observation, we can early return\n if (lte(time, beforeOrAt.blockTimestamp, target)) {\n if (beforeOrAt.blockTimestamp == target) {\n // if newest observation equals target, we're in the same block, so we can ignore atOrAfter\n return (beforeOrAt, atOrAfter);\n } else {\n // otherwise, we need to transform\n return (beforeOrAt, transform(beforeOrAt, target, lastPrice));\n }\n }\n\n // now, set before to the oldest observation\n beforeOrAt = self[(index + 1) % cardinality];\n if (!beforeOrAt.initialized) beforeOrAt = self[0];\n\n // ensure that the target is chronologically at or after the oldest observation\n require(lte(time, beforeOrAt.blockTimestamp, target), \"OLD\");\n\n // if we've reached this point, we have to binary search\n return binarySearch(self, time, target, index, cardinality);\n }\n\n /// @dev Reverts if an observation at or before the desired observation timestamp does not exist.\n /// 0 may be passed as `secondsAgo' to return the current cumulative values.\n /// If called with a timestamp falling between two observations, returns the counterfactual accumulator values\n /// at exactly the timestamp between the two observations.\n /// @param self The stored oracle array\n /// @param time The current block timestamp\n /// @param secondsAgo The amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulative The price * time elapsed since the pool was first initialized, as of `secondsAgo`\n function observeSingle(\n Observation[65535] storage self,\n uint32 time,\n uint32 secondsAgo,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256 priceCumulative) {\n if (secondsAgo == 0) {\n Observation memory last = self[index];\n if (last.blockTimestamp != time) last = transform(last, time, lastPrice);\n return last.priceCumulative;\n }\n\n uint32 target = time - secondsAgo;\n\n (Observation memory beforeOrAt, Observation memory atOrAfter) =\n getSurroundingObservations(self, time, target, lastPrice, index, cardinality);\n\n if (target == beforeOrAt.blockTimestamp) {\n // we're at the left boundary\n return beforeOrAt.priceCumulative;\n } else if (target == atOrAfter.blockTimestamp) {\n // we're at the right boundary\n return atOrAfter.priceCumulative;\n } else {\n // we're in the middle\n uint32 observationTimeDelta = atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp;\n uint32 targetDelta = target - beforeOrAt.blockTimestamp;\n return beforeOrAt.priceCumulative\n + ((atOrAfter.priceCumulative - beforeOrAt.priceCumulative) / observationTimeDelta) * targetDelta;\n }\n }\n\n /// @notice Returns the accumulator values as of each time seconds ago from the given time in the array of `secondsAgos`\n /// @dev Reverts if `secondsAgos` > oldest observation\n /// @param self The stored oracle array\n /// @param time The current block.timestamp\n /// @param secondsAgos Each amount of time to look back, in seconds, at which point to return an observation\n /// @param lastPrice The current price\n /// @param index The index of the observation that was most recently written to the observations array\n /// @param cardinality The number of populated elements in the oracle array\n /// @return priceCumulatives The price * time elapsed since the pool was first initialized, as of each `secondsAgo`\n function observe(\n Observation[65535] storage self,\n uint32 time,\n uint32[] memory secondsAgos,\n uint256 lastPrice,\n uint16 index,\n uint16 cardinality\n ) internal view returns (uint256[] memory priceCumulatives) {\n require(cardinality > 0, \"I\");\n\n priceCumulatives = new uint256[](secondsAgos.length);\n for (uint256 i = 0; i < secondsAgos.length; i++) {\n priceCumulatives[i] = observeSingle(self, time, secondsAgos[i], lastPrice, index, cardinality);\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/SafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, \"ds-math-add-overflow\");\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, \"ds-math-sub-underflow\");\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, \"ds-math-mul-overflow\");\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UniswapV2Math.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for performing various math operations\n\nlibrary UniswapV2Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/libraries/UQ112x112.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/mock/UniswapV2PairOriginal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../../interfaces/IUniswapV2Pair.sol\";\nimport \"../../interfaces/IUniswapV2Callee.sol\";\nimport \"../../interfaces/IUniswapV2Factory.sol\";\n\nimport \"../../libraries/UniswapV2Math.sol\";\nimport \"../../libraries/UQ112x112.sol\";\nimport \"../../libraries/Oracle.sol\";\n\nimport \"../../UniswapV2ERC20.sol\";\n\n/// @dev Minimally adjusted vanilla UniswapV2Pair implementation for testing\n/// @dev CHANGELOG:\n/// - remove body of _mintFee function\n/// - refactor uint112(-1) to type(uint112).max\ncontract UniswapV2PairOriginal is UniswapV2ERC20 {\n using SafeMath for uint256;\n using UQ112x112 for uint224;\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"UniswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"UniswapV2: TRANSFER_FAILED\");\n }\n\n event Mint(address indexed sender, uint256 amount0, uint256 amount1);\n event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);\n event Swap(\n address indexed sender,\n uint256 amount0In,\n uint256 amount1In,\n uint256 amount0Out,\n uint256 amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"UniswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"UniswapV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)\n function _mintFee(uint112, uint112) private pure returns (bool) {\n return false;\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Mint(msg.sender, amount0, amount1);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n bool feeOn = _mintFee(_reserve0, _reserve1);\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n // this low-level function should be called from a contract which performs important safety checks\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"UniswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"UniswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"UniswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));\n uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(1000 ** 2),\n \"UniswapV2: K\"\n );\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n // force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n // force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/Oracle.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../../periphery/libraries/OracleLibrary.sol\";\nimport \"../UniswapV2Factory.sol\";\n\ncontract OracleImpl {\n function consult(address pair, uint32 period) public view returns (uint256) {\n return OracleLibrary.consult(pair, period);\n }\n}\n\ncontract OracleTest is Test {\n uint256 public constant TIMESTAMP = 1668642357;\n uint256 public constant BLOCKTIME = 15;\n uint256 public START_PRICE;\n\n UniswapV2Pair public pair;\n UniswapV2Factory factory;\n\n ERC20Mintable public DAI = new ERC20Mintable();\n ERC20Mintable public WETH = new ERC20Mintable();\n OracleImpl public oracleImpl = new OracleImpl();\n\n address user1 = address(10000001);\n\n address protocolFeeBeneficiary = address(10000005);\n\n function setUp() public {\n vm.warp(TIMESTAMP);\n\n factory = new UniswapV2Factory(150, 30, protocolFeeBeneficiary);\n\n pair = UniswapV2Pair(factory.createPair(address(WETH), address(DAI)));\n WETH.mint(address(pair), 1000e18);\n DAI.mint(address(pair), 1500000e18);\n pair.mint(user1);\n\n START_PRICE = 1500000e18 * 1e18 / 1000e18;\n }\n\n function _mineBlock(uint256 _time) public {\n vm.roll(block.number + 1);\n vm.warp(block.timestamp + _time);\n }\n\n function _swap(uint256 _wethIn, uint256 _daiIn) public returns (uint256 amountOut) {\n _mineBlock(BLOCKTIME);\n\n (uint112 reserve0, uint112 reserve1,) = pair.getReserves();\n if (_wethIn > 0) {\n uint256 amount1Out =\n UniswapV2Library.getAmountOut(_wethIn, reserve0, reserve1, address(pair), address(factory));\n WETH.mint(address(pair), _wethIn);\n pair.swap(0, amount1Out, user1, bytes(\"\"));\n amountOut = amount1Out;\n } else if (_daiIn > 0) {\n uint256 amount0Out =\n UniswapV2Library.getAmountOut(_daiIn, reserve1, reserve0, address(pair), address(factory));\n DAI.mint(address(pair), _daiIn);\n pair.swap(amount0Out, 0, user1, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testTokensOrder() public {\n assertEq(address(WETH), pair.token0());\n assertEq(address(DAI), pair.token1());\n }\n\n function testConsultOld() public {\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1800);\n\n assertEq(pair.lastPrice(), 0);\n\n _swap(0.01e18, 0);\n vm.warp(block.timestamp + BLOCKTIME);\n assertEq(oracleImpl.consult(address(pair), 15), START_PRICE);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 16);\n\n vm.warp(block.timestamp + 1800 - BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 1800), START_PRICE);\n\n _swap(1e18, 0);\n\n vm.expectRevert(bytes(\"OLD\"));\n oracleImpl.consult(address(pair), 1);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n struct TestAction {\n uint256 wethIn;\n uint256 daiIn;\n uint256 timetravelBefore;\n uint256 timetravelAfter;\n uint32 period;\n uint256 TWAP;\n uint16 observationCardinalityNext;\n uint256 observationIndex;\n }\n\n // workaround for \"UnimplementedFeatureError: Copying of type struct memory to storage not yet supported.\"\n uint256 public constant depositTestCasesLength = 22;\n\n function getTestAction(uint256 _index) public view returns (TestAction memory) {\n TestAction[depositTestCasesLength] memory testSwapCases = [\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 60,\n period: 60,\n TWAP: START_PRICE,\n observationCardinalityNext: 120,\n observationIndex: 0\n }),\n TestAction({\n wethIn: 0.01e18,\n daiIn: 0,\n timetravelBefore: 1800,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1499970495435267142183,\n observationCardinalityNext: 120,\n observationIndex: 1\n }),\n TestAction({\n wethIn: 100e18, // big trade\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 45,\n period: 1800,\n TWAP: 1499969511978807824364,\n observationCardinalityNext: 120,\n observationIndex: 2\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 1363107217423634267487,\n observationCardinalityNext: 120,\n observationIndex: 3\n }),\n TestAction({\n wethIn: 0,\n daiIn: 1000000e18, // huge trade\n timetravelBefore: 900,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1243352310158670807355,\n observationCardinalityNext: 120,\n observationIndex: 4\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1263646160072652749974,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 60 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1344821559728580520453,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 120 sec since huge trade\n timetravelAfter: 330, // 450 sec since huge trade\n period: 1800,\n TWAP: 1872461657492111028567,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 510 sec since huge trade\n timetravelAfter: 390, // 900 sec since huge trade\n period: 1800,\n TWAP: 2481277154911569307160,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 960 sec since huge trade\n timetravelAfter: 390, // 1350 sec since huge trade\n period: 1800,\n TWAP: 3090092652331027585753,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 15, // 1380 sec since huge trade\n timetravelAfter: 400, // 1780 sec since huge trade\n period: 1800,\n TWAP: 3671849683198509940853,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 5, // 1800 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 45, // 1860 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 145, // 2020 sec since huge trade\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921727,\n observationCardinalityNext: 120,\n observationIndex: 5\n }),\n TestAction({\n wethIn: 250e18,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3678614299836503921715,\n observationCardinalityNext: 120,\n observationIndex: 6\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 0,\n timetravelAfter: 900,\n period: 1800,\n TWAP: 2783849579014797350624,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290062,\n observationCardinalityNext: 120,\n observationIndex: 7\n }),\n TestAction({\n wethIn: 0,\n daiIn: 500000e18,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 1918421406416753290057,\n observationCardinalityNext: 120,\n observationIndex: 8\n }),\n TestAction({\n wethIn: 1,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 2554290763490825493524,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n }),\n TestAction({\n wethIn: 0,\n daiIn: 0,\n timetravelBefore: 885,\n timetravelAfter: 0,\n period: 1800,\n TWAP: 3190160120564897696992,\n observationCardinalityNext: 120,\n observationIndex: 9\n })\n ];\n\n return testSwapCases[_index];\n }\n\n function testConsult() public {\n for (uint256 i = 0; i < depositTestCasesLength; i++) {\n TestAction memory testCase = getTestAction(i);\n\n vm.warp(block.timestamp + testCase.timetravelBefore);\n _swap(testCase.wethIn, testCase.daiIn);\n vm.warp(block.timestamp + testCase.timetravelAfter);\n\n assertEq(oracleImpl.consult(address(pair), testCase.period), testCase.TWAP);\n\n if (testCase.observationCardinalityNext > pair.observationCardinalityNext()) {\n pair.increaseObservationCardinalityNext(testCase.observationCardinalityNext);\n }\n\n assertEq(pair.observationIndex(), testCase.observationIndex);\n }\n }\n\n function testObservationsSingleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, 0);\n assertEq(initialized, true);\n\n _swap(0.01e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME);\n assertEq(initialized, true);\n\n _swap(1e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(pair.observationIndex());\n assertEq(blockTimestamp, block.timestamp);\n assertEq(priceCumulative, START_PRICE * BLOCKTIME + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n\n vm.warp(block.timestamp + BLOCKTIME);\n\n assertEq(oracleImpl.consult(address(pair), 15), pair.lastPrice());\n }\n\n function _assertCardinality(\n uint16 observationIndex,\n uint16 observationCardinality,\n uint16 observationCardinalityNext\n ) public {\n assertEq(pair.observationIndex(), observationIndex);\n assertEq(pair.observationCardinality(), observationCardinality);\n assertEq(pair.observationCardinalityNext(), observationCardinalityNext);\n }\n\n function testIncreaseObservationCardinalityNext() public {\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n _swap(1e18, 0);\n _assertCardinality(0, 1, 1);\n\n pair.increaseObservationCardinalityNext(3);\n _assertCardinality(0, 1, 3);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 3);\n\n _swap(1e18, 0);\n _assertCardinality(0, 3, 3);\n\n pair.increaseObservationCardinalityNext(10);\n _assertCardinality(0, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(1, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(2, 3, 10);\n\n _swap(1e18, 0);\n _assertCardinality(3, 10, 10);\n\n for (uint256 i = 0; i < 6; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 10);\n\n _swap(1e18, 0);\n _assertCardinality(0, 10, 10);\n\n pair.increaseObservationCardinalityNext(15);\n _assertCardinality(0, 10, 15);\n\n for (uint256 i = 0; i < 9; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(9, 10, 15);\n\n _swap(1e18, 0);\n _assertCardinality(10, 15, 15);\n\n for (uint256 i = 0; i < 4; i++) {\n _swap(1e18, 0);\n }\n _assertCardinality(14, 15, 15);\n\n _swap(1e18, 0);\n _assertCardinality(0, 15, 15);\n }\n\n function testObservationsMultipleCardinality() public {\n uint32 blockTimestamp;\n uint256 priceCumulative;\n bool initialized;\n\n _swap(0.01e18, 0);\n assertEq(pair.lastPrice(), START_PRICE);\n\n (uint32 blockTimestamp0, uint256 priceCumulative0, bool initialized0) = pair.observations(0);\n assertEq(blockTimestamp0, block.timestamp);\n assertEq(priceCumulative0, START_PRICE * BLOCKTIME);\n assertEq(initialized0, true);\n\n pair.increaseObservationCardinalityNext(3);\n\n _swap(100e18, 0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(0);\n assertEq(blockTimestamp, blockTimestamp0);\n assertEq(priceCumulative, priceCumulative0);\n assertEq(initialized, initialized0);\n\n (blockTimestamp, priceCumulative, initialized) = pair.observations(1);\n assertEq(blockTimestamp, blockTimestamp0 + BLOCKTIME);\n assertEq(priceCumulative, priceCumulative0 + pair.lastPrice() * BLOCKTIME);\n assertEq(initialized, true);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Factory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Factory.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\n\ncontract UniswapV2FactoryTest is Test {\n UniswapV2Factory factory;\n\n address pool1;\n address hacker = address(10000004);\n address owner = address(10000005);\n\n address tokenA = address(10000006);\n address tokenB = address(10000007);\n\n address protocolFeeBeneficiary = address(10000005);\n\n uint256 tooBigFee;\n uint256 MAX_FEE;\n\n event PairCreated(\n address indexed token0,\n address indexed token1,\n address pair,\n uint256\n );\n event DefaultFeesSet(IUniswapV2Factory.DefaultFees fees);\n event LpFeesSet(address indexed pair, uint256 lpFee, bool overrideFee);\n event RoyaltiesFeesSet(\n address indexed pair,\n address beneficiary,\n uint256 royaltiesFee\n );\n event ProtocolFeesSet(\n address indexed pair,\n uint256 protocolFee,\n bool overrideFee\n );\n event ProtocolFeeBeneficiarySet(address beneficiary);\n\n function setUp() public {\n vm.prank(owner);\n factory = new UniswapV2Factory(0, 0, protocolFeeBeneficiary);\n\n MAX_FEE = factory.MAX_FEE();\n tooBigFee = MAX_FEE + 1;\n\n pool1 = _createPair(tokenA, tokenB);\n }\n\n function _assertFees(\n address _expectedPool,\n address _expectedRoyaltiesBeneficiary,\n uint256 _expectedRoyaltiesFee,\n uint256 _expectedProtocolFee,\n uint256 _expectedLpFee,\n address _expectedProtocolFeeBeneficiary\n ) public {\n (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n ) = factory.getFeesAndRecipients(_expectedPool);\n\n assertEq(lpFee, _expectedLpFee);\n assertEq(royaltiesBeneficiary, _expectedRoyaltiesBeneficiary);\n assertEq(royaltiesFee, _expectedRoyaltiesFee);\n assertEq(protocolBeneficiary, _expectedProtocolFeeBeneficiary);\n assertEq(protocolFee, _expectedProtocolFee);\n }\n\n function _createPair(\n address _tokenA,\n address _tokenB\n ) public returns (address pair) {\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n pair = factory.createPair(_tokenA, _tokenB);\n }\n\n function testSetDefaultFees(uint256 _lpFee, uint256 _protocolFee) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_protocolFee + _lpFee <= MAX_FEE);\n\n (uint256 protocolFee, uint256 lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n\n _assertFees(pool1, address(0), 0, 0, 0, protocolFeeBeneficiary);\n\n IUniswapV2Factory.DefaultFees memory fees = IUniswapV2Factory\n .DefaultFees({protocolFee: _protocolFee, lpFee: _lpFee});\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setDefaultFees(fees);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit DefaultFeesSet(fees);\n factory.setDefaultFees(fees);\n\n (protocolFee, lpFee) = factory.defaultFees();\n\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, _lpFee);\n\n _assertFees(\n pool1,\n address(0),\n 0,\n _protocolFee,\n _lpFee,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee,\n lpFee: _lpFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: _protocolFee,\n lpFee: tooBigFee\n })\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n factory.setDefaultFees(\n IUniswapV2Factory.DefaultFees({\n protocolFee: tooBigFee / 2 + 1,\n lpFee: tooBigFee / 2\n })\n );\n }\n\n function testSetLpFee(\n address _pair,\n uint256 _lpFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setLpFee(_pair, _lpFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setLpFee(_pair, _lpFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit LpFeesSet(_pair, _lpFee, true);\n factory.setLpFee(_pair, _lpFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n assertEq(lpFee, _lpFee);\n assertFalse(protocolFeeOverride);\n assertTrue(lpFeeOverride);\n\n _assertFees(_pair, address(0), 0, 0, _lpFee, protocolFeeBeneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _lpFee > MAX_FEE\");\n factory.setLpFee(_pair, tooBigFee, true);\n }\n\n function testSetRoyaltiesFee(\n address _pair,\n address _royaltiesBeneficiary,\n uint256 _royaltiesFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_royaltiesFee <= MAX_FEE);\n\n vm.assume(_pair != pool1);\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _beneficiary invalid\");\n factory.setRoyaltiesFee(_pair, address(0), _royaltiesFee);\n\n vm.assume(_royaltiesBeneficiary != address(0));\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit RoyaltiesFeesSet(_pair, _royaltiesBeneficiary, _royaltiesFee);\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, _royaltiesFee);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, _royaltiesBeneficiary);\n assertEq(royaltiesFee, _royaltiesFee);\n assertEq(protocolFee, 0);\n assertEq(lpFee, 0);\n assertFalse(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n _royaltiesBeneficiary,\n _royaltiesFee,\n 0,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _royaltiesFee > MAX_FEE\");\n factory.setRoyaltiesFee(_pair, _royaltiesBeneficiary, tooBigFee);\n }\n\n function testSetProtocolFee(\n address _pair,\n uint256 _protocolFee,\n address _tokenA,\n address _tokenB\n ) public {\n vm.assume(_protocolFee <= MAX_FEE);\n vm.assume(_pair != pool1);\n\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _pair invalid\");\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n _pair = _createPair(_tokenA, _tokenB);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeesSet(_pair, _protocolFee, true);\n factory.setProtocolFee(_pair, _protocolFee, true);\n\n (\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n uint256 protocolFee,\n uint256 lpFee,\n bool protocolFeeOverride,\n bool lpFeeOverride\n ) = factory.pairFees(_pair);\n\n assertEq(royaltiesBeneficiary, address(0));\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, _protocolFee);\n assertEq(lpFee, 0);\n assertTrue(protocolFeeOverride);\n assertFalse(lpFeeOverride);\n\n _assertFees(\n _pair,\n address(0),\n 0,\n _protocolFee,\n 0,\n protocolFeeBeneficiary\n );\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: _protocolFee > MAX_FEE\");\n factory.setProtocolFee(_pair, tooBigFee, true);\n }\n\n function testSetProtocolFeeBeneficiary(address _beneficiary) public {\n vm.assume(_beneficiary != address(0));\n\n vm.prank(hacker);\n vm.expectRevert(\"Ownable: caller is not the owner\");\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n vm.prank(owner);\n vm.expectEmit(true, true, true, true);\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n factory.setProtocolFeeBeneficiary(_beneficiary);\n\n assertEq(factory.protocolFeeBeneficiary(), _beneficiary);\n _assertFees(pool1, address(0), 0, 0, 0, _beneficiary);\n\n vm.prank(owner);\n vm.expectRevert(\"MagicswapV2: BENEFICIARY\");\n factory.setProtocolFeeBeneficiary(address(0));\n }\n\n function testGetFees(\n uint256 _lpFee,\n uint256 _royaltiesFee,\n uint256 _protocolFee\n ) public {\n vm.assume(_lpFee <= MAX_FEE);\n vm.assume(_royaltiesFee <= MAX_FEE);\n vm.assume(_protocolFee <= MAX_FEE);\n\n vm.startPrank(owner);\n factory.setLpFee(pool1, _lpFee, true);\n factory.setRoyaltiesFee(pool1, owner, _royaltiesFee);\n factory.setProtocolFee(pool1, _protocolFee, true);\n vm.stopPrank();\n\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = factory\n .getFees(pool1);\n uint256 totalFee = lpFee + royaltiesFee + protocolFee;\n\n assertEq(lpFee, _lpFee);\n\n /// logic below should check that:\n /// - totalFee is never above MAX_FEE\n /// - if _lpFee + _royaltiesFee + _protocolFee > MAX_FEE\n /// then we fill totalFee with fees in following priority:\n /// 1. lpFee\n /// 2. royaltiesFee\n /// 3. protocolFee\n /// until we get to MAX_FEE\n\n if (_lpFee < MAX_FEE) {\n if (_lpFee + _royaltiesFee < MAX_FEE) {\n assertEq(royaltiesFee, _royaltiesFee);\n\n if (_lpFee + _royaltiesFee + _protocolFee <= MAX_FEE) {\n assertEq(protocolFee, _protocolFee);\n assertEq(\n _lpFee + _royaltiesFee + _protocolFee,\n factory.getTotalFee(pool1)\n );\n } else {\n assertEq(protocolFee, MAX_FEE - _lpFee - _royaltiesFee);\n }\n } else {\n assertEq(royaltiesFee, MAX_FEE - _lpFee);\n assertEq(protocolFee, 0);\n }\n } else {\n assertEq(royaltiesFee, 0);\n assertEq(protocolFee, 0);\n }\n\n assertEq(totalFee, factory.getTotalFee(pool1));\n assertTrue(totalFee <= MAX_FEE);\n }\n\n function testCreatePair(address _tokenA, address _tokenB) public {\n vm.assume(_tokenA != address(0));\n vm.assume(_tokenB != address(0));\n vm.assume(_tokenA != _tokenB);\n\n vm.mockCall(\n _tokenA,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n vm.mockCall(\n _tokenB,\n abi.encodeCall(ERC20.decimals, ()),\n abi.encode(18)\n );\n\n (address token0, address token1) = UniswapV2Library.sortTokens(\n _tokenA,\n _tokenB\n );\n address expectedPair = UniswapV2Library.pairFor(\n address(factory),\n _tokenA,\n _tokenB\n );\n\n vm.expectEmit(true, true, true, true);\n emit PairCreated(token0, token1, expectedPair, 2);\n address pair = factory.createPair(_tokenA, _tokenB);\n\n assertEq(pair, expectedPair);\n assertEq(factory.getPair(_tokenA, _tokenB), pair);\n assertEq(factory.getPair(_tokenB, _tokenA), pair);\n assertEq(factory.allPairs(1), pair);\n assertEq(factory.allPairsLength(), 2);\n\n address[] memory allPairs = factory.allPairs();\n assertEq(allPairs[0], pool1);\n assertEq(allPairs[1], pair);\n }\n}\n" + }, + "contracts/UniswapV2/core/test/UniswapV2Pair.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC20Mintable.sol\";\n\nimport \"../UniswapV2Pair.sol\";\nimport \"../../periphery/libraries/UniswapV2Library.sol\";\nimport \"../UniswapV2Factory.sol\";\nimport \"./mock/UniswapV2PairOriginal.sol\";\n\ncontract UniswapV2PairTest is Test {\n UniswapV2Pair pair;\n UniswapV2Pair pairWithFees;\n UniswapV2PairOriginal pairOriginal;\n UniswapV2Factory factory;\n\n ERC20Mintable token0;\n ERC20Mintable token1;\n\n address user1 = address(10000001);\n address user2 = address(10000002);\n address user3 = address(10000003);\n address user4 = address(10000004);\n\n address protocolFeeBeneficiary = address(10000005);\n address royaltiesBeneficiary = address(10000006);\n\n uint256 royaltiesFee = 50;\n uint256 protocolFee = 50;\n\n function setUp() public {\n address tokenA = address(new ERC20Mintable());\n address tokenB = address(new ERC20Mintable());\n (tokenA, tokenB) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n token0 = ERC20Mintable(tokenA);\n token1 = ERC20Mintable(tokenB);\n\n factory = new UniswapV2Factory(0, 30, protocolFeeBeneficiary);\n\n vm.startPrank(address(factory));\n\n pair = new UniswapV2Pair();\n pair.initialize(address(token0), address(token1));\n\n pairOriginal = new UniswapV2PairOriginal();\n pairOriginal.initialize(address(token0), address(token1));\n\n pairWithFees = UniswapV2Pair(factory.createPair(address(token0), address(token1)));\n\n vm.stopPrank();\n\n factory.setRoyaltiesFee(address(pairWithFees), royaltiesBeneficiary, royaltiesFee);\n factory.setProtocolFee(address(pairWithFees), protocolFee, true);\n factory.setProtocolFeeBeneficiary(protocolFeeBeneficiary);\n }\n\n function _assertPairs(UniswapV2Pair _pair, UniswapV2PairOriginal _pairOriginal) public {\n assertEq(_pair.token0(), _pairOriginal.token0());\n assertEq(_pair.token1(), _pairOriginal.token1());\n\n (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _pair.getReserves();\n (uint112 _reserve0Org, uint112 _reserve1Org, uint32 _blockTimestampLastOrg) = _pairOriginal.getReserves();\n\n assertEq(_reserve0, _reserve0Org);\n assertEq(_reserve1, _reserve1Org);\n assertEq(_blockTimestampLast, _blockTimestampLastOrg);\n\n assertEq(_pair.factory(), _pairOriginal.factory());\n\n assertEq(token0.balanceOf(address(_pair)), token0.balanceOf(address(_pairOriginal)));\n assertEq(token1.balanceOf(address(_pair)), token1.balanceOf(address(_pairOriginal)));\n }\n\n function _addLiquidity(address _pair, uint256 _amount0, uint256 _amount1, address _to)\n public\n returns (uint256 liquidity)\n {\n token0.mint(_pair, _amount0);\n token1.mint(_pair, _amount1);\n\n liquidity = UniswapV2Pair(_pair).mint(_to);\n }\n\n function testMintBurnRegression(uint112 _amount0, uint112 _amount1) public {\n vm.assume(_amount0 > pair.MINIMUM_LIQUIDITY());\n vm.assume(_amount1 > pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidity = _addLiquidity(address(pair), _amount0, _amount1, user1);\n assertEq(liquidity, pair.totalSupply() - pair.MINIMUM_LIQUIDITY());\n\n uint256 liquidityOriginal = _addLiquidity(address(pairOriginal), _amount0, _amount1, user1);\n assertEq(liquidityOriginal, pairOriginal.totalSupply() - pairOriginal.MINIMUM_LIQUIDITY());\n\n assertEq(liquidity, liquidityOriginal);\n\n _assertPairs(pair, pairOriginal);\n\n vm.prank(user1);\n pair.transfer(address(pair), liquidity);\n (uint256 amount0, uint256 amount1) = pair.burn(user1);\n\n vm.prank(user1);\n pairOriginal.transfer(address(pairOriginal), liquidity);\n (uint256 amount0Org, uint256 amount1Org) = pairOriginal.burn(user2);\n\n assertEq(amount0, amount0Org);\n assertEq(amount1, amount1Org);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function _swap(address _pair, uint256 _amount0In, uint256 _amount1In, address _to)\n public\n returns (uint256 amountOut)\n {\n (uint112 reserve0, uint112 reserve1,) = UniswapV2Pair(_pair).getReserves();\n token0.mint(_pair, _amount0In);\n token1.mint(_pair, _amount1In);\n\n if (_amount0In > _amount1In) {\n uint256 amount1Out = UniswapV2Library.getAmountOut(_amount0In, reserve0, reserve1, _pair, address(factory));\n UniswapV2Pair(_pair).swap(0, amount1Out, _to, bytes(\"\"));\n amountOut = amount1Out;\n } else {\n uint256 amount0Out = UniswapV2Library.getAmountOut(_amount1In, reserve1, reserve0, _pair, address(factory));\n UniswapV2Pair(_pair).swap(amount0Out, 0, _to, bytes(\"\"));\n amountOut = amount0Out;\n }\n }\n\n function testSwapRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n uint256 amount1Out = _swap(address(pair), _amount0In, 0, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n assertEq(amount1Out, amount1OutOrg);\n _assertPairs(pair, pairOriginal);\n\n for (uint256 i = 0; i < 20; i++) {\n if (i % 2 == 0) {\n _swap(address(pair), _amount0In, 0, user1);\n _swap(address(pairOriginal), _amount0In, 0, user2);\n } else {\n _swap(address(pair), 0, _amount1In, user1);\n _swap(address(pairOriginal), 0, _amount1In, user2);\n }\n }\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSkimRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n pair.skim(user1);\n assertEq(token0.balanceOf(user1), _amount0In);\n assertEq(token1.balanceOf(user1), _amount1In);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n pairOriginal.skim(user2);\n assertEq(token0.balanceOf(user2), _amount0In);\n assertEq(token1.balanceOf(user2), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSyncRegression(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n\n _addLiquidity(address(pair), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pair, pairOriginal);\n\n token0.mint(address(pair), _amount0In);\n token1.mint(address(pair), _amount1In);\n token0.mint(address(pairOriginal), _amount0In);\n token1.mint(address(pairOriginal), _amount1In);\n\n _assertPairs(pair, pairOriginal);\n\n pair.sync();\n pairOriginal.sync();\n\n _assertPairs(pair, pairOriginal);\n }\n\n function testSwapWithFees(uint96 _reserve0, uint96 _reserve1, uint72 _amount0In, uint72 _amount1In, uint256 _hijackAmount) public {\n vm.assume(_reserve0 > 10000e18);\n vm.assume(_reserve1 > 10000e18);\n vm.assume(_amount0In > 0.001e18);\n vm.assume(_amount1In > 0.001e18);\n vm.assume(_amount0In > _hijackAmount);\n\n _addLiquidity(address(pairWithFees), _reserve0, _reserve1, user3);\n _addLiquidity(address(pairOriginal), _reserve0, _reserve1, user3);\n\n _assertPairs(pairWithFees, pairOriginal);\n\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), 0);\n\n (, address beneficiary, uint256 royalties, address protocolBeneficiary, uint256 protocolBeneficiaryFee) =\n factory.getFeesAndRecipients(address(pairWithFees));\n\n assertEq(beneficiary, royaltiesBeneficiary);\n assertEq(royalties, royaltiesFee);\n assertEq(token0.balanceOf(beneficiary), 0);\n uint256 royaltiesAmount = _amount0In * royalties / 10000;\n\n assertEq(protocolBeneficiary, protocolFeeBeneficiary);\n assertEq(protocolBeneficiaryFee, protocolFee);\n assertEq(token0.balanceOf(protocolBeneficiary), 0);\n uint256 protocolFeeAmount = _amount0In * protocolBeneficiaryFee / 10000;\n\n uint256 amount1Out = _swap(address(pairWithFees), _amount0In, _hijackAmount, user1);\n assertEq(token0.balanceOf(user1), 0);\n assertEq(token1.balanceOf(user1), amount1Out);\n assertEq(token0.balanceOf(beneficiary), royaltiesAmount);\n assertEq(token0.balanceOf(protocolBeneficiary), protocolFeeAmount);\n assertEq(token1.balanceOf(beneficiary), _hijackAmount * royalties / 10000);\n assertEq(token1.balanceOf(protocolBeneficiary), _hijackAmount * protocolBeneficiaryFee / 10000);\n\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), 0);\n\n uint256 amount1OutOrg = _swap(address(pairOriginal), _amount0In, 0, user2);\n assertEq(token0.balanceOf(user2), 0);\n assertEq(token1.balanceOf(user2), amount1OutOrg);\n\n uint256 maxPercentDelta = (royaltiesFee + protocolFee + 1) * 1e18 / 10000;\n assertApproxEqRel(amount1Out, amount1OutOrg, maxPercentDelta);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./interfaces/IUniswapV2ERC20.sol\";\nimport \"./libraries/SafeMath.sol\";\n\ncontract UniswapV2ERC20 is IUniswapV2ERC20 {\n using SafeMath for uint256;\n\n string public constant name = \"Magicswap V2\";\n string public constant symbol = \"MAGIC-V2\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n bytes32 public override DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant override PERMIT_TYPEHASH =\n 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint256) public nonces;\n\n constructor() {\n uint256 chainId;\n assembly {\n chainId := chainid()\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(bytes(\"1\")),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint256 value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint256 value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n external\n {\n require(deadline >= block.timestamp, \"MagicswapV2: EXPIRED\");\n bytes32 digest = keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"MagicswapV2: INVALID_SIGNATURE\");\n _approve(owner, spender, value);\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Factory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\n\nimport \"./interfaces/IUniswapV2Factory.sol\";\nimport \"./UniswapV2Pair.sol\";\n\ncontract UniswapV2Factory is IUniswapV2Factory, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n\n /// @dev Fee is denominated in basis points so 5000 / 10000 = 50%\n uint256 public constant MAX_FEE = 5000;\n\n address public protocolFeeBeneficiary;\n\n mapping(address => mapping(address => address)) public getPair;\n EnumerableSet.AddressSet private _allPairs;\n\n DefaultFees public defaultFees;\n mapping(address => Fees) public pairFees;\n\n constructor(uint256 _defaultProtocolFee, uint256 _defaultLpFee, address _protocolFeeBeneficiary) {\n DefaultFees memory startFees = DefaultFees({protocolFee: _defaultProtocolFee, lpFee: _defaultLpFee});\n\n setDefaultFees(startFees);\n setProtocolFeeBeneficiary(_protocolFeeBeneficiary);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getTotalFee(address _pair) public view returns (uint256) {\n (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) = _getFees(_pair);\n return lpFee + royaltiesFee + protocolFee;\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFees(address _pair) public view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n return _getFees(_pair);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function getFeesAndRecipients(address _pair)\n public\n view\n returns (\n uint256 lpFee,\n address royaltiesBeneficiary,\n uint256 royaltiesFee,\n address protocolBeneficiary,\n uint256 protocolFee\n )\n {\n (lpFee, royaltiesFee, protocolFee) = _getFees(_pair);\n\n royaltiesBeneficiary = pairFees[_pair].royaltiesBeneficiary;\n protocolBeneficiary = protocolFeeBeneficiary;\n }\n\n function allPairs() external view returns (address[] memory) {\n return _allPairs.values();\n }\n\n function allPairs(uint256 _index) external view returns (address) {\n return _allPairs.at(_index);\n }\n\n function allPairsLength() external view returns (uint256) {\n return _allPairs.length();\n }\n\n function createPair(address tokenA, address tokenB) external returns (address pair) {\n require(tokenA != tokenB, \"MagicswapV2: IDENTICAL_ADDRESSES\");\n (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"MagicswapV2: ZERO_ADDRESS\");\n require(getPair[token0][token1] == address(0), \"MagicswapV2: PAIR_EXISTS\"); // single check is sufficient\n bytes memory bytecode = type(UniswapV2Pair).creationCode;\n bytes32 salt = keccak256(abi.encodePacked(token0, token1));\n assembly {\n pair := create2(0, add(bytecode, 32), mload(bytecode), salt)\n }\n IUniswapV2Pair(pair).initialize(token0, token1);\n getPair[token0][token1] = pair;\n getPair[token1][token0] = pair; // populate mapping in the reverse direction\n _allPairs.add(pair);\n emit PairCreated(token0, token1, pair, _allPairs.length());\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setDefaultFees(DefaultFees memory _fees) public onlyOwner {\n require(_fees.protocolFee <= MAX_FEE, \"MagicswapV2: protocolFee > MAX_FEE\");\n require(_fees.lpFee <= MAX_FEE, \"MagicswapV2: lpFee > MAX_FEE\");\n require(_fees.protocolFee + _fees.lpFee <= MAX_FEE, \"MagicswapV2: protocolFee + lpFee > MAX_FEE\");\n\n defaultFees = _fees;\n\n emit DefaultFeesSet(_fees);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setLpFee(address _pair, uint256 _lpFee, bool _overrideFee) external onlyOwner {\n require(_lpFee <= MAX_FEE, \"MagicswapV2: _lpFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].lpFee = _lpFee;\n pairFees[_pair].lpFeeOverride = _overrideFee;\n\n emit LpFeesSet(_pair, _lpFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setRoyaltiesFee(address _pair, address _beneficiary, uint256 _royaltiesFee) external onlyOwner {\n require(_royaltiesFee <= MAX_FEE, \"MagicswapV2: _royaltiesFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n require(_beneficiary != address(0), \"MagicswapV2: _beneficiary invalid\");\n\n pairFees[_pair].royaltiesBeneficiary = _beneficiary;\n pairFees[_pair].royaltiesFee = _royaltiesFee;\n\n emit RoyaltiesFeesSet(_pair, _beneficiary, _royaltiesFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFee(address _pair, uint256 _protocolFee, bool _overrideFee) external onlyOwner {\n require(_protocolFee <= MAX_FEE, \"MagicswapV2: _protocolFee > MAX_FEE\");\n require(_allPairs.contains(_pair), \"MagicswapV2: _pair invalid\");\n\n pairFees[_pair].protocolFee = _protocolFee;\n pairFees[_pair].protocolFeeOverride = _overrideFee;\n\n emit ProtocolFeesSet(_pair, _protocolFee, _overrideFee);\n }\n\n /// @inheritdoc IUniswapV2Factory\n function setProtocolFeeBeneficiary(address _beneficiary) public onlyOwner {\n require(_beneficiary != address(0), \"MagicswapV2: BENEFICIARY\");\n protocolFeeBeneficiary = _beneficiary;\n\n emit ProtocolFeeBeneficiarySet(_beneficiary);\n }\n\n function _getLpFee(address _pair) internal view returns (uint256 lpFee) {\n if (pairFees[_pair].lpFeeOverride) {\n return pairFees[_pair].lpFee;\n } else {\n return defaultFees.lpFee;\n }\n }\n\n function _getRoyaltiesFee(address _pair) internal view returns (uint256 royaltiesFee) {\n return pairFees[_pair].royaltiesFee;\n }\n\n function _getProtocolFee(address _pair) internal view returns (uint256 protocolFee) {\n if (pairFees[_pair].protocolFeeOverride) {\n return pairFees[_pair].protocolFee;\n } else {\n return defaultFees.protocolFee;\n }\n }\n\n function _getFees(address _pair) internal view returns (uint256 lpFee, uint256 royaltiesFee, uint256 protocolFee) {\n lpFee = _getLpFee(_pair);\n /// lpFee should never be above MAX_FEE but never too safe.\n /// If lpFee is set to MAX_FEE then we know there's no more space for other fees\n if (lpFee >= MAX_FEE) {\n return (MAX_FEE, 0, 0);\n }\n\n royaltiesFee = _getRoyaltiesFee(_pair);\n /// if royaltiesFee + lpFee is greater than MAX_FEE, then decrease royaltiesFee\n /// and return as we know there's no more space for other fees\n if (royaltiesFee >= MAX_FEE - lpFee) {\n return (lpFee, MAX_FEE - lpFee, 0);\n }\n\n protocolFee = _getProtocolFee(_pair);\n /// if protocolFee + royaltiesFee + lpFee is greater than MAX_FEE, then decrease protocolFee\n if (protocolFee > MAX_FEE - lpFee - royaltiesFee) {\n protocolFee = MAX_FEE - lpFee - royaltiesFee;\n }\n }\n}\n" + }, + "contracts/UniswapV2/core/UniswapV2Pair.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"./interfaces/IUniswapV2Pair.sol\";\nimport \"./interfaces/IUniswapV2Factory.sol\";\n\nimport \"./libraries/UniswapV2Math.sol\";\nimport \"./libraries/Oracle.sol\";\n\nimport \"./UniswapV2ERC20.sol\";\n\ncontract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {\n using SafeMath for uint256;\n using Oracle for Oracle.Observation[65535];\n\n uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3;\n uint256 public constant BASIS_POINTS = 10000;\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\"transfer(address,uint256)\")));\n\n // decimal points of token0\n uint256 public TOKEN0_DECIMALS;\n\n address public factory;\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n // the most recent price of token1/token0. Inherits decimals of token1.\n uint256 public lastPrice;\n // the most-recently updated index of the observations array\n uint16 public observationIndex;\n // the current maximum number of observations that are being stored\n uint16 public observationCardinality;\n // the next maximum number of observations to store, triggered in observations.write\n uint16 public observationCardinalityNext;\n\n Oracle.Observation[65535] public override observations;\n\n uint256 private unlocked = 1;\n\n modifier lock() {\n require(unlocked == 1, \"MagicswapV2: LOCKED\");\n unlocked = 0;\n _;\n unlocked = 1;\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n\n function _safeTransfer(address token, address to, uint256 value) private {\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"MagicswapV2: TRANSFER_FAILED\");\n }\n\n constructor() {\n factory = msg.sender;\n }\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n require(msg.sender == factory, \"MagicswapV2: FORBIDDEN\"); // sufficient check\n token0 = _token0;\n token1 = _token1;\n\n TOKEN0_DECIMALS = UniswapV2ERC20(_token0).decimals();\n\n (uint16 cardinality, uint16 cardinalityNext) = observations.initialize(_blockTimestamp());\n\n observationIndex = 0;\n observationCardinality = cardinality;\n observationCardinalityNext = cardinalityNext;\n }\n\n function _blockTimestamp() internal view virtual returns (uint32) {\n return uint32(block.timestamp); // truncation is desired\n }\n\n /// @dev update reserves and, on the first call per block, price accumulators\n function _update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) private {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"MagicswapV2: OVERFLOW\");\n\n uint32 blockTimestamp;\n uint32 timeElapsed;\n unchecked {\n blockTimestamp = uint32(block.timestamp % 2 ** 32);\n timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n }\n\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // this is first trade of the block and reserves are not yet updated\n lastPrice = 10 ** TOKEN0_DECIMALS * _reserve1 / _reserve0;\n\n // write an oracle entry\n (observationIndex, observationCardinality) = observations.write(\n observationIndex, _blockTimestamp(), lastPrice, observationCardinality, observationCardinalityNext\n );\n }\n\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n emit Sync(reserve0, reserve1);\n }\n\n /// @dev Calculates fees and sends them to beneficiaries\n function _takeFees(uint256 balance0Adjusted, uint256 balance1Adjusted, uint256 amount0In, uint256 amount1In)\n internal\n returns (uint256 balance0, uint256 balance1)\n {\n (, address royaltiesBeneficiary, uint256 royaltiesFee, address protocolFeeBeneficiary, uint256 protocolFee) =\n IUniswapV2Factory(factory).getFeesAndRecipients(address(this));\n\n address _token0 = token0;\n address _token1 = token1;\n\n for (uint8 i = 0; i < 2; i++) {\n address feeToken = i == 0 ? _token0 : _token1;\n uint256 swapAmount = i == 0 ? amount0In : amount1In;\n\n if (swapAmount > 0) {\n uint256 royaltiesFeeAmount = swapAmount * royaltiesFee / BASIS_POINTS;\n\n // send royalties\n if (royaltiesFeeAmount > 0) {\n _safeTransfer(feeToken, royaltiesBeneficiary, royaltiesFeeAmount);\n }\n\n uint256 protocolFeeAmount = swapAmount * protocolFee / BASIS_POINTS;\n\n // send protocol fee\n if (protocolFeeAmount > 0) {\n _safeTransfer(feeToken, protocolFeeBeneficiary, protocolFeeAmount);\n }\n }\n }\n\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n // Make sure that either balance does not go below adjusted balance used for K calcualtions.\n // If balances after fee transfers are above or equal adjusted balances then K still holds.\n require(balance0 >= balance0Adjusted / BASIS_POINTS, \"MagicswapV2: balance0Adjusted\");\n require(balance1 >= balance1Adjusted / BASIS_POINTS, \"MagicswapV2: balance1Adjusted\");\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function mint(address to) external lock returns (uint256 liquidity) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n uint256 balance0 = IERC20(token0).balanceOf(address(this));\n uint256 balance1 = IERC20(token1).balanceOf(address(this));\n uint256 amount0 = balance0.sub(_reserve0);\n uint256 amount1 = balance1.sub(_reserve1);\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n if (_totalSupply == 0) {\n liquidity = UniswapV2Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n } else {\n liquidity = UniswapV2Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);\n }\n require(liquidity > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_MINTED\");\n _mint(to, liquidity);\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Mint(msg.sender, amount0, amount1);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n function burn(address to) external lock returns (uint256 amount0, uint256 amount1) {\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n uint256 balance0 = IERC20(_token0).balanceOf(address(this));\n uint256 balance1 = IERC20(_token1).balanceOf(address(this));\n uint256 liquidity = balanceOf[address(this)];\n\n uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\n amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution\n amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution\n require(amount0 > 0 && amount1 > 0, \"MagicswapV2: INSUFFICIENT_LIQUIDITY_BURNED\");\n _burn(address(this), liquidity);\n _safeTransfer(_token0, to, amount0);\n _safeTransfer(_token1, to, amount1);\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Burn(msg.sender, amount0, amount1, to);\n }\n\n /// @dev this low-level function should be called from a contract which performs important safety checks\n /// @dev keeping bytes parameter for backward compatibility of the interface\n function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external lock {\n require(amount0Out > 0 || amount1Out > 0, \"MagicswapV2: INSUFFICIENT_OUTPUT_AMOUNT\");\n (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \"MagicswapV2: INSUFFICIENT_LIQUIDITY\");\n\n uint256 balance0;\n uint256 balance1;\n {\n // scope for _token{0,1}, avoids stack too deep errors\n address _token0 = token0;\n address _token1 = token1;\n require(to != _token0 && to != _token1, \"MagicswapV2: INVALID_TO\");\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\n balance0 = IERC20(_token0).balanceOf(address(this));\n balance1 = IERC20(_token1).balanceOf(address(this));\n }\n uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;\n uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;\n require(amount0In > 0 || amount1In > 0, \"MagicswapV2: INSUFFICIENT_INPUT_AMOUNT\");\n\n {\n // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(address(this));\n uint256 balance0Adjusted = balance0.mul(BASIS_POINTS).sub(amount0In.mul(totalFee));\n uint256 balance1Adjusted = balance1.mul(BASIS_POINTS).sub(amount1In.mul(totalFee));\n require(\n balance0Adjusted.mul(balance1Adjusted) >= uint256(_reserve0).mul(_reserve1).mul(BASIS_POINTS ** 2),\n \"MagicswapV2: K\"\n );\n (balance0, balance1) = _takeFees(balance0Adjusted, balance1Adjusted, amount0In, amount1In);\n }\n\n _update(balance0, balance1, _reserve0, _reserve1);\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\n }\n\n /// @dev Read TWAP price\n function observe(uint32[] calldata secondsAgos)\n external\n view\n override\n returns (uint256[] memory priceCumulatives)\n {\n return observations.observe(_blockTimestamp(), secondsAgos, lastPrice, observationIndex, observationCardinality);\n }\n\n /// @dev Increase number of data points for price history\n function increaseObservationCardinalityNext(uint16 _observationCardinalityNext) external override lock {\n uint16 observationCardinalityNextOld = observationCardinalityNext; // for the event\n uint16 observationCardinalityNextNew =\n observations.grow(observationCardinalityNextOld, _observationCardinalityNext);\n observationCardinalityNext = observationCardinalityNextNew;\n if (observationCardinalityNextOld != observationCardinalityNextNew) {\n emit IncreaseObservationCardinalityNext(observationCardinalityNextOld, observationCardinalityNextNew);\n }\n }\n\n /// @dev force balances to match reserves\n function skim(address to) external lock {\n address _token0 = token0; // gas savings\n address _token1 = token1; // gas savings\n _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));\n _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));\n }\n\n /// @dev force reserves to match balances\n function sync() external lock {\n _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/Babylonian.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// computes square roots using the babylonian method\n// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method\nlibrary Babylonian {\n // credit for this implementation goes to\n // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687\n function sqrt(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);\n // however that code costs significantly more gas\n uint256 xx = x;\n uint256 r = 1;\n if (xx >= 0x100000000000000000000000000000000) {\n xx >>= 128;\n r <<= 64;\n }\n if (xx >= 0x10000000000000000) {\n xx >>= 64;\n r <<= 32;\n }\n if (xx >= 0x100000000) {\n xx >>= 32;\n r <<= 16;\n }\n if (xx >= 0x10000) {\n xx >>= 16;\n r <<= 8;\n }\n if (xx >= 0x100) {\n xx >>= 8;\n r <<= 4;\n }\n if (xx >= 0x10) {\n xx >>= 4;\n r <<= 2;\n }\n if (xx >= 0x8) {\n r <<= 1;\n }\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1;\n r = (r + x / r) >> 1; // Seven iterations should be enough\n uint256 r1 = x / r;\n return (r < r1 ? r : r1);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/BitMath.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.20;\n\nlibrary BitMath {\n // returns the 0 indexed position of the most significant bit of the input x\n // s.t. x >= 2**msb and x < 2**(msb+1)\n function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::mostSignificantBit: zero\");\n\n if (x >= 0x100000000000000000000000000000000) {\n x >>= 128;\n r += 128;\n }\n if (x >= 0x10000000000000000) {\n x >>= 64;\n r += 64;\n }\n if (x >= 0x100000000) {\n x >>= 32;\n r += 32;\n }\n if (x >= 0x10000) {\n x >>= 16;\n r += 16;\n }\n if (x >= 0x100) {\n x >>= 8;\n r += 8;\n }\n if (x >= 0x10) {\n x >>= 4;\n r += 4;\n }\n if (x >= 0x4) {\n x >>= 2;\n r += 2;\n }\n if (x >= 0x2) r += 1;\n }\n\n // returns the 0 indexed position of the least significant bit of the input x\n // s.t. (x & 2**lsb) != 0 and (x & (2**(lsb) - 1)) == 0)\n // i.e. the bit at the index is set and the mask of all lower bits is 0\n function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n require(x > 0, \"BitMath::leastSignificantBit: zero\");\n\n r = 255;\n if (x & type(uint128).max > 0) {\n r -= 128;\n } else {\n x >>= 128;\n }\n if (x & type(uint64).max > 0) {\n r -= 64;\n } else {\n x >>= 64;\n }\n if (x & type(uint32).max > 0) {\n r -= 32;\n } else {\n x >>= 32;\n }\n if (x & type(uint16).max > 0) {\n r -= 16;\n } else {\n x >>= 16;\n }\n if (x & type(uint8).max > 0) {\n r -= 8;\n } else {\n x >>= 8;\n }\n if (x & 0xf > 0) {\n r -= 4;\n } else {\n x >>= 4;\n }\n if (x & 0x3 > 0) {\n r -= 2;\n } else {\n x >>= 2;\n }\n if (x & 0x1 > 0) r -= 1;\n }\n}\n" + }, + "contracts/UniswapV2/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: CC-BY-4.0\npragma solidity 0.8.20;\n\n// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1\n// license is CC-BY-4.0\nlibrary FullMath {\n function inverse(uint256 x) internal pure returns (uint256) {\n if (x == 0) return 0;\n\n return type(uint256).max - x + 1;\n }\n\n function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {\n uint256 mm = mulmod(x, y, type(uint256).max);\n l = x * y;\n h = mm - l;\n if (mm < l) h -= 1;\n }\n\n function fullDiv(uint256 l, uint256 h, uint256 d) private pure returns (uint256) {\n uint256 pow2 = d & inverse(d);\n d /= pow2;\n l /= pow2;\n l += h * ((inverse(pow2)) / pow2 + 1);\n uint256 r = 1;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n r *= 2 - d * r;\n return l * r;\n }\n\n function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) {\n (uint256 l, uint256 h) = fullMul(x, y);\n\n uint256 mm = mulmod(x, y, d);\n if (mm > l) h -= 1;\n l -= mm;\n\n if (h == 0) return l / d;\n\n require(h < d, \"FullMath: FULLDIV_OVERFLOW\");\n return fullDiv(l, h, d);\n }\n}\n" + }, + "contracts/UniswapV2/libraries/TransferHelper.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity 0.8.20;\n\n// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false\nlibrary TransferHelper {\n function safeApprove(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('approve(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeApprove: approve failed\"\n );\n }\n\n function safeTransfer(address token, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transfer(address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))), \"TransferHelper::safeTransfer: transfer failed\"\n );\n }\n\n function safeTransferFrom(address token, address from, address to, uint256 value) internal {\n // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\n require(\n success && (data.length == 0 || abi.decode(data, (bool))),\n \"TransferHelper::transferFrom: transferFrom failed\"\n );\n }\n\n function safeTransferETH(address to, uint256 value) internal {\n (bool success,) = to.call{value: value}(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n }\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IERC20 {\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns (uint256);\n function balanceOf(address owner) external view returns (uint256);\n function allowance(address owner, address spender) external view returns (uint256);\n\n function approve(address spender, uint256 value) external returns (bool);\n function transfer(address to, uint256 value) external returns (bool);\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IUniswapV2Router01.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IUniswapV2Router01 {\n\n error UniswapV2RouterExpired();\n error UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n error UniswapV2RouterInsufficientBAmount();\n error UniswapV2RouterInsufficientAAmount();\n error UniswapV2RouterInsufficientOutputAmount();\n error UniswapV2RouterExcessiveInputAmount();\n error UniswapV2RouterInvalidPath();\n\n function factory() external view returns (address);\n function WETH() external view returns (address);\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external returns (uint256 amountToken, uint256 amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountA, uint256 amountB);\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external returns (uint256 amountToken, uint256 amountETH);\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external returns (uint256[] memory amounts);\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n external\n payable\n returns (uint256[] memory amounts);\n\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountOut);\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n external\n view\n returns (uint256 amountIn);\n function getAmountsOut(uint256 amountIn, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n function getAmountsIn(uint256 amountOut, address[] calldata path)\n external\n view\n returns (uint256[] memory amounts);\n}\n" + }, + "contracts/UniswapV2/periphery/interfaces/IWETH.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\ninterface IWETH {\n function deposit() external payable;\n function transfer(address to, uint value) external returns (bool);\n function withdraw(uint) external;\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/OracleLibrary.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\n\n/// @title Oracle library\n/// @notice Provides functions to integrate with MagicswapV2 pool oracle\nlibrary OracleLibrary {\n /// @notice Fetches time-weighted average price using MagicswapV2 oracle\n /// @param pool Address of Uniswap V3 pool that we want to observe\n /// @param period Number of seconds in the past to start calculating time-weighted average\n /// @return timeWeightedAveragePrice The time-weighted average tick from (block.timestamp - period) to block.timestamp\n function consult(address pool, uint32 period) internal view returns (uint256 timeWeightedAveragePrice) {\n require(period != 0, \"BP\");\n\n uint32[] memory secondAgos = new uint32[](2);\n secondAgos[0] = period;\n secondAgos[1] = 0;\n\n uint256[] memory priceCumulatives = IUniswapV2Pair(pool).observe(secondAgos);\n uint256 priceCumulativesDelta = priceCumulatives[1] - priceCumulatives[0];\n\n timeWeightedAveragePrice = priceCumulativesDelta / period;\n }\n}\n" + }, + "contracts/UniswapV2/periphery/libraries/UniswapV2Library.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n// import {IContractDeployer} from \"zksync-system-contracts/interfaces/IContractDeployer.sol\";\nimport \"../../core/interfaces/IUniswapV2Pair.sol\";\nimport \"../../core/interfaces/IUniswapV2Factory.sol\";\nimport {UniswapV2Pair} from \"../../core/UniswapV2Pair.sol\";\nimport \"../../core/libraries/SafeMath.sol\";\n\n/**\n * @notice Modified UniswapV2 to work with zksync stack based CREATE2\n **/\nlibrary UniswapV2Library {\n using SafeMath for uint256;\n\n /// @dev returns sorted token addresses, used to handle return values from pairs sorted in this order\n function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {\n require(tokenA != tokenB, \"UniswapV2Library: IDENTICAL_ADDRESSES\");\n (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\n require(token0 != address(0), \"UniswapV2Library: ZERO_ADDRESS\");\n }\n\n // // calculates the CREATE2 address for a pair without making any external calls\n // function pairFor2(\n // address factory,\n // address tokenA,\n // address tokenB\n // ) internal pure returns (address pair) {\n // (address token0, address token1) = sortTokens(tokenA, tokenB);\n // pair = address(uint160(\n // uint256(\n // keccak256(\n // abi.encodePacked(\n // bytes32(0x2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494), // keccak256(\"zksyncCreate2\")\n // bytes32(uint256(uint160(0x4bC46e1fEA69E83E6adDc98462963093AAbC5226))), // sender\n // keccak256(abi.encodePacked(0x1282f34438cB205D201DD357398b85E7729Dd3a2, 0x892d81728eB3B33E463AEEdc2dC167130E74Be8c)), // salt\n // hex'0100065f2f2a556816a482652f101ddda2947216a5720dd91a79c61709cbf2b8', // init code hash\n // bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) // constructor input hash: keccak256(\"\")\n // )\n // )\n // )\n // ));\n // }\n\n /// @dev calculates the CREATE2 address for a pair without making any external calls\n function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {\n // (address token0, address token1) = sortTokens(tokenA, tokenB);\n // bytes32 salt = keccak256(abi.encodePacked(token0, token1));\n pair = tokenA;\n // pair = IContractDeployer(0x0000000000000000000000000000000000008006).getNewAddressCreate2( \n // factory,\n // Utils.hashL2Bytecode(type(UniswapV2Pair).creationCode),\n // salt,\n // abi.encode(\"\")\n // );\n }\n\n /// @dev fetches and sorts the reserves for a pair\n function getReserves(address factory, address tokenA, address tokenB)\n internal\n view\n returns (uint256 reserveA, uint256 reserveB)\n {\n (address token0,) = sortTokens(tokenA, tokenB);\n (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();\n (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);\n }\n\n /// @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) {\n require(amountA > 0, \"UniswapV2Library: INSUFFICIENT_AMOUNT\");\n require(reserveA > 0 && reserveB > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n amountB = amountA.mul(reserveB) / reserveA;\n }\n\n /// @dev given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountOut)\n {\n require(amountIn > 0, \"UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 amountInWithFee = amountIn.mul(10000 - totalFee);\n uint256 numerator = amountInWithFee.mul(reserveOut);\n uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);\n amountOut = numerator / denominator;\n }\n\n /// @dev given an output amount of an asset and pair reserves, returns a required input amount of the other asset\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair, address factory)\n internal\n view\n returns (uint256 amountIn)\n {\n require(amountOut > 0, \"UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT\");\n require(reserveIn > 0 && reserveOut > 0, \"UniswapV2Library: INSUFFICIENT_LIQUIDITY\");\n uint256 totalFee = IUniswapV2Factory(factory).getTotalFee(pair);\n uint256 numerator = reserveIn.mul(amountOut).mul(10000);\n uint256 denominator = reserveOut.sub(amountOut).mul(10000 - totalFee);\n amountIn = (numerator / denominator).add(1);\n }\n\n /// @dev performs chained getAmountOut calculations on any number of pairs\n function getAmountsOut(address factory, uint256 amountIn, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[0] = amountIn;\n for (uint256 i; i < path.length - 1; i++) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);\n amounts[i + 1] =\n getAmountOut(amounts[i], reserveIn, reserveOut, pairFor(factory, path[i], path[i + 1]), factory);\n }\n }\n\n /// @dev performs chained getAmountIn calculations on any number of pairs\n function getAmountsIn(address factory, uint256 amountOut, address[] memory path)\n internal\n view\n returns (uint256[] memory amounts)\n {\n require(path.length >= 2, \"UniswapV2Library: INVALID_PATH\");\n amounts = new uint[](path.length);\n amounts[amounts.length - 1] = amountOut;\n for (uint256 i = path.length - 1; i > 0; i--) {\n (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);\n address pair = pairFor(factory, path[i - 1], path[i]);\n amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, pair, factory);\n }\n }\n}\n" + }, + "contracts/UniswapV2/periphery/UniswapV2Router02.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../core/interfaces/IUniswapV2Factory.sol\";\nimport \"../core/interfaces/IUniswapV2ERC20.sol\";\nimport \"../core/libraries/SafeMath.sol\";\nimport \"../libraries/TransferHelper.sol\";\n\nimport \"./interfaces/IUniswapV2Router01.sol\";\nimport \"./libraries/UniswapV2Library.sol\";\nimport \"./interfaces/IWETH.sol\";\n\ncontract UniswapV2Router02 is IUniswapV2Router01 {\n using SafeMath for uint256;\n\n address public immutable override factory;\n address public immutable override WETH;\n\n \n modifier ensure(uint256 deadline) {\n if(deadline < block.timestamp) revert UniswapV2RouterExpired();\n _;\n }\n\n constructor(address _factory, address _WETH) {\n factory = _factory;\n WETH = _WETH;\n }\n\n receive() external payable {\n if(msg.sender != WETH) revert UniswapV2RouterOnlyAcceptETHViaFallbackFromWETHContract();\n }\n\n // **** ADD LIQUIDITY ****\n function _addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin\n ) internal virtual returns (uint256 amountA, uint256 amountB) {\n // create the pair if it doesn't exist yet\n if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {\n IUniswapV2Factory(factory).createPair(tokenA, tokenB);\n }\n (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);\n if (reserveA == 0 && reserveB == 0) {\n (amountA, amountB) = (amountADesired, amountBDesired);\n } else {\n uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);\n if (amountBOptimal <= amountBDesired) {\n if(amountBOptimal < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n (amountA, amountB) = (amountADesired, amountBOptimal);\n } else {\n uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);\n assert(amountAOptimal <= amountADesired);\n if(amountAOptimal < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n (amountA, amountB) = (amountAOptimal, amountBDesired);\n }\n }\n }\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint256 amountADesired,\n uint256 amountBDesired,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) {\n (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);\n TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);\n liquidity = IUniswapV2Pair(pair).mint(to);\n }\n\n function addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) external payable virtual override returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH, liquidity) =\n _addLiquidityETH(token, amountTokenDesired, amountTokenMin, amountETHMin, msg.sender, to, deadline);\n }\n\n function _addLiquidityETH(\n address token,\n uint256 amountTokenDesired,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {\n (amountToken, amountETH) =\n _addLiquidity(token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n TransferHelper.safeTransferFrom(token, from, pair, amountToken);\n IWETH(WETH).deposit{value: amountETH}();\n assert(IWETH(WETH).transfer(pair, amountETH));\n liquidity = IUniswapV2Pair(pair).mint(to);\n // refund dust eth, if any\n if (msg.value > amountETH) TransferHelper.safeTransferETH(to, msg.value - amountETH);\n }\n\n // **** REMOVE LIQUIDITY ****\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n IUniswapV2ERC20(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair\n (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);\n (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);\n (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);\n if(amountA < amountAMin) revert UniswapV2RouterInsufficientAAmount();\n if(amountB < amountBMin) revert UniswapV2RouterInsufficientBAmount();\n }\n\n function removeLiquidityETH(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline\n ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {\n (amountToken, amountETH) =\n removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);\n TransferHelper.safeTransfer(token, to, amountToken);\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(to, amountETH);\n }\n\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint256 liquidity,\n uint256 amountAMin,\n uint256 amountBMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountA, uint256 amountB) {\n address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);\n }\n\n function removeLiquidityETHWithPermit(\n address token,\n uint256 liquidity,\n uint256 amountTokenMin,\n uint256 amountETHMin,\n address to,\n uint256 deadline,\n bool approveMax,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external virtual override returns (uint256 amountToken, uint256 amountETH) {\n address pair = UniswapV2Library.pairFor(factory, token, WETH);\n uint256 value = approveMax ? type(uint256).max : liquidity;\n IUniswapV2ERC20(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);\n }\n\n // **** SWAP ****\n // requires the initial amount to have already been sent to the first pair\n function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual {\n for (uint256 i; i < path.length - 1; i++) {\n (address input, address output) = (path[i], path[i + 1]);\n (address token0,) = UniswapV2Library.sortTokens(input, output);\n uint256 amountOut = amounts[i + 1];\n (uint256 amount0Out, uint256 amount1Out) =\n input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));\n address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;\n IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(\n amount0Out, amount1Out, to, new bytes(0)\n );\n }\n }\n\n function swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address to,\n uint256 deadline\n ) public virtual override returns (uint256[] memory amounts) {\n amounts = _swapExactTokensForTokens(amountIn, amountOutMin, path, msg.sender, to, deadline);\n }\n\n function _swapExactTokensForTokens(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] memory path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override returns (uint256[] memory amounts) {\n amounts = _swapTokensForExactTokens(amountOut, amountInMax, path, msg.sender, to, deadline);\n }\n\n function _swapTokensForExactTokens(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address from,\n address to,\n uint256 deadline\n ) internal ensure(deadline) returns (uint256[] memory amounts) {\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(path[0], from, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);\n _swap(amounts, path, to);\n }\n\n function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)\n external\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n }\n\n function swapTokensForExactETH(\n uint256 amountOut,\n uint256 amountInMax,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > amountInMax) revert UniswapV2RouterExcessiveInputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapExactTokensForETH(\n uint256 amountIn,\n uint256 amountOutMin,\n address[] calldata path,\n address to,\n uint256 deadline\n ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {\n if(path[path.length - 1] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);\n if(amounts[amounts.length - 1] < amountOutMin) revert UniswapV2RouterInsufficientOutputAmount();\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n\n function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)\n public\n payable\n virtual\n override\n ensure(deadline)\n returns (uint256[] memory amounts)\n {\n if(path[0] != WETH) revert UniswapV2RouterInvalidPath();\n amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);\n if(amounts[0] > msg.value) revert UniswapV2RouterExcessiveInputAmount();\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n // refund dust eth, if any\n if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);\n }\n\n // **** LIBRARY FUNCTIONS ****\n function quote(uint256 amountA, uint256 reserveA, uint256 reserveB)\n public\n pure\n virtual\n override\n returns (uint256 amountB)\n {\n return UniswapV2Library.quote(amountA, reserveA, reserveB);\n }\n\n function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountOut)\n {\n return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address pair)\n public\n view\n virtual\n override\n returns (uint256 amountIn)\n {\n return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, pair, factory);\n }\n\n function getAmountsOut(uint256 amountIn, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsOut(factory, amountIn, path);\n }\n\n function getAmountsIn(uint256 amountOut, address[] memory path)\n public\n view\n virtual\n override\n returns (uint256[] memory amounts)\n {\n return UniswapV2Library.getAmountsIn(factory, amountOut, path);\n }\n}\n" + }, + "contracts/Vault/INftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVault {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Collection already added\n error DuplicateCollection();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice amount of token required for last NFT to be redeemed\n function LAST_NFT_AMOUNT() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @dev This low-level function should be called from a contract which performs important safety checks\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n}\n" + }, + "contracts/Vault/INftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVault.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactory {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVault indexed vault,\n uint256 indexed vaultId,\n INftVault.CollectionData[] collections,\n address creator\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVault vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param index vaultId or index in NftVaultFactory.vaults array\n /// @return vault address\n function getVaultAt(uint256 index) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n /// @return true if vault is deployed by the factory\n function isVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVault.CollectionData[] memory collections) external view returns (INftVault vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVault.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVault.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function reverts\n /// @param collections vault's config\n /// @return vault address of deployed vault\n function createVault(INftVault.CollectionData[] memory collections) external returns (INftVault vault);\n}\n" + }, + "contracts/Vault/NftVault.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVault.sol\";\nimport \"./INftVaultFactory.sol\";\n\ncontract NftVault is INftVault, ERC20, ERC721Holder, ERC1155Holder {\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice amount of token required for last NFT to be redeemed\n uint256 public immutable LAST_NFT_AMOUNT;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n /// @dev last NFT can be redeemed for 99.9%\n LAST_NFT_AMOUNT = ONE * 999 / 1000;\n }\n\n /// @inheritdoc INftVault\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n if (!allowedCollections.set(collection.addr, nftType)) revert DuplicateCollection();\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n emit CollectionAllowed(collection);\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n }\n }\n\n /// @inheritdoc INftVault\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVault\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVault\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVault\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVault\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVault\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n uint256 totalSupply_ = totalSupply();\n\n /// @dev If vault ERC20 supply is \"0 < totalSupply <= 0.01\" it means that vault has been emptied and there\n /// is leftover ERC20 token (most likely) locked in the univ2 pair. To prevent minting small amounts\n /// of unbacked ERC20 tokens in a loop, which can lead to unexpected behaviour, vault mints\n /// `ONE - totalSupply` amount of ERC20 token for the first NFT that is deposited after the vault was\n /// emptied. This allows for the vault and univ2 pair to be reused safely.\n if (totalSupply_ > 0 && totalSupply_ <= ONE - LAST_NFT_AMOUNT) {\n amountMinted -= totalSupply_;\n }\n\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVault\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow redeemeing for LAST_NFT_AMOUNT instead of ONE\n if (totalSupply() == amountBurned && balanceOf(address(this)) >= amountBurned - ONE + LAST_NFT_AMOUNT) {\n amountBurned = balanceOf(address(this));\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVault\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVault\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n}\n" + }, + "contracts/Vault/NftVaultFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactory.sol\";\nimport \"./NftVault.sol\";\n\ncontract NftVaultFactory is INftVaultFactory {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n\n mapping(bytes32 => INftVault) public vaultHashMap;\n mapping(INftVault => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactory\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultAt(uint256 _index) external view returns (address) {\n return vaults.at(_index);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactory\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactory\n function getVault(INftVault.CollectionData[] memory _collections) public view returns (INftVault vault) {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactory\n function exists(INftVault.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactory\n function hashVault(INftVault.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactory\n function createVault(INftVault.CollectionData[] memory _collections) external returns (INftVault vault) {\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVault(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists, revert\n if (address(vault) != address(0)) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n\n vault = INftVault(address(new NftVault(name, symbol)));\n vault.init(_collections);\n\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender);\n }\n}\n" + }, + "contracts/Vault/test/NftVault.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultTest is Test {\n NftVaultFactory public nftVaultFactory = new NftVaultFactory();\n\n address user1 = address(1001);\n address user2 = address(1002);\n address owner = address(1003);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else if (configId == 8) {\n collections.push(collectionERC721all);\n collections.push(collectionERC721all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function _deployTestVault(uint256 configId)\n public\n returns (NftVault vault, INftVault.CollectionData[] memory _collections)\n {\n _collections = _getConfig(configId);\n vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n }\n\n function _getAddressesFromCollections(INftVault.CollectionData[] memory _collections)\n public\n view\n returns (address[] memory addresses)\n {\n addresses = new address[](_collections.length);\n\n for (uint256 i = 0; i < collections.length; i++) {\n addresses[i] = _collections[i].addr;\n }\n }\n\n function testInitReverts() public {\n NftVault nftVault;\n\n delete collections;\n vm.expectRevert(INftVault.InvalidCollections.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionAllWithTokenIds);\n vm.expectRevert(INftVault.TokenIdsMustBeEmpty.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC1155allWrongNftType);\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedMissingTokens);\n vm.expectRevert(INftVault.MissingTokenIds.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedUnsortedTokens);\n vm.expectRevert(INftVault.TokenIdsMustBeSorted.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n collections.push(collectionERC721allowedDuplicatedTokens);\n vm.expectRevert(INftVault.TokenIdAlreadySet.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n delete collections;\n INftVault.CollectionData[] memory _collections = _getConfig(8);\n vm.expectRevert(INftVault.DuplicateCollection.selector);\n nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(nftVault.VAULT_HASH(), bytes32(0));\n assertEq(nftVault.getAllowedCollections(), new address[](0));\n assertEq(nftVault.getAllowedCollectionsLength(), 0);\n assertEq(nftVault.ONE(), 10 ** nftVault.decimals());\n assertEq(nftVault.ONE(), 1e18);\n assertEq(nftVault.name(), \"name\");\n assertEq(nftVault.symbol(), \"symbol\");\n }\n\n function testInitStorage() public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n assertEq(vault.hashVault(_collections), vault.VAULT_HASH());\n assertEq(vault.getAllowedCollections(), _getAddressesFromCollections(_collections));\n assertEq(vault.getAllowedCollectionsLength(), _collections.length);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n INftVault.CollectionData memory c = vault.getAllowedCollectionData(_collections[i].addr);\n assertEq(c.addr, _collections[i].addr);\n assertEq(uint256(c.nftType), uint256(_collections[i].nftType));\n assertEq(c.allowAllIds, _collections[i].allowAllIds);\n assertEq(c.tokenIds, _collections[i].tokenIds);\n\n for (uint256 j = 0; j < _collections[i].tokenIds.length; j++) {\n assertTrue(vault.isTokenAllowed(_collections[i].addr, _collections[i].tokenIds[j]));\n }\n }\n\n vm.expectRevert(INftVault.Initialized.selector);\n vault.init(_collections);\n }\n }\n\n function testValidateNftType() public {\n NftVault nftVault = new NftVault(\"name\", \"symbol\");\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721all.addr, collectionERC721all.nftType)),\n uint256(collectionERC721all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155all.addr, collectionERC1155all.nftType)),\n uint256(collectionERC1155all.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC721allowed.addr, collectionERC721allowed.nftType)),\n uint256(collectionERC721allowed.nftType)\n );\n\n assertEq(\n uint256(nftVault.validateNftType(collectionERC1155allowed.addr, collectionERC1155allowed.nftType)),\n uint256(collectionERC1155allowed.nftType)\n );\n\n vm.expectRevert(INftVault.ExpectedERC721.selector);\n nftVault.validateNftType(collectionERC721allWrongNftType.addr, collectionERC721allWrongNftType.nftType);\n\n vm.expectRevert(INftVault.ExpectedERC1155.selector);\n nftVault.validateNftType(collectionERC1155allWrongNftType.addr, collectionERC1155allWrongNftType.nftType);\n\n // test hypothetical contract that supports ERC721 and ERC1155\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC721).interfaceId)), abi.encode(true)\n );\n vm.mockCall(\n erc721and1155, abi.encodeCall(ERC165.supportsInterface, (type(IERC1155).interfaceId)), abi.encode(true)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC721)),\n uint256(INftVault.NftType.ERC721)\n );\n assertEq(\n uint256(nftVault.validateNftType(erc721and1155, INftVault.NftType.ERC1155)),\n uint256(INftVault.NftType.ERC1155)\n );\n vm.clearMockedCalls();\n }\n\n function testIsTokenAllowed(address collectionAddr, uint256 tokenId) public {\n delete collections;\n INftVault.CollectionData memory config = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n collections.push(config);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(collectionAddr != config.addr);\n\n for (uint256 i = 0; i < erc721tokenIds.length; i++) {\n vm.assume(tokenId != erc721tokenIds[i]);\n }\n\n assertFalse(nftVault.isTokenAllowed(collectionAddr, tokenId));\n }\n\n function testGetSentTokenBalance(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n assertEq(nftVault.getSentTokenBalance(address(erc721), tokenId), 1);\n\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n assertEq(nftVault.getSentTokenBalance(address(erc1155), tokenId), amount);\n }\n\n function testDepositRevert(uint256 _tokenId, uint256 _amount) public {\n uint256 otherTokenId = 56464987645;\n vm.assume(_tokenId != otherTokenId);\n vm.assume(_amount < type(uint256).max);\n\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.expectRevert(INftVault.DisallowedToken.selector);\n nftVault.deposit(user1, address(5566), _tokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(user2, otherTokenId);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, otherTokenId, 1);\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n assertEq(nftVault.getSentTokenBalance(collections[0].addr, _tokenId), 1);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[0].addr, _tokenId, 0);\n\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n assertEq(nftVault.getSentTokenBalance(collections[1].addr, _tokenId), _amount);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.deposit(user1, collections[1].addr, _tokenId, _amount + 1);\n }\n\n function testNoDepositGriefing() public {\n delete collections;\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n // User deposited 1 token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n\n // Malicious user manually transferred 1 token to the vault\n vm.startPrank(user2);\n ERC1155Mintable(collections[0].addr).mint(user2, 1, 1);\n ERC1155Mintable(collections[0].addr).safeTransferFrom(user2, address(nftVault), 1, 1, bytes(\"\"));\n vm.stopPrank();\n\n // User deposited 1 more token to the vault\n ERC1155Mintable(collections[0].addr).mint(address(nftVault), 1, 1);\n nftVault.deposit(user1, collections[0].addr, 1, 1);\n }\n\n function testDepositAllConfigs(uint256 _tokenId, uint256 _amount) public {\n for (uint256 configId = 0; configId < 8; configId++) {\n console2.log(\"configId\", configId);\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n NftVault vault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n for (uint256 i = 0; i < _collections.length; i++) {\n if (!collections[i].allowAllIds) {\n // if not all allowed, take random tokenId that is allowed with fuzzing for randomness\n _tokenId = collections[i].tokenIds[_tokenId % collections[i].tokenIds.length];\n }\n\n if (collections[i].nftType == INftVault.NftType.ERC721) {\n _amount = 1;\n ERC721Mintable(collections[i].addr).mint(address(vault), _tokenId);\n } else {\n ERC1155Mintable(collections[i].addr).mint(address(vault), _tokenId, _amount);\n }\n\n uint256 balancesBefore = vault.balances(collections[i].addr, _tokenId);\n uint256 erc20balanceBefore = vault.balanceOf(user1);\n\n vm.expectEmit(true, true, true, true);\n emit Deposit(user1, collections[i].addr, _tokenId, _amount);\n uint256 amountMinted = vault.deposit(user1, collections[i].addr, _tokenId, _amount);\n\n assertEq(amountMinted / vault.ONE(), _amount);\n assertEq(vault.balanceOf(user1), erc20balanceBefore + amountMinted);\n assertEq(vault.balances(collections[i].addr, _tokenId), balancesBefore + _amount);\n }\n }\n }\n\n function testDepositBatchWithdrawBatch(uint256 _tokenId, uint256[] memory _amounts) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n vm.assume(_amounts.length > 10);\n\n assertEq(nftVault.balanceOf(user1), 0);\n\n address[] memory collectionBatch = new address[](10);\n uint256[] memory tokenIdBatch = new uint256[](10);\n uint256[] memory amountBatch = new uint256[](10);\n uint256 expectedAmountMinted = 0;\n\n for (uint256 i = 0; i < 10; i++) {\n vm.assume(_tokenId < type(uint64).max);\n uint256 tokenId = _tokenId + i;\n\n vm.assume(_amounts[i] > 0);\n vm.assume(_amounts[i] < type(uint64).max);\n uint256 amount = _amounts[i];\n\n if (i % 2 == 0) {\n ERC721Mintable(collections[0].addr).mint(address(nftVault), tokenId);\n collectionBatch[i] = collections[0].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = 1;\n } else {\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), tokenId, amount);\n collectionBatch[i] = collections[1].addr;\n tokenIdBatch[i] = tokenId;\n amountBatch[i] = amount;\n }\n\n expectedAmountMinted += amountBatch[i];\n }\n\n uint256 amountMinted = nftVault.depositBatch(user1, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountMinted / nftVault.ONE(), expectedAmountMinted);\n assertEq(nftVault.balanceOf(user1), expectedAmountMinted * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n for (uint256 i = 0; i < 10; i++) {\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), amountBatch[i]);\n }\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted);\n\n uint256 amountBurned = nftVault.withdrawBatch(user2, collectionBatch, tokenIdBatch, amountBatch);\n\n assertEq(amountBurned, amountMinted);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(user2), 0);\n\n for (uint256 i = 0; i < 10; i++) {\n if (i % 2 == 0) {\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(tokenIdBatch[i]), user2);\n } else {\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user2, tokenIdBatch[i]), amountBatch[i]);\n }\n assertEq(nftVault.balances(collectionBatch[i], tokenIdBatch[i]), 0);\n }\n }\n\n function testWithdrawRevert(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 0);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user1, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, 0);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 2);\n\n vm.expectRevert(INftVault.WrongAmount.selector);\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount + 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[0].addr, _tokenId, 1);\n\n vm.expectRevert(\"ERC20: burn amount exceeds balance\");\n nftVault.withdraw(user1, collections[1].addr, _tokenId, _amount);\n }\n\n function testWithdraw(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n uint256 amountMinted721 = nftVault.deposit(user1, collections[0].addr, _tokenId, 1);\n\n assertEq(amountMinted721, 1 * nftVault.ONE());\n\n uint256 amountMinted1155 = nftVault.deposit(user2, collections[1].addr, _tokenId, _amount);\n\n assertEq(amountMinted1155, _amount * nftVault.ONE());\n\n vm.prank(user1);\n nftVault.transfer(address(nftVault), amountMinted721);\n\n uint256 amountBurned = nftVault.withdraw(user1, collections[1].addr, _tokenId, 1);\n\n assertEq(amountBurned, amountMinted721);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), _amount - 1);\n\n uint256 transferAmount = amountMinted1155 - nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[1].addr, _tokenId, _amount - 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), nftVault.ONE());\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), address(nftVault));\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n\n transferAmount = nftVault.ONE();\n vm.prank(user2);\n nftVault.transfer(address(nftVault), transferAmount);\n\n amountBurned = nftVault.withdraw(user2, collections[0].addr, _tokenId, 1);\n\n assertEq(amountBurned, transferAmount);\n assertEq(nftVault.balanceOf(user2), 0);\n assertEq(ERC721Mintable(_collections[0].addr).ownerOf(_tokenId), user2);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user1, _tokenId), 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(user2, _tokenId), _amount - 1);\n assertEq(ERC1155Mintable(_collections[1].addr).balanceOf(address(nftVault), _tokenId), 0);\n }\n\n function testWithdrawLast(uint256 _tokenId, uint256 _amount) public {\n vm.assume(_amount > 1);\n vm.assume(_amount < type(uint128).max);\n\n INftVault.CollectionData[] memory _collections = _getConfig(4);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(_collections)));\n\n ERC721Mintable(collections[0].addr).mint(address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).mint(address(nftVault), _tokenId, _amount);\n\n address[] memory lastCollections = new address[](2);\n uint256[] memory lastTokenIds = new uint256[](2);\n uint256[] memory lastAmounts = new uint256[](2);\n\n lastCollections[0] = collections[0].addr;\n lastCollections[1] = collections[1].addr;\n\n lastTokenIds[0] = _tokenId;\n lastTokenIds[1] = _tokenId;\n\n lastAmounts[0] = 1;\n lastAmounts[1] = _amount;\n\n uint256 amountMinted = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(amountMinted, (_amount + 1) * nftVault.ONE());\n assertEq(nftVault.balanceOf(user1), amountMinted);\n\n vm.startPrank(user1);\n nftVault.transfer(owner, nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n nftVault.transfer(address(nftVault), nftVault.balanceOf(user1));\n vm.stopPrank();\n\n nftVault.withdrawBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n\n assertEq(ERC721Mintable(collections[0].addr).ownerOf(_tokenId), user1);\n assertEq(ERC1155Mintable(collections[1].addr).balanceOf(user1, _tokenId), _amount);\n assertEq(nftVault.balanceOf(user1), 0);\n assertEq(nftVault.balanceOf(address(nftVault)), 0);\n assertEq(nftVault.totalSupply(), nftVault.ONE() - nftVault.LAST_NFT_AMOUNT());\n\n vm.startPrank(user1);\n ERC721Mintable(collections[0].addr).transferFrom(user1, address(nftVault), _tokenId);\n ERC1155Mintable(collections[1].addr).safeTransferFrom(user1, address(nftVault), _tokenId, _amount, bytes(\"\"));\n vm.stopPrank();\n\n uint256 amountMinted2 = nftVault.depositBatch(user1, lastCollections, lastTokenIds, lastAmounts);\n assertEq(amountMinted2, (_amount + 1) * nftVault.ONE() - nftVault.ONE() + nftVault.LAST_NFT_AMOUNT());\n }\n\n function testSkim(uint256 tokenId, uint256 amount) public {\n delete collections;\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n NftVault nftVault = NftVault(address(nftVaultFactory.createVault(collections)));\n\n ERC721Mintable erc721 = ERC721Mintable(collectionERC721all.addr);\n ERC1155Mintable erc1155 = ERC1155Mintable(collectionERC1155all.addr);\n\n assertTrue(nftVault.isTokenAllowed(address(erc721), tokenId));\n assertEq(erc721.balanceOf(user2), 0);\n erc721.mint(user1, tokenId);\n vm.prank(user1);\n erc721.transferFrom(user1, address(nftVault), tokenId);\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(erc721), tokenId, 1);\n\n assertTrue(nftVault.isTokenAllowed(address(erc1155), tokenId));\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n erc1155.mint(user1, tokenId, amount);\n vm.prank(user1);\n erc1155.safeTransferFrom(user1, address(nftVault), tokenId, amount, bytes(\"\"));\n vm.prank(user2);\n vm.expectRevert(INftVault.MustBeDisallowedToken.selector);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(erc1155), tokenId, amount);\n assertEq(erc1155.balanceOf(user2, tokenId), 0);\n\n ERC721Mintable newErc721 = new ERC721Mintable();\n\n newErc721.mint(address(nftVault), tokenId);\n assertFalse(nftVault.isTokenAllowed(address(newErc721), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC721, address(newErc721), tokenId, amount);\n assertEq(newErc721.balanceOf(user2), 1);\n\n ERC1155Mintable newErc1155 = new ERC1155Mintable();\n\n newErc1155.mint(address(nftVault), tokenId, amount);\n assertFalse(nftVault.isTokenAllowed(address(newErc1155), tokenId));\n vm.prank(user2);\n nftVault.skim(user2, INftVault.NftType.ERC1155, address(newErc1155), tokenId, amount);\n assertEq(newErc1155.balanceOf(user2, tokenId), amount);\n }\n}\n" + }, + "contracts/Vault/test/NftVaultFactory.t.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.20;\n\nimport \"forge-std/Test.sol\";\n\nimport \"lib/ERC721Mintable.sol\";\nimport \"lib/ERC1155Mintable.sol\";\n\nimport \"../INftVault.sol\";\nimport \"../NftVaultFactory.sol\";\n\ncontract NftVaultFactoryTest is Test {\n address user1 = address(1001);\n address user2 = address(1002);\n address owner1 = address(1003);\n address owner2 = address(1004);\n address erc721and1155 = address(888999);\n\n uint256[] public erc721tokenIds = [1, 6, 15, 22];\n uint256[] public erc721tokenIdsUnsorted = [1, 6, 16, 15, 22];\n uint256[] public erc721tokenIdsDuplicated = [1, 6, 15, 15, 22];\n uint256[] public erc1155tokenIds = [8, 21, 32, 33, 35];\n\n INftVault.CollectionData public collectionERC721all;\n INftVault.CollectionData public collectionERC1155all;\n INftVault.CollectionData public collectionERC721allowed;\n INftVault.CollectionData public collectionERC1155allowed;\n INftVault.CollectionData public collectionAllWithTokenIds;\n INftVault.CollectionData public collectionERC721allWrongNftType;\n INftVault.CollectionData public collectionERC1155allWrongNftType;\n INftVault.CollectionData public collectionERC721allowedMissingTokens;\n INftVault.CollectionData public collectionERC721allowedUnsortedTokens;\n INftVault.CollectionData public collectionERC721allowedDuplicatedTokens;\n\n INftVault.CollectionData[] public collections;\n\n event Deposit(address indexed to, address indexed collection, uint256 tokenId, uint256 amount);\n\n function setUp() public {\n collectionERC721all = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155all = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowed = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIds\n });\n\n collectionERC1155allowed = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: false,\n tokenIds: erc1155tokenIds\n });\n\n collectionAllWithTokenIds = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: erc1155tokenIds\n });\n\n collectionERC721allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC1155,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC1155allWrongNftType = INftVault.CollectionData({\n addr: address(new ERC1155Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: true,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedMissingTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: new uint256[](0)\n });\n\n collectionERC721allowedUnsortedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsUnsorted\n });\n\n collectionERC721allowedDuplicatedTokens = INftVault.CollectionData({\n addr: address(new ERC721Mintable()),\n nftType: INftVault.NftType.ERC721,\n allowAllIds: false,\n tokenIds: erc721tokenIdsDuplicated\n });\n }\n\n function _getConfig(uint256 configId) public returns (INftVault.CollectionData[] memory) {\n delete collections;\n\n // deploy fresh NFTs at every config request\n collectionERC721all.addr = address(new ERC721Mintable());\n collectionERC1155all.addr = address(new ERC1155Mintable());\n collectionERC721allowed.addr = address(new ERC721Mintable());\n collectionERC1155allowed.addr = address(new ERC1155Mintable());\n\n if (configId == 0) {\n collections.push(collectionERC721all);\n } else if (configId == 1) {\n collections.push(collectionERC1155all);\n } else if (configId == 2) {\n collections.push(collectionERC721allowed);\n } else if (configId == 3) {\n collections.push(collectionERC1155allowed);\n } else if (configId == 4) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155all);\n } else if (configId == 5) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155allowed);\n } else if (configId == 6) {\n collections.push(collectionERC721all);\n collections.push(collectionERC1155allowed);\n } else if (configId == 7) {\n collections.push(collectionERC721allowed);\n collections.push(collectionERC1155all);\n } else {\n revert(\"WrongConfig\");\n }\n\n return collections;\n }\n\n function testVaultAlreadyDeployed() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n INftVault.CollectionData[] memory _collections = _getConfig(0);\n\n vaultFactory.createVault(_collections);\n\n vm.expectRevert(INftVaultFactory.VaultAlreadyDeployed.selector);\n vaultFactory.createVault(_collections);\n }\n\n function testAllGetters() public {\n NftVaultFactory vaultFactory = new NftVaultFactory();\n\n address[] memory vaults = new address[](8);\n\n for (uint256 configId = 0; configId < 8; configId++) {\n INftVault.CollectionData[] memory _collections = _getConfig(configId);\n\n INftVault vault = vaultFactory.createVault(_collections);\n\n vaults[configId] = address(vault);\n\n address[] memory getAllVaults = new address[](configId + 1);\n for (uint256 i = 0; i < getAllVaults.length; i++) {\n if (vaults[i] != address(0)) {\n getAllVaults[i] = vaults[i];\n }\n }\n\n assertEq(vaultFactory.getAllVaults(), getAllVaults);\n assertEq(vaultFactory.getVaultAt(configId), vaults[configId]);\n assertEq(vaultFactory.getVaultLength(), configId + 1);\n assertEq(vaultFactory.isVault(vaults[configId]), true);\n assertEq(vaultFactory.isVault(address(uint160(vaults[configId]) + 1)), false);\n assertEq(address(vaultFactory.getVault(_collections)), vaults[configId]);\n assertEq(vaultFactory.exists(_collections), true);\n assertEq(address(vaultFactory.vaultHashMap(vaultFactory.hashVault(_collections))), vaults[configId]);\n assertEq(vaultFactory.getVaultAt(vaultFactory.vaultIdMap(INftVault(vaults[configId]))), vaults[configId]);\n }\n }\n}\n" + }, + "contracts/VaultPermissioned/INftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"./INftVaultPermissioned.sol\";\n\n/// @title Vault factory contract\ninterface INftVaultFactoryPermissioned {\n /// @notice Emitted when new vault is deployed\n /// @param name vault's name\n /// @param symbol vault's name\n /// @param vault vault's address as INftVault\n /// @param vaultId vault's index in `vaults` AddressSet\n /// @param collections configuration used for vault creation\n /// @param creator address of vault creator\n event VaultCreated(\n string name,\n string symbol,\n INftVaultPermissioned vault,\n uint256 vaultId,\n INftVaultPermissioned.CollectionData[] collections,\n address creator,\n address owner\n );\n\n /// @dev Vault does not exist\n error VaultDoesNotExist();\n\n /// @dev Vault with identical configuration is already deployed\n error VaultAlreadyDeployed();\n\n /// @notice Get vault by its config hash\n /// @param hash vault's config hash\n /// @return vault address\n function vaultHashMap(bytes32 hash) external view returns (INftVaultPermissioned vault);\n\n /// @return all deployed vaults\n function getAllVaults() external view returns (address[] memory);\n\n /// @notice Get vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getVaultAt(uint256 i) external view returns (address);\n\n /// @return length of vault's EnumerableSet\n function getVaultLength() external view returns (uint256);\n\n /// @notice Returns true if vault has been deployed by factory\n /// @param vault address\n function isVault(address vault) external view returns (bool);\n\n /// @return all deployed permissioned vaults\n function getAllPermissionedVaults() external view returns (address[] memory);\n\n /// @notice Get permissioned vault by its EnumerableSet vaultId\n /// @param i vaultId\n /// @return vault address\n function getPermissionedVaultAt(uint256 i) external view returns (address);\n\n /// @return length of permissioned vault's EnumerableSet\n function getPermissionedVaultLength() external view returns (uint256);\n\n /// @notice Returns true if permissioned vault has been deployed by factory\n /// @param vault address\n function isPermissionedVault(address vault) external view returns (bool);\n\n /// @notice Get vault by it's config\n /// @param collections vault's config\n /// @return vault address\n function getVault(INftVaultPermissioned.CollectionData[] memory collections)\n external\n view\n returns (INftVaultPermissioned vault);\n\n /// @notice Returns true if vault with given config exists\n /// @param collections vault's config\n /// @return true if vault with given config exists\n function exists(INftVaultPermissioned.CollectionData[] memory collections) external view returns (bool);\n\n /// @notice Get config hash\n /// @param collections vault's config\n /// @return config hash\n function hashVault(INftVaultPermissioned.CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Create new vault\n /// @dev If vault already exists, function returned already deployed vault\n /// @param collections vault's config\n /// @param owner address of owner if vault is permissioned, otherwise address(0) and vault is permissionless\n /// @param isSoulbound if true, Vault is soulbound and its ERC20 token can only be transfered\n /// to `allowedContracts` managed by `owner`\n /// @return vault address of (newly) deployed vault\n function createVault(INftVaultPermissioned.CollectionData[] memory collections, address owner, bool isSoulbound)\n external\n returns (INftVaultPermissioned vault);\n}\n" + }, + "contracts/VaultPermissioned/INftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\n/// @title Vault contract for wrapping NFTs (ERC721/ERC1155) to ERC20\ninterface INftVaultPermissioned {\n enum NftType {\n ERC721,\n ERC1155\n }\n\n /// @notice Vault configuration struct that specifies which NFTs are accepted in vault.\n /// @param addr address of nft contract\n /// @param nftType standard that NFT supports { ERC721, ERC1155 }\n /// @param allowAllIds if true, all tokens are allowed in the vault. If false, tokenIds must be\n /// listed one by one.\n /// @param tokenIds list of tokens supported by vault. If allowAllIds is true, list must be empty.\n struct CollectionData {\n address addr;\n NftType nftType;\n bool allowAllIds;\n uint256[] tokenIds;\n }\n\n /// @notice Struct for allowed tokens. Stores data in an optimized way to read it in vault.\n /// @param tokenIds mapping from tokenid to is-allowed\n /// @param tokenIdList list of all tokens that are allowed\n /// @param allowAllIds if true, all tokens are allowed\n struct AllowedTokenIds {\n mapping(uint256 => bool) tokenIds;\n uint256[] tokenIdList;\n bool allowAllIds;\n }\n\n /// @notice Emitted during initiation when collection added to allowed list\n /// @param collection collection details\n event CollectionAllowed(CollectionData collection);\n\n /// @notice Emitted on depositing NFT to vault\n /// @param to address that gets vault ERC20 tokens\n /// @param collection NFT address that is deposited\n /// @param tokenId token id that is deposited\n /// @param amount amount of token that is deposited, for ERC721 always 1\n event Deposit(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted on withdrawing NFT from vault\n /// @param to address that gets withdrawn NFTs\n /// @param collection NFT address that is withdrawn\n /// @param tokenId token id that is withdrawn\n /// @param amount amount of token that is withdrawn, for ERC721 always 1\n event Withdraw(address to, address collection, uint256 tokenId, uint256 amount);\n\n /// @notice Emitted when adding a wallet to deposit/withdraw allow list\n /// @param wallet address that is allowed to deposit/withdraw\n event AllowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when removing a wallet from deposit/withdraw allow list\n /// @param wallet address that is disallowed to deposit/withdraw\n event DisallowedDepositWithdraw(address wallet);\n\n /// @notice Emitted when `contractAddress` is allowed to receive Vault ERC20 token\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n event AllowedContract(address contractAddress);\n\n /// @notice Emitted when `contractAddress` address that is disallowed to receive Vault ERC20 token\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n event DisallowedContract(address contractAddress);\n\n /// @dev Contract is already initialized\n error Initialized();\n /// @dev Collection data is empty\n error InvalidCollections();\n /// @dev Token id is listed twice in CollectionData.tokenIds array\n error TokenIdAlreadySet();\n /// @dev Token ids in CollectionData.tokenIds array are not sorted\n error TokenIdsMustBeSorted();\n /// @dev ERC165 suggests that NFT is supporting ERC721 but ERC1155 is claimed\n error ExpectedERC721();\n /// @dev ERC165 suggests that NFT is supporting ERC1155 but ERC721 is claimed\n error ExpectedERC1155();\n /// @dev Collection does not support all token IDs however list of IDs is empty.\n /// CollectionData.tokenIds is empty and CollectionData.allowAllIds is false.\n error MissingTokenIds();\n /// @dev CollectionData.tokenIds is not empty however Collection supports all token IDs.\n error TokenIdsMustBeEmpty();\n /// @dev Token is not allowed in vault\n error DisallowedToken();\n /// @dev Token amount is invalid eg. amount == 0\n error WrongAmount();\n /// @dev Token amount is invalid for ERC721, amount != 1\n error WrongERC721Amount();\n /// @dev Trying to interact with token that does not support ERC721 nor ERC1155\n error UnsupportedNft();\n /// @dev Token is allowed in vault but must not be\n error MustBeDisallowedToken();\n /// @dev User is not allowed to deposit or withdraw\n error NotAllowed();\n /// @dev Owner is required to manage `allowedContracts` when Vault is deployed as soulbound\n error OwnerRequiredForSoulbound();\n /// @dev Transfer of Vault ERC20 token to disallowed receiver\n error SoulboundTransferDisallowed();\n\n /// @notice value of 1 token, including decimals\n function ONE() external view returns (uint256);\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n function UNIV2_MINIMUM_LIQUIDITY() external view returns (uint256);\n\n /// @notice unique id of the vault generated using its configuration\n function VAULT_HASH() external view returns (bytes32);\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to `allowedContracts`\n /// @return true if Vault is soulbound, false otherwise\n function isSoulbound() external view returns (bool);\n\n /// @notice Initialize Vault with collection config\n /// @dev Called by factory during deployment\n /// @param collections struct array of allowed collections and token IDs\n function init(CollectionData[] memory collections) external;\n\n /// @notice Returns true if wallet is allowed to deposit/withdraw. Only applicable to permissioned vault.\n /// @dev Call `isPermissioned()` first to make sure vault is permissioned. Otherwise this function is irrelevant.\n /// @param wallet address that is checked\n /// @return true if wallet is allowed, false otherwise. For permissionless vault always returns false.\n function allowedWallets(address wallet) external view returns (bool);\n\n /// @notice Is vault permissioned\n /// @return true if vault has an owner and is permissioned. False otherwise.\n function isPermissioned() external view returns (bool);\n\n /// @notice Returns hash of vault configuration\n /// @param collections struct array of allowed collections and token IDs\n /// @return configuration hash\n function hashVault(CollectionData[] memory collections) external pure returns (bytes32);\n\n /// @notice Returns balances of NFT deposited to the vault\n /// @param collectionAddr NFT address\n /// @param tokenId NFT's token ID\n /// @return amount amount of NFT deposited to the vault\n function balances(address collectionAddr, uint256 tokenId) external view returns (uint256 amount);\n\n /// @notice Get array of NFT addresses that are allowed to be deposited to the vault\n /// @dev Keep in mind that returned address(es) can be further restricted on token ID level\n /// @return collections array of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollections() external view returns (address[] memory collections);\n\n /// @return number of NFT addresses that are allowed to be deposited to the vault\n function getAllowedCollectionsLength() external view returns (uint256);\n\n /// @notice Get details of allowed collection\n /// @return struct with details of allowed collection\n function getAllowedCollectionData(address collectionAddr) external view returns (CollectionData memory);\n\n /// @notice Validates type of collection (ERC721 or ERC1155)\n /// @dev It uses ERC165 to check interface support. If support can not be detected without doubt, user input is trusted.\n /// @param collectionAddr NFT address\n /// @param nftType NFT type, ERC721 or ERC1155\n /// @return validatedNftType returns validated enum NftType as uint256\n function validateNftType(address collectionAddr, NftType nftType)\n external\n view\n returns (uint256 validatedNftType);\n\n /// @notice Returns if true token can be deposited\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return true if allowed\n function isTokenAllowed(address collection, uint256 tokenId) external view returns (bool);\n\n /// @notice Returns balance of token sent to the vault\n /// @dev Reads balance of tokens freshy sent to the vault\n /// @param collection NFT address\n /// @param tokenId NFT token ID\n /// @return balance of sent token, for ERC721 it's always 1\n function getSentTokenBalance(address collection, uint256 tokenId) external view returns (uint256);\n\n /// @notice Deposit NFT to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection address of deposited NFT\n /// @param tokenId token ID of deposited NFT\n /// @param amount amount of deposited NFT, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function deposit(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Deposit NFTs to vault\n /// @param to address that gets minted ERC20 token\n /// @param collection array of addresses of deposited NFTs\n /// @param tokenId array of token IDs of deposited NFTs\n /// @param amount array if amounts of deposited NFTs, for ERC721 it's always 1\n /// @return amountMinted amount of minted ERC20 token\n function depositBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountMinted);\n\n /// @notice Withdraw NFT from vault\n /// @param to address that gets NFT\n /// @param collection address of NFT to withdraw\n /// @param tokenId token ID of NFT to withdraw\n /// @param amount amount of NFT to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdraw(address to, address collection, uint256 tokenId, uint256 amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Withdraw NFTs from vault\n /// @param to address that gets NFT\n /// @param collection array of addresses of NFTs to withdraw\n /// @param tokenId array of token IDs of NFTs to withdraw\n /// @param amount array of amounts of NFTs to withdraw, for ERC721 it's always 1\n /// @return amountBurned amount of burned ERC20\n function withdrawBatch(address to, address[] memory collection, uint256[] memory tokenId, uint256[] memory amount)\n external\n returns (uint256 amountBurned);\n\n /// @notice Allow anyone to withdraw tokens sent to this vault by accident\n /// Only unsupported NFTs can be skimmed.\n /// @param to address that gets NFT\n /// @param nftType NftType of skimmed NFT\n /// @param collection address of NFT to skim\n /// @param tokenId token ID of NFT to skim\n /// @param amount amount of NFT to skim, for ERC721 it's always 1\n function skim(address to, NftType nftType, address collection, uint256 tokenId, uint256 amount) external;\n\n /// @notice Allow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is allowed to deposit/withdraw\n function allowDepositWithdraw(address wallet) external;\n\n /// @notice Disallow wallet to deposit/withdraw. Only applicable to permissioned vault.\n /// @param wallet address that is disallowed to deposit/withdraw\n function disallowDepositWithdraw(address wallet) external;\n\n /// @notice Allow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is allowed to receive Vault ERC20 token\n function allowVaultTokenTransfersTo(address contractAddress) external;\n\n /// @notice Disallow Vault ERC20 token to be transfered to `contractAddress`\n /// @param contractAddress address that is disallowed to receive Vault ERC20 token\n function disallowVaultTokenTransfersTo(address contractAddress) external;\n}\n" + }, + "contracts/VaultPermissioned/NftVaultFactoryPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Counters.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Strings.sol\";\n\nimport \"./INftVaultFactoryPermissioned.sol\";\nimport \"./NftVaultPermissioned.sol\";\n\ncontract NftVaultFactoryPermissioned is INftVaultFactoryPermissioned {\n using EnumerableSet for EnumerableSet.AddressSet;\n using Strings for uint256;\n\n EnumerableSet.AddressSet private vaults;\n EnumerableSet.AddressSet private permissionedVaults;\n\n mapping(bytes32 => INftVaultPermissioned) public vaultHashMap;\n mapping(INftVaultPermissioned => uint256) public vaultIdMap;\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllVaults() external view returns (address[] memory) {\n return vaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultAt(uint256 _i) external view returns (address) {\n return vaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVaultLength() external view returns (uint256) {\n return vaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isVault(address _vault) external view returns (bool) {\n return vaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getAllPermissionedVaults() external view returns (address[] memory) {\n return permissionedVaults.values();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultAt(uint256 _i) external view returns (address) {\n return permissionedVaults.at(_i);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getPermissionedVaultLength() external view returns (uint256) {\n return permissionedVaults.length();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function isPermissionedVault(address _vault) external view returns (bool) {\n return permissionedVaults.contains(_vault);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function getVault(INftVaultPermissioned.CollectionData[] memory _collections)\n public\n view\n returns (INftVaultPermissioned vault)\n {\n vault = vaultHashMap[hashVault(_collections)];\n if (address(vault) == address(0)) revert VaultDoesNotExist();\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function exists(INftVaultPermissioned.CollectionData[] memory _collections) public view returns (bool) {\n return address(vaultHashMap[hashVault(_collections)]) != address(0);\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultFactoryPermissioned\n function createVault(INftVaultPermissioned.CollectionData[] memory _collections, address _owner, bool _isSoulbound)\n external\n returns (INftVaultPermissioned vault)\n {\n bool isPermissionless = _owner == address(0) && !_isSoulbound;\n\n bytes32 vaultHash = hashVault(_collections);\n vault = INftVaultPermissioned(vaultHashMap[vaultHash]);\n\n // if vault with _collections alredy exists and is permissionless, revert\n if (address(vault) != address(0) && isPermissionless) revert VaultAlreadyDeployed();\n\n uint256 vaultId;\n string memory name;\n string memory symbol;\n\n if (isPermissionless) {\n // permissionless\n vaultId = vaults.length();\n name = string.concat(\"Magic Vault \", vaultId.toString());\n symbol = string.concat(\"MagicVault\", vaultId.toString());\n } else {\n // permissioned\n vaultId = permissionedVaults.length();\n name = string.concat(\"Magic Permissioned Vault \", vaultId.toString());\n symbol = string.concat(\"MagicPermissionedVault\", vaultId.toString());\n }\n\n vault = INftVaultPermissioned(address(new NftVaultPermissioned(name, symbol, _owner, _isSoulbound)));\n vault.init(_collections);\n\n if (isPermissionless) {\n vaults.add(address(vault));\n vaultHashMap[vaultHash] = vault;\n vaultIdMap[vault] = vaultId;\n } else {\n permissionedVaults.add(address(vault));\n }\n\n emit VaultCreated(name, symbol, vault, vaultId, _collections, msg.sender, _owner);\n }\n}\n" + }, + "contracts/VaultPermissioned/NftVaultPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.20;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport \"lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\";\nimport \"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\";\nimport \"lib/openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport \"./INftVaultPermissioned.sol\";\nimport \"./INftVaultFactoryPermissioned.sol\";\n\ncontract NftVaultPermissioned is INftVaultPermissioned, ERC20, ERC721Holder, ERC1155Holder, Ownable2Step {\n using EnumerableSet for EnumerableSet.AddressSet;\n using EnumerableMap for EnumerableMap.AddressToUintMap;\n\n /// @notice value of 1 token, including decimals\n uint256 public immutable ONE;\n\n /// @notice minimum liquidity that is frozen in UniV2 pool\n uint256 public constant UNIV2_MINIMUM_LIQUIDITY = 1e3;\n\n /// @notice if Vault is soulbound, its ERC20 token can only be transfered to\n /// EOA, vault itself and `allowedContracts`\n bool public immutable isSoulbound;\n\n /// @notice unique ID of the vault generated using its configuration\n bytes32 public VAULT_HASH;\n\n /// @notice maps collection address to nft type\n EnumerableMap.AddressToUintMap private allowedCollections;\n\n /// @notice maps collection address to allowed tokens\n mapping(address => AllowedTokenIds) private allowedTokenIds;\n\n /// @notice maps collection address to tokenId to amount wrapped\n mapping(address => mapping(uint256 => uint256)) public balances;\n\n /// @notice deposit/withdraw allow list. Maps wallet address to bool, if true, wallet is allowed to deposit/withdraw\n mapping(address => bool) public allowedWallets;\n\n /// @notice Vault ERC20 receive allow list. Maps contract address to bool, if true, contract is allowed to receive\n /// Vault ERC20 token.\n mapping(address => bool) public allowedContracts;\n\n modifier onlyAllowed() {\n if (isPermissioned() && !allowedWallets[msg.sender]) {\n revert NotAllowed();\n }\n\n _;\n }\n\n /// @dev if _owner == address(0), NftVault is deployed as permissionless\n /// @param _name name of ERC20 Vault token\n /// @param _symbol symbol of ERC20 Vault token\n /// @param _owner should be address(0) for permissionless vaults. Otherwise, address of the owner.\n /// @param _isSoulbound if true, Vault is soulbound, false otherwise\n constructor(string memory _name, string memory _symbol, address _owner, bool _isSoulbound) ERC20(_name, _symbol) {\n ONE = 10 ** decimals();\n\n isSoulbound = _isSoulbound;\n _transferOwnership(_owner);\n\n if (_isSoulbound && _owner == address(0)) revert OwnerRequiredForSoulbound();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function init(CollectionData[] memory _collections) external {\n if (_collections.length == 0) revert InvalidCollections();\n if (allowedCollections.length() > 0) revert Initialized();\n\n VAULT_HASH = hashVault(_collections);\n\n for (uint256 i = 0; i < _collections.length; i++) {\n CollectionData memory collection = _collections[i];\n\n /// @dev if all Ids are allowed tokenIds must be empty, otherwise VAULT_HASH will not be correct\n if (collection.allowAllIds && collection.tokenIds.length > 0) revert TokenIdsMustBeEmpty();\n\n uint256 nftType = validateNftType(collection.addr, collection.nftType);\n\n allowedCollections.set(collection.addr, nftType);\n allowedTokenIds[collection.addr].allowAllIds = collection.allowAllIds;\n\n if (collection.allowAllIds) continue;\n if (collection.tokenIds.length == 0) revert MissingTokenIds();\n\n uint256 lastTokenId = 0;\n\n for (uint256 j = 0; j < collection.tokenIds.length; j++) {\n uint256 tokenId = collection.tokenIds[j];\n\n /// @dev Make sure `uint256[] tokenIds` array is sorted,\n /// otherwise VAULT_HASH will not be correct\n if (tokenId < lastTokenId) {\n revert TokenIdsMustBeSorted();\n } else {\n lastTokenId = tokenId;\n }\n\n /// @dev Check for duplicates\n if (allowedTokenIds[collection.addr].tokenIds[tokenId]) revert TokenIdAlreadySet();\n\n allowedTokenIds[collection.addr].tokenIds[tokenId] = true;\n allowedTokenIds[collection.addr].tokenIdList.push(tokenId);\n }\n\n emit CollectionAllowed(collection);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isPermissioned() public view returns (bool) {\n return owner() != address(0);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function hashVault(INftVaultPermissioned.CollectionData[] memory _collections) public pure returns (bytes32) {\n return keccak256(abi.encode(_collections));\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollections() external view returns (address[] memory collections) {\n collections = new address[](allowedCollections.length());\n\n for (uint256 i = 0; i < collections.length; i++) {\n (address addr,) = allowedCollections.at(i);\n collections[i] = addr;\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionsLength() external view returns (uint256) {\n return allowedCollections.length();\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getAllowedCollectionData(address _collectionAddr) external view returns (CollectionData memory) {\n return CollectionData({\n addr: _collectionAddr,\n nftType: NftType(allowedCollections.get(_collectionAddr)),\n allowAllIds: allowedTokenIds[_collectionAddr].allowAllIds,\n tokenIds: allowedTokenIds[_collectionAddr].tokenIdList\n });\n }\n\n /// @inheritdoc INftVaultPermissioned\n function validateNftType(address _collectionAddr, NftType _nftType) public view returns (uint256 nftType) {\n bool supportsERC721 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC721).interfaceId);\n bool supportsERC1155 = ERC165Checker.supportsInterface(_collectionAddr, type(IERC1155).interfaceId);\n\n /// @dev if `_collectionAddr` supports both or neither token standard, trust user input\n /// if `_collectionAddr` supports one of the token standards, NftType must match it\n if (supportsERC721 && !supportsERC1155 && _nftType != NftType.ERC721) revert ExpectedERC721();\n if (supportsERC1155 && !supportsERC721 && _nftType != NftType.ERC1155) revert ExpectedERC1155();\n\n nftType = uint256(_nftType);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function isTokenAllowed(address _collection, uint256 _tokenId) public view returns (bool) {\n (bool isCollectionAllowed,) = allowedCollections.tryGet(_collection);\n\n return isCollectionAllowed\n && (allowedTokenIds[_collection].allowAllIds || allowedTokenIds[_collection].tokenIds[_tokenId]);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function getSentTokenBalance(address _collection, uint256 _tokenId) public view returns (uint256) {\n uint256 currentBalance = balances[_collection][_tokenId];\n NftType nftType = NftType(allowedCollections.get(_collection));\n\n if (nftType == NftType.ERC721) {\n if (currentBalance == 0 && IERC721(_collection).ownerOf(_tokenId) == address(this)) {\n return 1;\n } else {\n return 0;\n }\n } else if (nftType == NftType.ERC1155) {\n return IERC1155(_collection).balanceOf(address(this), _tokenId) - currentBalance;\n } else {\n revert UnsupportedNft();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function deposit(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountMinted)\n {\n if (!isTokenAllowed(_collection, _tokenId)) revert DisallowedToken();\n\n uint256 sentTokenBalance = getSentTokenBalance(_collection, _tokenId);\n if (_amount == 0 || sentTokenBalance < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] += _amount;\n emit Deposit(_to, _collection, _tokenId, _amount);\n\n amountMinted = ONE * _amount;\n _mint(_to, amountMinted);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function depositBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountMinted) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountMinted += deposit(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdraw(address _to, address _collection, uint256 _tokenId, uint256 _amount)\n public\n onlyAllowed\n returns (uint256 amountBurned)\n {\n if (_amount == 0 || balances[_collection][_tokenId] < _amount) revert WrongAmount();\n\n balances[_collection][_tokenId] -= _amount;\n amountBurned = ONE * _amount;\n\n // when withdrawing the last NFT from the vault, allow being UNIV2_MINIMUM_LIQUIDITY shy\n if (totalSupply() == amountBurned && balanceOf(address(this)) == amountBurned - UNIV2_MINIMUM_LIQUIDITY) {\n amountBurned -= UNIV2_MINIMUM_LIQUIDITY;\n }\n\n _burn(address(this), amountBurned);\n\n NftType nftType = NftType(allowedCollections.get(_collection));\n if (nftType == NftType.ERC721) {\n if (_amount != 1) revert WrongERC721Amount();\n\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n\n emit Withdraw(_to, _collection, _tokenId, _amount);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function withdrawBatch(\n address _to,\n address[] memory _collection,\n uint256[] memory _tokenId,\n uint256[] memory _amount\n ) external returns (uint256 amountBurned) {\n for (uint256 i = 0; i < _collection.length; i++) {\n amountBurned += withdraw(_to, _collection[i], _tokenId[i], _amount[i]);\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function skim(address _to, NftType nftType, address _collection, uint256 _tokenId, uint256 _amount) external {\n // Cannot skim supported token\n if (isTokenAllowed(_collection, _tokenId)) revert MustBeDisallowedToken();\n\n if (nftType == NftType.ERC721) {\n IERC721(_collection).safeTransferFrom(address(this), _to, _tokenId);\n } else if (nftType == NftType.ERC1155) {\n IERC1155(_collection).safeTransferFrom(address(this), _to, _tokenId, _amount, bytes(\"\"));\n } else {\n revert UnsupportedNft();\n }\n }\n\n function _beforeTokenTransfer(address, /*from*/ address to, uint256 /*amount*/ ) internal view override {\n /// @dev Soulbound Vault ERC20 token can be transfered to any EOA, this Vault or `allowedContracts`\n if (isSoulbound && to != address(this) && Address.isContract(to) && !allowedContracts[to]) {\n revert SoulboundTransferDisallowed();\n }\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = true;\n\n emit AllowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowDepositWithdraw(address _wallet) external onlyOwner {\n allowedWallets[_wallet] = false;\n\n emit DisallowedDepositWithdraw(_wallet);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function allowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = true;\n\n emit AllowedContract(_contractAddress);\n }\n\n /// @inheritdoc INftVaultPermissioned\n function disallowVaultTokenTransfersTo(address _contractAddress) external onlyOwner {\n allowedContracts[_contractAddress] = false;\n\n emit DisallowedContract(_contractAddress);\n }\n}\n" + }, + "forge-std/Base.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {StdStorage} from \"./StdStorage.sol\";\nimport {Vm, VmSafe} from \"./Vm.sol\";\n\nabstract contract CommonBase {\n // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.\n address internal constant VM_ADDRESS = address(uint160(uint256(keccak256(\"hevm cheat code\"))));\n // console.sol and console2.sol work by executing a staticcall to this address.\n address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;\n // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.\n address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256(\"foundry default caller\"))));\n // Address of the test contract, deployed by the DEFAULT_SENDER.\n address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;\n // Deterministic deployment address of the Multicall3 contract.\n address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;\n // The order of the secp256k1 curve.\n uint256 internal constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n\n uint256 internal constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n Vm internal constant vm = Vm(VM_ADDRESS);\n StdStorage internal stdstore;\n}\n\nabstract contract TestBase is CommonBase {}\n\nabstract contract ScriptBase is CommonBase {\n VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);\n}\n" + }, + "forge-std/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\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(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", 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, int256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,int256)\", 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" + }, + "forge-std/console2.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {console as console2} from \"./console.sol\";\n" + }, + "forge-std/interfaces/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\ninterface IERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n" + }, + "forge-std/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\n/// @dev Interface of the ERC20 standard as defined in the EIP.\n/// @dev This includes the optional name, symbol, and decimals metadata.\ninterface IERC20 {\n /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`\n /// is the new allowance.\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /// @notice Returns the amount of tokens in existence.\n function totalSupply() external view returns (uint256);\n\n /// @notice Returns the amount of tokens owned by `account`.\n function balanceOf(address account) external view returns (uint256);\n\n /// @notice Moves `amount` tokens from the caller's account to `to`.\n function transfer(address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the remaining number of tokens that `spender` is allowed\n /// to spend on behalf of `owner`\n function allowance(address owner, address spender) external view returns (uint256);\n\n /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.\n /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n function approve(address spender, uint256 amount) external returns (bool);\n\n /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.\n /// `amount` is then deducted from the caller's allowance.\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n\n /// @notice Returns the name of the token.\n function name() external view returns (string memory);\n\n /// @notice Returns the symbol of the token.\n function symbol() external view returns (string memory);\n\n /// @notice Returns the decimals places of the token.\n function decimals() external view returns (uint8);\n}\n" + }, + "forge-std/interfaces/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\nimport \"./IERC165.sol\";\n\n/// @title ERC-721 Non-Fungible Token Standard\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.\ninterface IERC721 is IERC165 {\n /// @dev This emits when ownership of any NFT changes by any mechanism.\n /// This event emits when NFTs are created (`from` == 0) and destroyed\n /// (`to` == 0). Exception: during contract creation, any number of NFTs\n /// may be created and assigned without emitting Transfer. At the time of\n /// any transfer, the approved address for that NFT (if any) is reset to none.\n event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);\n\n /// @dev This emits when the approved address for an NFT is changed or\n /// reaffirmed. The zero address indicates there is no approved address.\n /// When a Transfer event emits, this also indicates that the approved\n /// address for that NFT (if any) is reset to none.\n event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);\n\n /// @dev This emits when an operator is enabled or disabled for an owner.\n /// The operator can manage all NFTs of the owner.\n event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n /// @notice Count all NFTs assigned to an owner\n /// @dev NFTs assigned to the zero address are considered invalid, and this\n /// function throws for queries about the zero address.\n /// @param _owner An address for whom to query the balance\n /// @return The number of NFTs owned by `_owner`, possibly zero\n function balanceOf(address _owner) external view returns (uint256);\n\n /// @notice Find the owner of an NFT\n /// @dev NFTs assigned to zero address are considered invalid, and queries\n /// about them do throw.\n /// @param _tokenId The identifier for an NFT\n /// @return The address of the owner of the NFT\n function ownerOf(uint256 _tokenId) external view returns (address);\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT. When transfer is complete, this function\n /// checks if `_to` is a smart contract (code size > 0). If so, it calls\n /// `onERC721Received` on `_to` and throws if the return value is not\n /// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n /// @param data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev This works identically to the other function with an extra data parameter,\n /// except this function just sets data to \"\".\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n /// THEY MAY BE PERMANENTLY LOST\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function transferFrom(address _from, address _to, uint256 _tokenId) external payable;\n\n /// @notice Change or reaffirm the approved address for an NFT\n /// @dev The zero address indicates there is no approved address.\n /// Throws unless `msg.sender` is the current NFT owner, or an authorized\n /// operator of the current owner.\n /// @param _approved The new approved NFT controller\n /// @param _tokenId The NFT to approve\n function approve(address _approved, uint256 _tokenId) external payable;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage\n /// all of `msg.sender`'s assets\n /// @dev Emits the ApprovalForAll event. The contract MUST allow\n /// multiple operators per owner.\n /// @param _operator Address to add to the set of authorized operators\n /// @param _approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address _operator, bool _approved) external;\n\n /// @notice Get the approved address for a single NFT\n /// @dev Throws if `_tokenId` is not a valid NFT.\n /// @param _tokenId The NFT to find the approved address for\n /// @return The approved address for this NFT, or the zero address if there is none\n function getApproved(uint256 _tokenId) external view returns (address);\n\n /// @notice Query if an address is an authorized operator for another address\n /// @param _owner The address that owns the NFTs\n /// @param _operator The address that acts on behalf of the owner\n /// @return True if `_operator` is an approved operator for `_owner`, false otherwise\n function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n}\n\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\ninterface IERC721TokenReceiver {\n /// @notice Handle the receipt of an NFT\n /// @dev The ERC721 smart contract calls this function on the recipient\n /// after a `transfer`. This function MAY throw to revert and reject the\n /// transfer. Return of other than the magic value MUST result in the\n /// transaction being reverted.\n /// Note: the contract address is always the message sender.\n /// @param _operator The address which called `safeTransferFrom` function\n /// @param _from The address which previously owned the token\n /// @param _tokenId The NFT identifier which is being transferred\n /// @param _data Additional data with no specified format\n /// @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n /// unless throwing\n function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)\n external\n returns (bytes4);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.\ninterface IERC721Metadata is IERC721 {\n /// @notice A descriptive name for a collection of NFTs in this contract\n function name() external view returns (string memory _name);\n\n /// @notice An abbreviated name for NFTs in this contract\n function symbol() external view returns (string memory _symbol);\n\n /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\n /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC\n /// 3986. The URI may point to a JSON file that conforms to the \"ERC721\n /// Metadata JSON Schema\".\n function tokenURI(uint256 _tokenId) external view returns (string memory);\n}\n\n/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// Note: the ERC-165 identifier for this interface is 0x780e9d63.\ninterface IERC721Enumerable is IERC721 {\n /// @notice Count NFTs tracked by this contract\n /// @return A count of valid NFTs tracked by this contract, where each one of\n /// them has an assigned and queryable owner not equal to the zero address\n function totalSupply() external view returns (uint256);\n\n /// @notice Enumerate valid NFTs\n /// @dev Throws if `_index` >= `totalSupply()`.\n /// @param _index A counter less than `totalSupply()`\n /// @return The token identifier for the `_index`th NFT,\n /// (sort order not specified)\n function tokenByIndex(uint256 _index) external view returns (uint256);\n\n /// @notice Enumerate NFTs assigned to an owner\n /// @dev Throws if `_index` >= `balanceOf(_owner)` or if\n /// `_owner` is the zero address, representing invalid NFTs.\n /// @param _owner An address where we are interested in NFTs owned by them\n /// @param _index A counter less than `balanceOf(_owner)`\n /// @return The token identifier for the `_index`th NFT assigned to `_owner`,\n /// (sort order not specified)\n function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);\n}\n" + }, + "forge-std/interfaces/IMulticall3.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\ninterface IMulticall3 {\n struct Call {\n address target;\n bytes callData;\n }\n\n struct Call3 {\n address target;\n bool allowFailure;\n bytes callData;\n }\n\n struct Call3Value {\n address target;\n bool allowFailure;\n uint256 value;\n bytes callData;\n }\n\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes[] memory returnData);\n\n function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);\n\n function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);\n\n function blockAndAggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n\n function getBasefee() external view returns (uint256 basefee);\n\n function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);\n\n function getBlockNumber() external view returns (uint256 blockNumber);\n\n function getChainId() external view returns (uint256 chainid);\n\n function getCurrentBlockCoinbase() external view returns (address coinbase);\n\n function getCurrentBlockDifficulty() external view returns (uint256 difficulty);\n\n function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);\n\n function getCurrentBlockTimestamp() external view returns (uint256 timestamp);\n\n function getEthBalance(address addr) external view returns (uint256 balance);\n\n function getLastBlockHash() external view returns (bytes32 blockHash);\n\n function tryAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (Result[] memory returnData);\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n}\n" + }, + "forge-std/mocks/MockERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC20} from \"../interfaces/IERC20.sol\";\n\n/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol\ncontract MockERC20 is IERC20 {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n uint8 internal _decimals;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function decimals() external view override returns (uint8) {\n return _decimals;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal _totalSupply;\n\n mapping(address => uint256) internal _balanceOf;\n\n mapping(address => mapping(address => uint256)) internal _allowance;\n\n function totalSupply() external view override returns (uint256) {\n return _totalSupply;\n }\n\n function balanceOf(address owner) external view override returns (uint256) {\n return _balanceOf[owner];\n }\n\n function allowance(address owner, address spender) external view override returns (uint256) {\n return _allowance[owner][spender];\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal INITIAL_CHAIN_ID;\n\n bytes32 internal INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_, uint8 decimals_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n _decimals = decimals_;\n\n INITIAL_CHAIN_ID = _pureChainId();\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount);\n\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n public\n virtual\n {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n _allowance[recoveredAddress][spender] = value;\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(_name)),\n keccak256(\"1\"),\n _pureChainId(),\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n _totalSupply = _add(_totalSupply, amount);\n _balanceOf[to] = _add(_balanceOf[to], amount);\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n _balanceOf[from] = _sub(_balanceOf[from], amount);\n _totalSupply = _sub(_totalSupply, amount);\n\n emit Transfer(from, address(0), amount);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MATH LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"ERC20: addition overflow\");\n return c;\n }\n\n function _sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(a >= b, \"ERC20: subtraction underflow\");\n return a - b;\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n" + }, + "forge-std/mocks/MockERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {IERC721Metadata, IERC721TokenReceiver} from \"../interfaces/IERC721.sol\";\n\n/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production.\n/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol\ncontract MockERC721 is IERC721Metadata {\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE/LOGIC\n //////////////////////////////////////////////////////////////*/\n\n string internal _name;\n\n string internal _symbol;\n\n function name() external view override returns (string memory) {\n return _name;\n }\n\n function symbol() external view override returns (string memory) {\n return _symbol;\n }\n\n function tokenURI(uint256 id) public view virtual override returns (string memory) {}\n\n /*//////////////////////////////////////////////////////////////\n ERC721 BALANCE/OWNER STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _ownerOf;\n\n mapping(address => uint256) internal _balanceOf;\n\n function ownerOf(uint256 id) public view virtual override returns (address owner) {\n require((owner = _ownerOf[id]) != address(0), \"NOT_MINTED\");\n }\n\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ZERO_ADDRESS\");\n\n return _balanceOf[owner];\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 APPROVAL STORAGE\n //////////////////////////////////////////////////////////////*/\n\n mapping(uint256 => address) internal _getApproved;\n\n mapping(address => mapping(address => bool)) internal _isApprovedForAll;\n\n function getApproved(uint256 id) public view virtual override returns (address) {\n return _getApproved[id];\n }\n\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _isApprovedForAll[owner][operator];\n }\n\n /*//////////////////////////////////////////////////////////////\n INITIALIZE\n //////////////////////////////////////////////////////////////*/\n\n /// @dev A bool to track whether the contract has been initialized.\n bool private initialized;\n\n /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and\n /// syntaxes, we add an initialization function that can be called only once.\n function initialize(string memory name_, string memory symbol_) public {\n require(!initialized, \"ALREADY_INITIALIZED\");\n\n _name = name_;\n _symbol = symbol_;\n\n initialized = true;\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC721 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 id) public payable virtual override {\n address owner = _ownerOf[id];\n\n require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], \"NOT_AUTHORIZED\");\n\n _getApproved[id] = spender;\n\n emit Approval(owner, spender, id);\n }\n\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _isApprovedForAll[msg.sender][operator] = approved;\n\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function transferFrom(address from, address to, uint256 id) public payable virtual override {\n require(from == _ownerOf[id], \"WRONG_FROM\");\n\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(\n msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id],\n \"NOT_AUTHORIZED\"\n );\n\n // Underflow of the sender's balance is impossible because we check for\n // ownership above and the recipient's balance can't realistically overflow.\n _balanceOf[from]--;\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n delete _getApproved[id];\n\n emit Transfer(from, to, id);\n }\n\n function safeTransferFrom(address from, address to, uint256 id) public payable virtual override {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function safeTransferFrom(address from, address to, uint256 id, bytes memory data)\n public\n payable\n virtual\n override\n {\n transferFrom(from, to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC165 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721\n || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 id) internal virtual {\n require(to != address(0), \"INVALID_RECIPIENT\");\n\n require(_ownerOf[id] == address(0), \"ALREADY_MINTED\");\n\n // Counter overflow is incredibly unrealistic.\n\n _balanceOf[to]++;\n\n _ownerOf[id] = to;\n\n emit Transfer(address(0), to, id);\n }\n\n function _burn(uint256 id) internal virtual {\n address owner = _ownerOf[id];\n\n require(owner != address(0), \"NOT_MINTED\");\n\n _balanceOf[owner]--;\n\n delete _ownerOf[id];\n\n delete _getApproved[id];\n\n emit Transfer(owner, address(0), id);\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL SAFE MINT LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _safeMint(address to, uint256 id) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \"\")\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n function _safeMint(address to, uint256 id, bytes memory data) internal virtual {\n _mint(to, id);\n\n require(\n !_isContract(to)\n || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data)\n == IERC721TokenReceiver.onERC721Received.selector,\n \"UNSAFE_RECIPIENT\"\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n HELPERS\n //////////////////////////////////////////////////////////////*/\n\n function _isContract(address _addr) private view returns (bool) {\n uint256 codeLength;\n\n // Assembly required for versions < 0.8.0 to check extcodesize.\n assembly {\n codeLength := extcodesize(_addr)\n }\n\n return codeLength > 0;\n }\n}\n" + }, + "forge-std/safeconsole.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\n/// @author philogy \n/// @dev Code generated automatically by script.\nlibrary safeconsole {\n uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;\n\n // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)\n // for the view-to-pure log trick.\n function _sendLogPayload(uint256 offset, uint256 size) private pure {\n function(uint256, uint256) internal view fnIn = _sendLogPayloadView;\n function(uint256, uint256) internal pure pureSendLogPayload;\n /// @solidity memory-safe-assembly\n assembly {\n pureSendLogPayload := fnIn\n }\n pureSendLogPayload(offset, size);\n }\n\n function _sendLogPayloadView(uint256 offset, uint256 size) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))\n }\n }\n\n function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {\n function(uint256, uint256, uint256) internal view fnIn = _memcopyView;\n function(uint256, uint256, uint256) internal pure pureMemcopy;\n /// @solidity memory-safe-assembly\n assembly {\n pureMemcopy := fnIn\n }\n pureMemcopy(fromOffset, toOffset, length);\n }\n\n function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {\n /// @solidity memory-safe-assembly\n assembly {\n pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))\n }\n }\n\n function logMemory(uint256 offset, uint256 length) internal pure {\n if (offset >= 0x60) {\n // Sufficient memory before slice to prepare call header.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(sub(offset, 0x60))\n m1 := mload(sub(offset, 0x40))\n m2 := mload(sub(offset, 0x20))\n // Selector of `log(bytes)`.\n mstore(sub(offset, 0x60), 0x0be77f56)\n mstore(sub(offset, 0x40), 0x20)\n mstore(sub(offset, 0x20), length)\n }\n _sendLogPayload(offset - 0x44, length + 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(sub(offset, 0x60), m0)\n mstore(sub(offset, 0x40), m1)\n mstore(sub(offset, 0x20), m2)\n }\n } else {\n // Insufficient space, so copy slice forward, add header and reverse.\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n uint256 endOffset = offset + length;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(add(endOffset, 0x00))\n m1 := mload(add(endOffset, 0x20))\n m2 := mload(add(endOffset, 0x40))\n }\n _memcopy(offset, offset + 0x60, length);\n /// @solidity memory-safe-assembly\n assembly {\n // Selector of `log(bytes)`.\n mstore(add(offset, 0x00), 0x0be77f56)\n mstore(add(offset, 0x20), 0x20)\n mstore(add(offset, 0x40), length)\n }\n _sendLogPayload(offset + 0x1c, length + 0x44);\n _memcopy(offset + 0x60, offset, length);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(endOffset, 0x00), m0)\n mstore(add(endOffset, 0x20), m1)\n mstore(add(endOffset, 0x40), m2)\n }\n }\n }\n\n function log(address p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(address)`.\n mstore(0x00, 0x2c2ecbc2)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bool p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(bool)`.\n mstore(0x00, 0x32458eed)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(uint256 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n // Selector of `log(uint256)`.\n mstore(0x00, 0xf82c50f1)\n mstore(0x20, p0)\n }\n _sendLogPayload(0x1c, 0x24);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n }\n }\n\n function log(bytes32 p0) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(string)`.\n mstore(0x00, 0x41304fac)\n mstore(0x20, 0x20)\n writeString(0x40, p0)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,address)`.\n mstore(0x00, 0xdaf0d4aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,bool)`.\n mstore(0x00, 0x75b605d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(address,uint256)`.\n mstore(0x00, 0x8309e8a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(address p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,string)`.\n mstore(0x00, 0x759f86bb)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,address)`.\n mstore(0x00, 0x853c4849)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,bool)`.\n mstore(0x00, 0x2a110e83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(bool,uint256)`.\n mstore(0x00, 0x399174d3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(bool p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,string)`.\n mstore(0x00, 0x8feac525)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,address)`.\n mstore(0x00, 0x69276c86)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,bool)`.\n mstore(0x00, 0x1c9d7eb3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n // Selector of `log(uint256,uint256)`.\n mstore(0x00, 0xf666715a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n }\n _sendLogPayload(0x1c, 0x44);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n }\n }\n\n function log(uint256 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,string)`.\n mstore(0x00, 0x643fd0df)\n mstore(0x20, p0)\n mstore(0x40, 0x40)\n writeString(0x60, p1)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, address p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,address)`.\n mstore(0x00, 0x319af333)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bool p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,bool)`.\n mstore(0x00, 0xc3b55635)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, uint256 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(string,uint256)`.\n mstore(0x00, 0xb60e72cc)\n mstore(0x20, 0x40)\n mstore(0x40, p1)\n writeString(0x60, p0)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bytes32 p0, bytes32 p1) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,string)`.\n mstore(0x00, 0x4b5c4277)\n mstore(0x20, 0x40)\n mstore(0x40, 0x80)\n writeString(0x60, p0)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,address)`.\n mstore(0x00, 0x018c84c2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,bool)`.\n mstore(0x00, 0xf2a66286)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,address,uint256)`.\n mstore(0x00, 0x17fe6185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,address,string)`.\n mstore(0x00, 0x007150be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,address)`.\n mstore(0x00, 0xf11699ed)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,bool)`.\n mstore(0x00, 0xeb830c92)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,bool,uint256)`.\n mstore(0x00, 0x9c4f99fb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,bool,string)`.\n mstore(0x00, 0x212255cc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,address)`.\n mstore(0x00, 0x7bc0d848)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,bool)`.\n mstore(0x00, 0x678209a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(address,uint256,uint256)`.\n mstore(0x00, 0xb69bcaf6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,uint256,string)`.\n mstore(0x00, 0xa1f2e8aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,address)`.\n mstore(0x00, 0xf08744e8)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,bool)`.\n mstore(0x00, 0xcf020fb1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(address,string,uint256)`.\n mstore(0x00, 0x67dd6ff1)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(address,string,string)`.\n mstore(0x00, 0xfb772265)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,address)`.\n mstore(0x00, 0xd2763667)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,bool)`.\n mstore(0x00, 0x18c9c746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,address,uint256)`.\n mstore(0x00, 0x5f7b9afb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,address,string)`.\n mstore(0x00, 0xde9a9270)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,address)`.\n mstore(0x00, 0x1078f68d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,bool)`.\n mstore(0x00, 0x50709698)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,bool,uint256)`.\n mstore(0x00, 0x12f21602)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,bool,string)`.\n mstore(0x00, 0x2555fa46)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,address)`.\n mstore(0x00, 0x088ef9d2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,bool)`.\n mstore(0x00, 0xe8defba9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(bool,uint256,uint256)`.\n mstore(0x00, 0x37103367)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,uint256,string)`.\n mstore(0x00, 0xc3fc3970)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,address)`.\n mstore(0x00, 0x9591b953)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,bool)`.\n mstore(0x00, 0xdbb4c247)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(bool,string,uint256)`.\n mstore(0x00, 0x1093ee11)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(bool,string,string)`.\n mstore(0x00, 0xb076847f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,address)`.\n mstore(0x00, 0xbcfd9be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,bool)`.\n mstore(0x00, 0x9b6ec042)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,address,uint256)`.\n mstore(0x00, 0x5a9b5ed5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,address,string)`.\n mstore(0x00, 0x63cb41f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,address)`.\n mstore(0x00, 0x35085f7b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,bool)`.\n mstore(0x00, 0x20718650)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,bool,uint256)`.\n mstore(0x00, 0x20098014)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,bool,string)`.\n mstore(0x00, 0x85775021)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,address)`.\n mstore(0x00, 0x5c96b331)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,bool)`.\n mstore(0x00, 0x4766da72)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n // Selector of `log(uint256,uint256,uint256)`.\n mstore(0x00, 0xd1ed7a3c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n }\n _sendLogPayload(0x1c, 0x64);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,uint256,string)`.\n mstore(0x00, 0x71d04af2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x60)\n writeString(0x80, p2)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,address)`.\n mstore(0x00, 0x7afac959)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,bool)`.\n mstore(0x00, 0x4ceda75a)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(uint256,string,uint256)`.\n mstore(0x00, 0x37aa7d4c)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, p2)\n writeString(0x80, p1)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(uint256,string,string)`.\n mstore(0x00, 0xb115611f)\n mstore(0x20, p0)\n mstore(0x40, 0x60)\n mstore(0x60, 0xa0)\n writeString(0x80, p1)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, address p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,address)`.\n mstore(0x00, 0xfcec75e0)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,bool)`.\n mstore(0x00, 0xc91d5ed4)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,address,uint256)`.\n mstore(0x00, 0x0d26b925)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,address,string)`.\n mstore(0x00, 0xe0e9ad4f)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,address)`.\n mstore(0x00, 0x932bbb38)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,bool)`.\n mstore(0x00, 0x850b7ad6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,bool,uint256)`.\n mstore(0x00, 0xc95958d6)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,bool,string)`.\n mstore(0x00, 0xe298f47d)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,address)`.\n mstore(0x00, 0x1c7ec448)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,bool)`.\n mstore(0x00, 0xca7733b1)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n // Selector of `log(string,uint256,uint256)`.\n mstore(0x00, 0xca47c4eb)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, p2)\n writeString(0x80, p0)\n }\n _sendLogPayload(0x1c, 0xa4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,uint256,string)`.\n mstore(0x00, 0x5970e089)\n mstore(0x20, 0x60)\n mstore(0x40, p1)\n mstore(0x60, 0xa0)\n writeString(0x80, p0)\n writeString(0xc0, p2)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,address)`.\n mstore(0x00, 0x95ed0195)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,bool)`.\n mstore(0x00, 0xb0e0f9b5)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n // Selector of `log(string,string,uint256)`.\n mstore(0x00, 0x5821efa1)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, p2)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n }\n _sendLogPayload(0x1c, 0xe4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n // Selector of `log(string,string,string)`.\n mstore(0x00, 0x2ced7cef)\n mstore(0x20, 0x60)\n mstore(0x40, 0xa0)\n mstore(0x60, 0xe0)\n writeString(0x80, p0)\n writeString(0xc0, p1)\n writeString(0x100, p2)\n }\n _sendLogPayload(0x1c, 0x124);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n }\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,address)`.\n mstore(0x00, 0x665bf134)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,bool)`.\n mstore(0x00, 0x0e378994)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,address,uint256)`.\n mstore(0x00, 0x94250d77)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,address,string)`.\n mstore(0x00, 0xf808da20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,address)`.\n mstore(0x00, 0x9f1bc36e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,bool)`.\n mstore(0x00, 0x2cd4134a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,bool,uint256)`.\n mstore(0x00, 0x3971e78c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,bool,string)`.\n mstore(0x00, 0xaa6540c8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,address)`.\n mstore(0x00, 0x8da6def5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,bool)`.\n mstore(0x00, 0x9b4254e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,address,uint256,uint256)`.\n mstore(0x00, 0xbe553481)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,uint256,string)`.\n mstore(0x00, 0xfdb4f990)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,address)`.\n mstore(0x00, 0x8f736d16)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,bool)`.\n mstore(0x00, 0x6f1a594e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,address,string,uint256)`.\n mstore(0x00, 0xef1cefe7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,address,string,string)`.\n mstore(0x00, 0x21bdaf25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,address)`.\n mstore(0x00, 0x660375dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,bool)`.\n mstore(0x00, 0xa6f50b0f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,address,uint256)`.\n mstore(0x00, 0xa75c59de)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,address,string)`.\n mstore(0x00, 0x2dd778e6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,address)`.\n mstore(0x00, 0xcf394485)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,bool)`.\n mstore(0x00, 0xcac43479)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,bool,uint256)`.\n mstore(0x00, 0x8c4e5de6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,bool,string)`.\n mstore(0x00, 0xdfc4a2e8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,address)`.\n mstore(0x00, 0xccf790a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,bool)`.\n mstore(0x00, 0xc4643e20)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,bool,uint256,uint256)`.\n mstore(0x00, 0x386ff5f4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,uint256,string)`.\n mstore(0x00, 0x0aa6cfad)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,address)`.\n mstore(0x00, 0x19fd4956)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,bool)`.\n mstore(0x00, 0x50ad461d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,bool,string,uint256)`.\n mstore(0x00, 0x80e6a20b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,bool,string,string)`.\n mstore(0x00, 0x475c5c33)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,address)`.\n mstore(0x00, 0x478d1c62)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,bool)`.\n mstore(0x00, 0xa1bcc9b3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,address,uint256)`.\n mstore(0x00, 0x100f650e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,address,string)`.\n mstore(0x00, 0x1da986ea)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,address)`.\n mstore(0x00, 0xa31bfdcc)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,bool)`.\n mstore(0x00, 0x3bf5e537)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,bool,uint256)`.\n mstore(0x00, 0x22f6b999)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,bool,string)`.\n mstore(0x00, 0xc5ad85f9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,address)`.\n mstore(0x00, 0x20e3984d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,bool)`.\n mstore(0x00, 0x66f1bc67)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(address,uint256,uint256,uint256)`.\n mstore(0x00, 0x34f0e636)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,uint256,string)`.\n mstore(0x00, 0x4a28c017)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,address)`.\n mstore(0x00, 0x5c430d47)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,bool)`.\n mstore(0x00, 0xcf18105c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,uint256,string,uint256)`.\n mstore(0x00, 0xbf01f891)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,uint256,string,string)`.\n mstore(0x00, 0x88a8c406)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,address)`.\n mstore(0x00, 0x0d36fa20)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,bool)`.\n mstore(0x00, 0x0df12b76)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,address,uint256)`.\n mstore(0x00, 0x457fe3cf)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,address,string)`.\n mstore(0x00, 0xf7e36245)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,address)`.\n mstore(0x00, 0x205871c2)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,bool)`.\n mstore(0x00, 0x5f1d5c9f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,bool,uint256)`.\n mstore(0x00, 0x515e38b6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,bool,string)`.\n mstore(0x00, 0xbc0b61fe)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,address)`.\n mstore(0x00, 0x63183678)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,bool)`.\n mstore(0x00, 0x0ef7e050)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(address,string,uint256,uint256)`.\n mstore(0x00, 0x1dc8e1b8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,uint256,string)`.\n mstore(0x00, 0x448830a8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,address)`.\n mstore(0x00, 0xa04e2f87)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,bool)`.\n mstore(0x00, 0x35a5071f)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(address,string,string,uint256)`.\n mstore(0x00, 0x159f8927)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(address,string,string,string)`.\n mstore(0x00, 0x5d02c50b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,address)`.\n mstore(0x00, 0x1d14d001)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,bool)`.\n mstore(0x00, 0x46600be0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,address,uint256)`.\n mstore(0x00, 0x0c66d1be)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,address,string)`.\n mstore(0x00, 0xd812a167)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,address)`.\n mstore(0x00, 0x1c41a336)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,bool)`.\n mstore(0x00, 0x6a9c478b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,bool,uint256)`.\n mstore(0x00, 0x07831502)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,bool,string)`.\n mstore(0x00, 0x4a66cb34)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,address)`.\n mstore(0x00, 0x136b05dd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,bool)`.\n mstore(0x00, 0xd6019f1c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,address,uint256,uint256)`.\n mstore(0x00, 0x7bf181a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,uint256,string)`.\n mstore(0x00, 0x51f09ff8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,address)`.\n mstore(0x00, 0x6f7c603e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,bool)`.\n mstore(0x00, 0xe2bfd60b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,address,string,uint256)`.\n mstore(0x00, 0xc21f64c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,address,string,string)`.\n mstore(0x00, 0xa73c1db6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,address)`.\n mstore(0x00, 0xf4880ea4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,bool)`.\n mstore(0x00, 0xc0a302d8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,address,uint256)`.\n mstore(0x00, 0x4c123d57)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,address,string)`.\n mstore(0x00, 0xa0a47963)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,address)`.\n mstore(0x00, 0x8c329b1a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,bool)`.\n mstore(0x00, 0x3b2a5ce0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,bool,uint256)`.\n mstore(0x00, 0x6d7045c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,bool,string)`.\n mstore(0x00, 0x2ae408d4)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,address)`.\n mstore(0x00, 0x54a7a9a0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,bool)`.\n mstore(0x00, 0x619e4d0e)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,bool,uint256,uint256)`.\n mstore(0x00, 0x0bb00eab)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,uint256,string)`.\n mstore(0x00, 0x7dd4d0e0)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,address)`.\n mstore(0x00, 0xf9ad2b89)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,bool)`.\n mstore(0x00, 0xb857163a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,bool,string,uint256)`.\n mstore(0x00, 0xe3a9ca2f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,bool,string,string)`.\n mstore(0x00, 0x6d1e8751)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,address)`.\n mstore(0x00, 0x26f560a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,bool)`.\n mstore(0x00, 0xb4c314ff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,address,uint256)`.\n mstore(0x00, 0x1537dc87)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,address,string)`.\n mstore(0x00, 0x1bb3b09a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,address)`.\n mstore(0x00, 0x9acd3616)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,bool)`.\n mstore(0x00, 0xceb5f4d7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,bool,uint256)`.\n mstore(0x00, 0x7f9bbca2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,bool,string)`.\n mstore(0x00, 0x9143dbb1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,address)`.\n mstore(0x00, 0x00dd87b9)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,bool)`.\n mstore(0x00, 0xbe984353)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(bool,uint256,uint256,uint256)`.\n mstore(0x00, 0x374bb4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,uint256,string)`.\n mstore(0x00, 0x8e69fb5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,address)`.\n mstore(0x00, 0xfedd1fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,bool)`.\n mstore(0x00, 0xe5e70b2b)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,uint256,string,uint256)`.\n mstore(0x00, 0x6a1199e2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,uint256,string,string)`.\n mstore(0x00, 0xf5bc2249)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,address)`.\n mstore(0x00, 0x2b2b18dc)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,bool)`.\n mstore(0x00, 0x6dd434ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,address,uint256)`.\n mstore(0x00, 0xa5cada94)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,address,string)`.\n mstore(0x00, 0x12d6c788)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,address)`.\n mstore(0x00, 0x538e06ab)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,bool)`.\n mstore(0x00, 0xdc5e935b)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,bool,uint256)`.\n mstore(0x00, 0x1606a393)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,bool,string)`.\n mstore(0x00, 0x483d0416)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,address)`.\n mstore(0x00, 0x1596a1ce)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,bool)`.\n mstore(0x00, 0x6b0e5d53)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(bool,string,uint256,uint256)`.\n mstore(0x00, 0x28863fcb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,uint256,string)`.\n mstore(0x00, 0x1ad96de6)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,address)`.\n mstore(0x00, 0x97d394d8)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,bool)`.\n mstore(0x00, 0x1e4b87e5)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(bool,string,string,uint256)`.\n mstore(0x00, 0x7be0c3eb)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(bool,string,string,string)`.\n mstore(0x00, 0x1762e32a)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,address)`.\n mstore(0x00, 0x2488b414)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,bool)`.\n mstore(0x00, 0x091ffaf5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,address,uint256)`.\n mstore(0x00, 0x736efbb6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,address,string)`.\n mstore(0x00, 0x031c6f73)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,address)`.\n mstore(0x00, 0xef72c513)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,bool)`.\n mstore(0x00, 0xe351140f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,bool,uint256)`.\n mstore(0x00, 0x5abd992a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,bool,string)`.\n mstore(0x00, 0x90fb06aa)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,address)`.\n mstore(0x00, 0x15c127b5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,bool)`.\n mstore(0x00, 0x5f743a7c)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,address,uint256,uint256)`.\n mstore(0x00, 0x0c9cd9c1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,uint256,string)`.\n mstore(0x00, 0xddb06521)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,address)`.\n mstore(0x00, 0x9cba8fff)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,bool)`.\n mstore(0x00, 0xcc32ab07)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,address,string,uint256)`.\n mstore(0x00, 0x46826b5d)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,address,string,string)`.\n mstore(0x00, 0x3e128ca3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,address)`.\n mstore(0x00, 0xa1ef4cbb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,bool)`.\n mstore(0x00, 0x454d54a5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,address,uint256)`.\n mstore(0x00, 0x078287f5)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,address,string)`.\n mstore(0x00, 0xade052c7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,address)`.\n mstore(0x00, 0x69640b59)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,bool)`.\n mstore(0x00, 0xb6f577a1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,bool,uint256)`.\n mstore(0x00, 0x7464ce23)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,bool,string)`.\n mstore(0x00, 0xdddb9561)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,address)`.\n mstore(0x00, 0x88cb6041)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,bool)`.\n mstore(0x00, 0x91a02e2a)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,bool,uint256,uint256)`.\n mstore(0x00, 0xc6acc7a8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,uint256,string)`.\n mstore(0x00, 0xde03e774)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,address)`.\n mstore(0x00, 0xef529018)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,bool)`.\n mstore(0x00, 0xeb928d7f)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,bool,string,uint256)`.\n mstore(0x00, 0x2c1d0746)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,bool,string,string)`.\n mstore(0x00, 0x68c8b8bd)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,address)`.\n mstore(0x00, 0x56a5d1b1)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,bool)`.\n mstore(0x00, 0x15cac476)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,address,uint256)`.\n mstore(0x00, 0x88f6e4b2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,address,string)`.\n mstore(0x00, 0x6cde40b8)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,address)`.\n mstore(0x00, 0x9a816a83)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,bool)`.\n mstore(0x00, 0xab085ae6)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,bool,uint256)`.\n mstore(0x00, 0xeb7f6fd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,bool,string)`.\n mstore(0x00, 0xa5b4fc99)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,address)`.\n mstore(0x00, 0xfa8185af)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,bool)`.\n mstore(0x00, 0xc598d185)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n /// @solidity memory-safe-assembly\n assembly {\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n // Selector of `log(uint256,uint256,uint256,uint256)`.\n mstore(0x00, 0x193fb800)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n }\n _sendLogPayload(0x1c, 0x84);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n }\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,uint256,string)`.\n mstore(0x00, 0x59cfcbe3)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0x80)\n writeString(0xa0, p3)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,address)`.\n mstore(0x00, 0x42d21db7)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,bool)`.\n mstore(0x00, 0x7af6ab25)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,uint256,string,uint256)`.\n mstore(0x00, 0x5da297eb)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, p3)\n writeString(0xa0, p2)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,uint256,string,string)`.\n mstore(0x00, 0x27d8afd2)\n mstore(0x20, p0)\n mstore(0x40, p1)\n mstore(0x60, 0x80)\n mstore(0x80, 0xc0)\n writeString(0xa0, p2)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,address)`.\n mstore(0x00, 0x6168ed61)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,bool)`.\n mstore(0x00, 0x90c30a56)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,address,uint256)`.\n mstore(0x00, 0xe8d3018d)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,address,string)`.\n mstore(0x00, 0x9c3adfa1)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,address)`.\n mstore(0x00, 0xae2ec581)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,bool)`.\n mstore(0x00, 0xba535d9c)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,bool,uint256)`.\n mstore(0x00, 0xcf009880)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,bool,string)`.\n mstore(0x00, 0xd2d423cd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,address)`.\n mstore(0x00, 0x3b2279b4)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,bool)`.\n mstore(0x00, 0x691a8f74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(uint256,string,uint256,uint256)`.\n mstore(0x00, 0x82c25b74)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,uint256,string)`.\n mstore(0x00, 0xb7b914ca)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p1)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,address)`.\n mstore(0x00, 0xd583c602)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,bool)`.\n mstore(0x00, 0xb3a6b6bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(uint256,string,string,uint256)`.\n mstore(0x00, 0xb028c9bd)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(uint256,string,string,string)`.\n mstore(0x00, 0x21ad0683)\n mstore(0x20, p0)\n mstore(0x40, 0x80)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p1)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,address)`.\n mstore(0x00, 0xed8f28f6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,bool)`.\n mstore(0x00, 0xb59dbd60)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,address,uint256)`.\n mstore(0x00, 0x8ef3f399)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,address,string)`.\n mstore(0x00, 0x800a1c67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,address)`.\n mstore(0x00, 0x223603bd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,bool)`.\n mstore(0x00, 0x79884c2b)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,bool,uint256)`.\n mstore(0x00, 0x3e9f866a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,bool,string)`.\n mstore(0x00, 0x0454c079)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,address)`.\n mstore(0x00, 0x63fb8bc5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,bool)`.\n mstore(0x00, 0xfc4845f0)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,address,uint256,uint256)`.\n mstore(0x00, 0xf8f51b1e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,uint256,string)`.\n mstore(0x00, 0x5a477632)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,address)`.\n mstore(0x00, 0xaabc9a31)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,bool)`.\n mstore(0x00, 0x5f15d28c)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,address,string,uint256)`.\n mstore(0x00, 0x91d1112e)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,address,string,string)`.\n mstore(0x00, 0x245986f2)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,address)`.\n mstore(0x00, 0x33e9dd1d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,bool)`.\n mstore(0x00, 0x958c28c6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,address,uint256)`.\n mstore(0x00, 0x5d08bb05)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,address,string)`.\n mstore(0x00, 0x2d8e33a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,address)`.\n mstore(0x00, 0x7190a529)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,bool)`.\n mstore(0x00, 0x895af8c5)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,bool,uint256)`.\n mstore(0x00, 0x8e3f78a9)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,bool,string)`.\n mstore(0x00, 0x9d22d5dd)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,address)`.\n mstore(0x00, 0x935e09bf)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,bool)`.\n mstore(0x00, 0x8af7cf8a)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,bool,uint256,uint256)`.\n mstore(0x00, 0x64b5bb67)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,uint256,string)`.\n mstore(0x00, 0x742d6ee7)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,address)`.\n mstore(0x00, 0xe0625b29)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,bool)`.\n mstore(0x00, 0x3f8a701d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,bool,string,uint256)`.\n mstore(0x00, 0x24f91465)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,bool,string,string)`.\n mstore(0x00, 0xa826caeb)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,address)`.\n mstore(0x00, 0x5ea2b7ae)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,bool)`.\n mstore(0x00, 0x82112a42)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,address,uint256)`.\n mstore(0x00, 0x4f04fdc6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,address,string)`.\n mstore(0x00, 0x9ffb2f93)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,address)`.\n mstore(0x00, 0xe0e95b98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,bool)`.\n mstore(0x00, 0x354c36d6)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,bool,uint256)`.\n mstore(0x00, 0xe41b6f6f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,bool,string)`.\n mstore(0x00, 0xabf73a98)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,address)`.\n mstore(0x00, 0xe21de278)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,bool)`.\n mstore(0x00, 0x7626db92)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n // Selector of `log(string,uint256,uint256,uint256)`.\n mstore(0x00, 0xa7a87853)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n }\n _sendLogPayload(0x1c, 0xc4);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n }\n }\n\n function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,uint256,string)`.\n mstore(0x00, 0x854b3496)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, p2)\n mstore(0x80, 0xc0)\n writeString(0xa0, p0)\n writeString(0xe0, p3)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,address)`.\n mstore(0x00, 0x7c4632a4)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,bool)`.\n mstore(0x00, 0x7d24491d)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,uint256,string,uint256)`.\n mstore(0x00, 0xc67ea9d1)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,uint256,string,string)`.\n mstore(0x00, 0x5ab84e1f)\n mstore(0x20, 0x80)\n mstore(0x40, p1)\n mstore(0x60, 0xc0)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p2)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,address)`.\n mstore(0x00, 0x439c7bef)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,bool)`.\n mstore(0x00, 0x5ccd4e37)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,address,uint256)`.\n mstore(0x00, 0x7cc3c607)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,address,string)`.\n mstore(0x00, 0xeb1bff80)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,address)`.\n mstore(0x00, 0xc371c7db)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,bool)`.\n mstore(0x00, 0x40785869)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,bool,uint256)`.\n mstore(0x00, 0xd6aefad2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,bool,string)`.\n mstore(0x00, 0x5e84b0ea)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,address)`.\n mstore(0x00, 0x1023f7b2)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,bool)`.\n mstore(0x00, 0xc3a8a654)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n // Selector of `log(string,string,uint256,uint256)`.\n mstore(0x00, 0xf45d7d2c)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n }\n _sendLogPayload(0x1c, 0x104);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,uint256,string)`.\n mstore(0x00, 0x5d1a971a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, p2)\n mstore(0x80, 0x100)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p3)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,address)`.\n mstore(0x00, 0x6d572f44)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,bool)`.\n mstore(0x00, 0x2c1754ed)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n // Selector of `log(string,string,string,uint256)`.\n mstore(0x00, 0x8eafb02b)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, p3)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n }\n _sendLogPayload(0x1c, 0x144);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n }\n }\n\n function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {\n bytes32 m0;\n bytes32 m1;\n bytes32 m2;\n bytes32 m3;\n bytes32 m4;\n bytes32 m5;\n bytes32 m6;\n bytes32 m7;\n bytes32 m8;\n bytes32 m9;\n bytes32 m10;\n bytes32 m11;\n bytes32 m12;\n /// @solidity memory-safe-assembly\n assembly {\n function writeString(pos, w) {\n let length := 0\n for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }\n mstore(pos, length)\n let shift := sub(256, shl(3, length))\n mstore(add(pos, 0x20), shl(shift, shr(shift, w)))\n }\n m0 := mload(0x00)\n m1 := mload(0x20)\n m2 := mload(0x40)\n m3 := mload(0x60)\n m4 := mload(0x80)\n m5 := mload(0xa0)\n m6 := mload(0xc0)\n m7 := mload(0xe0)\n m8 := mload(0x100)\n m9 := mload(0x120)\n m10 := mload(0x140)\n m11 := mload(0x160)\n m12 := mload(0x180)\n // Selector of `log(string,string,string,string)`.\n mstore(0x00, 0xde68f20a)\n mstore(0x20, 0x80)\n mstore(0x40, 0xc0)\n mstore(0x60, 0x100)\n mstore(0x80, 0x140)\n writeString(0xa0, p0)\n writeString(0xe0, p1)\n writeString(0x120, p2)\n writeString(0x160, p3)\n }\n _sendLogPayload(0x1c, 0x184);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, m0)\n mstore(0x20, m1)\n mstore(0x40, m2)\n mstore(0x60, m3)\n mstore(0x80, m4)\n mstore(0xa0, m5)\n mstore(0xc0, m6)\n mstore(0xe0, m7)\n mstore(0x100, m8)\n mstore(0x120, m9)\n mstore(0x140, m10)\n mstore(0x160, m11)\n mstore(0x180, m12)\n }\n }\n}\n" + }, + "forge-std/StdAssertions.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdAssertions {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n event log(string);\n event logs(bytes);\n\n event log_address(address);\n event log_bytes32(bytes32);\n event log_int(int256);\n event log_uint(uint256);\n event log_bytes(bytes);\n event log_string(string);\n\n event log_named_address(string key, address val);\n event log_named_bytes32(string key, bytes32 val);\n event log_named_decimal_int(string key, int256 val, uint256 decimals);\n event log_named_decimal_uint(string key, uint256 val, uint256 decimals);\n event log_named_int(string key, int256 val);\n event log_named_uint(string key, uint256 val);\n event log_named_bytes(string key, bytes val);\n event log_named_string(string key, string val);\n\n event log_array(uint256[] val);\n event log_array(int256[] val);\n event log_array(address[] val);\n event log_named_array(string key, uint256[] val);\n event log_named_array(string key, int256[] val);\n event log_named_array(string key, address[] val);\n\n bool private _failed;\n\n function failed() public view returns (bool) {\n if (_failed) {\n return _failed;\n } else {\n return vm.load(address(vm), bytes32(\"failed\")) != bytes32(0);\n }\n }\n\n function fail() internal virtual {\n vm.store(address(vm), bytes32(\"failed\"), bytes32(uint256(1)));\n _failed = true;\n }\n\n function assertTrue(bool data) internal pure virtual {\n vm.assertTrue(data);\n }\n\n function assertTrue(bool data, string memory err) internal pure virtual {\n vm.assertTrue(data, err);\n }\n\n function assertFalse(bool data) internal pure virtual {\n vm.assertFalse(data);\n }\n\n function assertFalse(bool data, string memory err) internal pure virtual {\n vm.assertFalse(data, err);\n }\n\n function assertEq(bool left, bool right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(int256 left, int256 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals);\n }\n\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertEqDecimal(left, right, decimals, err);\n }\n\n function assertEq(address left, address right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address left, address right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertEq(string memory left, string memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertEq(left, right);\n }\n\n function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertEq(left, right, err);\n }\n\n // Legacy helper\n function assertEqUint(uint256 left, uint256 right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertNotEq(bool left, bool right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool left, bool right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256 left, uint256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(int256 left, int256 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals);\n }\n\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertNotEqDecimal(left, right, decimals, err);\n }\n\n function assertNotEq(address left, address right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address left, address right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertNotEq(string memory left, string memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {\n vm.assertNotEq(left, right);\n }\n\n function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {\n vm.assertNotEq(left, right, err);\n }\n\n function assertLt(uint256 left, uint256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertLt(int256 left, int256 right) internal pure virtual {\n vm.assertLt(left, right);\n }\n\n function assertLt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLt(left, right, err);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals);\n }\n\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLtDecimal(left, right, decimals, err);\n }\n\n function assertGt(uint256 left, uint256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertGt(int256 left, int256 right) internal pure virtual {\n vm.assertGt(left, right);\n }\n\n function assertGt(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGt(left, right, err);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals);\n }\n\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGtDecimal(left, right, decimals, err);\n }\n\n function assertLe(uint256 left, uint256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertLe(int256 left, int256 right) internal pure virtual {\n vm.assertLe(left, right);\n }\n\n function assertLe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertLe(left, right, err);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals);\n }\n\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertLeDecimal(left, right, decimals, err);\n }\n\n function assertGe(uint256 left, uint256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertGe(int256 left, int256 right) internal pure virtual {\n vm.assertGe(left, right);\n }\n\n function assertGe(int256 left, int256 right, string memory err) internal pure virtual {\n vm.assertGe(left, right, err);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals);\n }\n\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {\n vm.assertGeDecimal(left, right, decimals, err);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta);\n }\n\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {\n vm.assertApproxEqAbs(left, right, maxDelta, err);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);\n }\n\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)\n internal\n pure\n virtual\n {\n vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta);\n }\n\n function assertApproxEqRel(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRel(left, right, maxPercentDelta, err);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);\n }\n\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%\n uint256 decimals,\n string memory err\n ) internal pure virtual {\n vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);\n }\n\n // Inherited from DSTest, not used but kept for backwards-compatibility\n function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {\n return keccak256(left) == keccak256(right);\n }\n\n function assertEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertEq(left, right);\n }\n\n function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertEq(left, right, err);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {\n assertNotEq(left, right);\n }\n\n function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {\n assertNotEq(left, right, err);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {\n assertEqCall(target, callDataA, target, callDataB, true);\n }\n\n function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)\n internal\n virtual\n {\n assertEqCall(targetA, callDataA, targetB, callDataB, true);\n }\n\n function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)\n internal\n virtual\n {\n assertEqCall(target, callDataA, target, callDataB, strictRevertData);\n }\n\n function assertEqCall(\n address targetA,\n bytes memory callDataA,\n address targetB,\n bytes memory callDataB,\n bool strictRevertData\n ) internal virtual {\n (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);\n (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);\n\n if (successA && successB) {\n assertEq(returnDataA, returnDataB, \"Call return data does not match\");\n }\n\n if (!successA && !successB && strictRevertData) {\n assertEq(returnDataA, returnDataB, \"Call revert data does not match\");\n }\n\n if (!successA && successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call revert data\", returnDataA);\n emit log_named_bytes(\" Right call return data\", returnDataB);\n revert(\"assertion failed\");\n }\n\n if (successA && !successB) {\n emit log(\"Error: Calls were not equal\");\n emit log_named_bytes(\" Left call return data\", returnDataA);\n emit log_named_bytes(\" Right call revert data\", returnDataB);\n revert(\"assertion failed\");\n }\n }\n}\n" + }, + "forge-std/StdChains.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n/**\n * StdChains provides information about EVM compatible chains that can be used in scripts/tests.\n * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are\n * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of\n * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the\n * alias used in this contract, which can be found as the first argument to the\n * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.\n *\n * There are two main ways to use this contract:\n * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or\n * `setChain(string memory chainAlias, Chain memory chain)`\n * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.\n *\n * The first time either of those are used, chains are initialized with the default set of RPC URLs.\n * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in\n * `defaultRpcUrls`.\n *\n * The `setChain` function is straightforward, and it simply saves off the given chain data.\n *\n * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say\n * we want to retrieve the RPC URL for `mainnet`:\n * - If you have specified data with `setChain`, it will return that.\n * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it\n * is valid (e.g. a URL is specified, or an environment variable is given and exists).\n * - If neither of the above conditions is met, the default data is returned.\n *\n * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.\n */\nabstract contract StdChains {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n bool private stdChainsInitialized;\n\n struct ChainData {\n string name;\n uint256 chainId;\n string rpcUrl;\n }\n\n struct Chain {\n // The chain name.\n string name;\n // The chain's Chain ID.\n uint256 chainId;\n // The chain's alias. (i.e. what gets specified in `foundry.toml`).\n string chainAlias;\n // A default RPC endpoint for this chain.\n // NOTE: This default RPC URL is included for convenience to facilitate quick tests and\n // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy\n // usage as you will be throttled and this is a disservice to others who need this endpoint.\n string rpcUrl;\n }\n\n // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.\n mapping(string => Chain) private chains;\n // Maps from the chain's alias to it's default RPC URL.\n mapping(string => string) private defaultRpcUrls;\n // Maps from a chain ID to it's alias.\n mapping(uint256 => string) private idToAlias;\n\n bool private fallbackToDefaultRpcUrls = true;\n\n // The RPC URL will be fetched from config or defaultRpcUrls if possible.\n function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {\n require(bytes(chainAlias).length != 0, \"StdChains getChain(string): Chain alias cannot be the empty string.\");\n\n initializeStdChains();\n chain = chains[chainAlias];\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(string): Chain with alias \\\"\", chainAlias, \"\\\" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {\n require(chainId != 0, \"StdChains getChain(uint256): Chain ID cannot be 0.\");\n initializeStdChains();\n string memory chainAlias = idToAlias[chainId];\n\n chain = chains[chainAlias];\n\n require(\n chain.chainId != 0,\n string(abi.encodePacked(\"StdChains getChain(uint256): Chain with ID \", vm.toString(chainId), \" not found.\"))\n );\n\n chain = getChainWithUpdatedRpcUrl(chainAlias, chain);\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, ChainData memory chain) internal virtual {\n require(\n bytes(chainAlias).length != 0,\n \"StdChains setChain(string,ChainData): Chain alias cannot be the empty string.\"\n );\n\n require(chain.chainId != 0, \"StdChains setChain(string,ChainData): Chain ID cannot be 0.\");\n\n initializeStdChains();\n string memory foundAlias = idToAlias[chain.chainId];\n\n require(\n bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),\n string(\n abi.encodePacked(\n \"StdChains setChain(string,ChainData): Chain ID \",\n vm.toString(chain.chainId),\n \" already used by \\\"\",\n foundAlias,\n \"\\\".\"\n )\n )\n );\n\n uint256 oldChainId = chains[chainAlias].chainId;\n delete idToAlias[oldChainId];\n\n chains[chainAlias] =\n Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});\n idToAlias[chain.chainId] = chainAlias;\n }\n\n // set chain info, with priority to argument's rpcUrl field.\n function setChain(string memory chainAlias, Chain memory chain) internal virtual {\n setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));\n }\n\n function _toUpper(string memory str) private pure returns (string memory) {\n bytes memory strb = bytes(str);\n bytes memory copy = new bytes(strb.length);\n for (uint256 i = 0; i < strb.length; i++) {\n bytes1 b = strb[i];\n if (b >= 0x61 && b <= 0x7A) {\n copy[i] = bytes1(uint8(b) - 32);\n } else {\n copy[i] = b;\n }\n }\n return string(copy);\n }\n\n // lookup rpcUrl, in descending order of priority:\n // current -> config (foundry.toml) -> environment variable -> default\n function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)\n private\n view\n returns (Chain memory)\n {\n if (bytes(chain.rpcUrl).length == 0) {\n try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {\n chain.rpcUrl = configRpcUrl;\n } catch (bytes memory err) {\n string memory envName = string(abi.encodePacked(_toUpper(chainAlias), \"_RPC_URL\"));\n if (fallbackToDefaultRpcUrls) {\n chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);\n } else {\n chain.rpcUrl = vm.envString(envName);\n }\n // Distinguish 'not found' from 'cannot read'\n // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions\n bytes memory oldNotFoundError =\n abi.encodeWithSignature(\"CheatCodeError\", string(abi.encodePacked(\"invalid rpc url \", chainAlias)));\n bytes memory newNotFoundError = abi.encodeWithSignature(\n \"CheatcodeError(string)\", string(abi.encodePacked(\"invalid rpc url: \", chainAlias))\n );\n bytes32 errHash = keccak256(err);\n if (\n (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))\n || bytes(chain.rpcUrl).length == 0\n ) {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, err), mload(err))\n }\n }\n }\n }\n return chain;\n }\n\n function setFallbackToDefaultRpcUrls(bool useDefault) internal {\n fallbackToDefaultRpcUrls = useDefault;\n }\n\n function initializeStdChains() private {\n if (stdChainsInitialized) return;\n\n stdChainsInitialized = true;\n\n // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`\n setChainWithDefaultRpcUrl(\"anvil\", ChainData(\"Anvil\", 31337, \"http://127.0.0.1:8545\"));\n setChainWithDefaultRpcUrl(\n \"mainnet\", ChainData(\"Mainnet\", 1, \"https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP\")\n );\n setChainWithDefaultRpcUrl(\n \"sepolia\", ChainData(\"Sepolia\", 11155111, \"https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001\")\n );\n setChainWithDefaultRpcUrl(\"holesky\", ChainData(\"Holesky\", 17000, \"https://rpc.holesky.ethpandaops.io\"));\n setChainWithDefaultRpcUrl(\"optimism\", ChainData(\"Optimism\", 10, \"https://mainnet.optimism.io\"));\n setChainWithDefaultRpcUrl(\n \"optimism_sepolia\", ChainData(\"Optimism Sepolia\", 11155420, \"https://sepolia.optimism.io\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_one\", ChainData(\"Arbitrum One\", 42161, \"https://arb1.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\n \"arbitrum_one_sepolia\", ChainData(\"Arbitrum One Sepolia\", 421614, \"https://sepolia-rollup.arbitrum.io/rpc\")\n );\n setChainWithDefaultRpcUrl(\"arbitrum_nova\", ChainData(\"Arbitrum Nova\", 42170, \"https://nova.arbitrum.io/rpc\"));\n setChainWithDefaultRpcUrl(\"polygon\", ChainData(\"Polygon\", 137, \"https://polygon-rpc.com\"));\n setChainWithDefaultRpcUrl(\n \"polygon_amoy\", ChainData(\"Polygon Amoy\", 80002, \"https://rpc-amoy.polygon.technology\")\n );\n setChainWithDefaultRpcUrl(\"avalanche\", ChainData(\"Avalanche\", 43114, \"https://api.avax.network/ext/bc/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"avalanche_fuji\", ChainData(\"Avalanche Fuji\", 43113, \"https://api.avax-test.network/ext/bc/C/rpc\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain\", ChainData(\"BNB Smart Chain\", 56, \"https://bsc-dataseed1.binance.org\")\n );\n setChainWithDefaultRpcUrl(\n \"bnb_smart_chain_testnet\",\n ChainData(\"BNB Smart Chain Testnet\", 97, \"https://rpc.ankr.com/bsc_testnet_chapel\")\n );\n setChainWithDefaultRpcUrl(\"gnosis_chain\", ChainData(\"Gnosis Chain\", 100, \"https://rpc.gnosischain.com\"));\n setChainWithDefaultRpcUrl(\"moonbeam\", ChainData(\"Moonbeam\", 1284, \"https://rpc.api.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\n \"moonriver\", ChainData(\"Moonriver\", 1285, \"https://rpc.api.moonriver.moonbeam.network\")\n );\n setChainWithDefaultRpcUrl(\"moonbase\", ChainData(\"Moonbase\", 1287, \"https://rpc.testnet.moonbeam.network\"));\n setChainWithDefaultRpcUrl(\"base_sepolia\", ChainData(\"Base Sepolia\", 84532, \"https://sepolia.base.org\"));\n setChainWithDefaultRpcUrl(\"base\", ChainData(\"Base\", 8453, \"https://mainnet.base.org\"));\n setChainWithDefaultRpcUrl(\"blast_sepolia\", ChainData(\"Blast Sepolia\", 168587773, \"https://sepolia.blast.io\"));\n setChainWithDefaultRpcUrl(\"blast\", ChainData(\"Blast\", 81457, \"https://rpc.blast.io\"));\n setChainWithDefaultRpcUrl(\"fantom_opera\", ChainData(\"Fantom Opera\", 250, \"https://rpc.ankr.com/fantom/\"));\n setChainWithDefaultRpcUrl(\n \"fantom_opera_testnet\", ChainData(\"Fantom Opera Testnet\", 4002, \"https://rpc.ankr.com/fantom_testnet/\")\n );\n setChainWithDefaultRpcUrl(\"fraxtal\", ChainData(\"Fraxtal\", 252, \"https://rpc.frax.com\"));\n setChainWithDefaultRpcUrl(\"fraxtal_testnet\", ChainData(\"Fraxtal Testnet\", 2522, \"https://rpc.testnet.frax.com\"));\n setChainWithDefaultRpcUrl(\n \"berachain_bartio_testnet\", ChainData(\"Berachain bArtio Testnet\", 80084, \"https://bartio.rpc.berachain.com\")\n );\n setChainWithDefaultRpcUrl(\"flare\", ChainData(\"Flare\", 14, \"https://flare-api.flare.network/ext/C/rpc\"));\n setChainWithDefaultRpcUrl(\n \"flare_coston2\", ChainData(\"Flare Coston2\", 114, \"https://coston2-api.flare.network/ext/C/rpc\")\n );\n }\n\n // set chain info, with priority to chainAlias' rpc url in foundry.toml\n function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {\n string memory rpcUrl = chain.rpcUrl;\n defaultRpcUrls[chainAlias] = rpcUrl;\n chain.rpcUrl = \"\";\n setChain(chainAlias, chain);\n chain.rpcUrl = rpcUrl; // restore argument\n }\n}\n" + }, + "forge-std/StdCheats.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {console2} from \"./console2.sol\";\nimport {Vm} from \"./Vm.sol\";\n\nabstract contract StdCheatsSafe {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n bool private gasMeteringOff;\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawTx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n // json value name = function\n string functionSig;\n bytes32 hash;\n // json value name = tx\n RawTx1559Detail txDetail;\n // json value name = type\n string opcode;\n }\n\n struct RawTx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n bytes gas;\n bytes nonce;\n address to;\n bytes txType;\n bytes value;\n }\n\n struct Tx1559 {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n bytes32 hash;\n Tx1559Detail txDetail;\n string opcode;\n }\n\n struct Tx1559Detail {\n AccessList[] accessList;\n bytes data;\n address from;\n uint256 gas;\n uint256 nonce;\n address to;\n uint256 txType;\n uint256 value;\n }\n\n // Data structures to parse Transaction objects from the broadcast artifact\n // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct TxLegacy {\n string[] arguments;\n address contractAddress;\n string contractName;\n string functionSig;\n string hash;\n string opcode;\n TxDetailLegacy transaction;\n }\n\n struct TxDetailLegacy {\n AccessList[] accessList;\n uint256 chainId;\n bytes data;\n address from;\n uint256 gas;\n uint256 gasPrice;\n bytes32 hash;\n uint256 nonce;\n bytes1 opcode;\n bytes32 r;\n bytes32 s;\n uint256 txType;\n address to;\n uint8 v;\n uint256 value;\n }\n\n struct AccessList {\n address accessAddress;\n bytes32[] storageKeys;\n }\n\n // Data structures to parse Receipt objects from the broadcast artifact.\n // The Raw structs is what is parsed from the JSON\n // and then converted to the one that is used by the user for better UX.\n\n struct RawReceipt {\n bytes32 blockHash;\n bytes blockNumber;\n address contractAddress;\n bytes cumulativeGasUsed;\n bytes effectiveGasPrice;\n address from;\n bytes gasUsed;\n RawReceiptLog[] logs;\n bytes logsBloom;\n bytes status;\n address to;\n bytes32 transactionHash;\n bytes transactionIndex;\n }\n\n struct Receipt {\n bytes32 blockHash;\n uint256 blockNumber;\n address contractAddress;\n uint256 cumulativeGasUsed;\n uint256 effectiveGasPrice;\n address from;\n uint256 gasUsed;\n ReceiptLog[] logs;\n bytes logsBloom;\n uint256 status;\n address to;\n bytes32 transactionHash;\n uint256 transactionIndex;\n }\n\n // Data structures to parse the entire broadcast artifact, assuming the\n // transactions conform to EIP1559.\n\n struct EIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n Receipt[] receipts;\n uint256 timestamp;\n Tx1559[] transactions;\n TxReturn[] txReturns;\n }\n\n struct RawEIP1559ScriptArtifact {\n string[] libraries;\n string path;\n string[] pending;\n RawReceipt[] receipts;\n TxReturn[] txReturns;\n uint256 timestamp;\n RawTx1559[] transactions;\n }\n\n struct RawReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n bytes blockNumber;\n bytes data;\n bytes logIndex;\n bool removed;\n bytes32[] topics;\n bytes32 transactionHash;\n bytes transactionIndex;\n bytes transactionLogIndex;\n }\n\n struct ReceiptLog {\n // json value = address\n address logAddress;\n bytes32 blockHash;\n uint256 blockNumber;\n bytes data;\n uint256 logIndex;\n bytes32[] topics;\n uint256 transactionIndex;\n uint256 transactionLogIndex;\n bool removed;\n }\n\n struct TxReturn {\n string internalType;\n string value;\n }\n\n struct Account {\n address addr;\n uint256 key;\n }\n\n enum AddressType {\n Payable,\n NonPayable,\n ZeroAddress,\n Precompile,\n ForgeAddress\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n function assumeNotBlacklisted(address token, address addr) internal view virtual {\n // Nothing to check if `token` is not a contract.\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.\");\n\n bool success;\n bytes memory returnData;\n\n // 4-byte selector for `isBlacklisted(address)`, used by USDC.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n\n // 4-byte selector for `isBlackListed(address)`, used by USDT.\n (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));\n vm.assume(!success || abi.decode(returnData, (bool)) == false);\n }\n\n // Checks that `addr` is not blacklisted by token contracts that have a blacklist.\n // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for\n // backwards compatibility, since this name was used in the original PR which already has\n // a release. This function can be removed in a future release once we want a breaking change.\n function assumeNoBlacklisted(address token, address addr) internal view virtual {\n assumeNotBlacklisted(token, addr);\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {\n if (addressType == AddressType.Payable) {\n assumeNotPayable(addr);\n } else if (addressType == AddressType.NonPayable) {\n assumePayable(addr);\n } else if (addressType == AddressType.ZeroAddress) {\n assumeNotZeroAddress(addr);\n } else if (addressType == AddressType.Precompile) {\n assumeNotPrecompile(addr);\n } else if (addressType == AddressType.ForgeAddress) {\n assumeNotForgeAddress(addr);\n }\n }\n\n function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n }\n\n function assumeAddressIsNot(\n address addr,\n AddressType addressType1,\n AddressType addressType2,\n AddressType addressType3,\n AddressType addressType4\n ) internal virtual {\n assumeAddressIsNot(addr, addressType1);\n assumeAddressIsNot(addr, addressType2);\n assumeAddressIsNot(addr, addressType3);\n assumeAddressIsNot(addr, addressType4);\n }\n\n // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to\n // `addr` and checking the `success` return value.\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used.\n function _isPayable(address addr) private returns (bool) {\n require(\n addr.balance < UINT256_MAX,\n \"StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds\"\n );\n uint256 origBalanceTest = address(this).balance;\n uint256 origBalanceAddr = address(addr).balance;\n\n vm.deal(address(this), 1);\n (bool success,) = payable(addr).call{value: 1}(\"\");\n\n // reset balances\n vm.deal(address(this), origBalanceTest);\n vm.deal(addr, origBalanceAddr);\n\n return success;\n }\n\n // NOTE: This function may result in state changes depending on the fallback/receive logic\n // implemented by `addr`, which should be taken into account when this function is used. See the\n // `_isPayable` method for more information.\n function assumePayable(address addr) internal virtual {\n vm.assume(_isPayable(addr));\n }\n\n function assumeNotPayable(address addr) internal virtual {\n vm.assume(!_isPayable(addr));\n }\n\n function assumeNotZeroAddress(address addr) internal pure virtual {\n vm.assume(addr != address(0));\n }\n\n function assumeNotPrecompile(address addr) internal pure virtual {\n assumeNotPrecompile(addr, _pureChainId());\n }\n\n function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {\n // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific\n // address), but the same rationale for excluding them applies so we include those too.\n\n // These are reserved by Ethereum and may be on all EVM-compatible chains.\n vm.assume(addr < address(0x1) || addr > address(0xff));\n\n // forgefmt: disable-start\n if (chainId == 10 || chainId == 420) {\n // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21\n vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));\n } else if (chainId == 42161 || chainId == 421613) {\n // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains\n vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));\n } else if (chainId == 43114 || chainId == 43113) {\n // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59\n vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));\n vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));\n vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));\n }\n // forgefmt: disable-end\n }\n\n function assumeNotForgeAddress(address addr) internal pure virtual {\n // vm, console, and Create2Deployer addresses\n vm.assume(\n addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67\n && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C\n );\n }\n\n function readEIP1559ScriptArtifact(string memory path)\n internal\n view\n virtual\n returns (EIP1559ScriptArtifact memory)\n {\n string memory data = vm.readFile(path);\n bytes memory parsedData = vm.parseJson(data);\n RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));\n EIP1559ScriptArtifact memory artifact;\n artifact.libraries = rawArtifact.libraries;\n artifact.path = rawArtifact.path;\n artifact.timestamp = rawArtifact.timestamp;\n artifact.pending = rawArtifact.pending;\n artifact.txReturns = rawArtifact.txReturns;\n artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);\n artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);\n return artifact;\n }\n\n function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {\n Tx1559[] memory txs = new Tx1559[](rawTxs.length);\n for (uint256 i; i < rawTxs.length; i++) {\n txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);\n }\n return txs;\n }\n\n function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {\n Tx1559 memory transaction;\n transaction.arguments = rawTx.arguments;\n transaction.contractName = rawTx.contractName;\n transaction.functionSig = rawTx.functionSig;\n transaction.hash = rawTx.hash;\n transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);\n transaction.opcode = rawTx.opcode;\n return transaction;\n }\n\n function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)\n internal\n pure\n virtual\n returns (Tx1559Detail memory)\n {\n Tx1559Detail memory txDetail;\n txDetail.data = rawDetail.data;\n txDetail.from = rawDetail.from;\n txDetail.to = rawDetail.to;\n txDetail.nonce = _bytesToUint(rawDetail.nonce);\n txDetail.txType = _bytesToUint(rawDetail.txType);\n txDetail.value = _bytesToUint(rawDetail.value);\n txDetail.gas = _bytesToUint(rawDetail.gas);\n txDetail.accessList = rawDetail.accessList;\n return txDetail;\n }\n\n function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".transactions\");\n RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));\n return rawToConvertedEIPTx1559s(rawTxs);\n }\n\n function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".transactions[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));\n return rawToConvertedEIPTx1559(rawTx);\n }\n\n // Analogous to readTransactions, but for receipts.\n function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {\n string memory deployData = vm.readFile(path);\n bytes memory parsedDeployData = vm.parseJson(deployData, \".receipts\");\n RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));\n return rawToConvertedReceipts(rawReceipts);\n }\n\n function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {\n string memory deployData = vm.readFile(path);\n string memory key = string(abi.encodePacked(\".receipts[\", vm.toString(index), \"]\"));\n bytes memory parsedDeployData = vm.parseJson(deployData, key);\n RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));\n return rawToConvertedReceipt(rawReceipt);\n }\n\n function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {\n Receipt[] memory receipts = new Receipt[](rawReceipts.length);\n for (uint256 i; i < rawReceipts.length; i++) {\n receipts[i] = rawToConvertedReceipt(rawReceipts[i]);\n }\n return receipts;\n }\n\n function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {\n Receipt memory receipt;\n receipt.blockHash = rawReceipt.blockHash;\n receipt.to = rawReceipt.to;\n receipt.from = rawReceipt.from;\n receipt.contractAddress = rawReceipt.contractAddress;\n receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);\n receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);\n receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);\n receipt.status = _bytesToUint(rawReceipt.status);\n receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);\n receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);\n receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);\n receipt.logsBloom = rawReceipt.logsBloom;\n receipt.transactionHash = rawReceipt.transactionHash;\n return receipt;\n }\n\n function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)\n internal\n pure\n virtual\n returns (ReceiptLog[] memory)\n {\n ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);\n for (uint256 i; i < rawLogs.length; i++) {\n logs[i].logAddress = rawLogs[i].logAddress;\n logs[i].blockHash = rawLogs[i].blockHash;\n logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);\n logs[i].data = rawLogs[i].data;\n logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);\n logs[i].topics = rawLogs[i].topics;\n logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);\n logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);\n logs[i].removed = rawLogs[i].removed;\n }\n return logs;\n }\n\n // Deploy a contract by fetching the contract bytecode from\n // the artifacts directory\n // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`\n function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes): Deployment failed.\");\n }\n\n function deployCode(string memory what) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(0, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string): Deployment failed.\");\n }\n\n /// @dev deploy contract with value on construction\n function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,bytes,uint256): Deployment failed.\");\n }\n\n function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {\n bytes memory bytecode = vm.getCode(what);\n /// @solidity memory-safe-assembly\n assembly {\n addr := create(val, add(bytecode, 0x20), mload(bytecode))\n }\n\n require(addr != address(0), \"StdCheats deployCode(string,uint256): Deployment failed.\");\n }\n\n // creates a labeled address and the corresponding private key\n function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {\n privateKey = uint256(keccak256(abi.encodePacked(name)));\n addr = vm.addr(privateKey);\n vm.label(addr, name);\n }\n\n // creates a labeled address\n function makeAddr(string memory name) internal virtual returns (address addr) {\n (addr,) = makeAddrAndKey(name);\n }\n\n // Destroys an account immediately, sending the balance to beneficiary.\n // Destroying means: balance will be zero, code will be empty, and nonce will be 0\n // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce\n // only after tx ends, this will run immediately.\n function destroyAccount(address who, address beneficiary) internal virtual {\n uint256 currBalance = who.balance;\n vm.etch(who, abi.encode());\n vm.deal(who, 0);\n vm.resetNonce(who);\n\n uint256 beneficiaryBalance = beneficiary.balance;\n vm.deal(beneficiary, currBalance + beneficiaryBalance);\n }\n\n // creates a struct containing both a labeled address and the corresponding private key\n function makeAccount(string memory name) internal virtual returns (Account memory account) {\n (account.addr, account.key) = makeAddrAndKey(name);\n }\n\n function deriveRememberKey(string memory mnemonic, uint32 index)\n internal\n virtual\n returns (address who, uint256 privateKey)\n {\n privateKey = vm.deriveKey(mnemonic, index);\n who = vm.rememberKey(privateKey);\n }\n\n function _bytesToUint(bytes memory b) private pure returns (uint256) {\n require(b.length <= 32, \"StdCheats _bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n function isFork() internal view virtual returns (bool status) {\n try vm.activeFork() {\n status = true;\n } catch (bytes memory) {}\n }\n\n modifier skipWhenForking() {\n if (!isFork()) {\n _;\n }\n }\n\n modifier skipWhenNotForking() {\n if (isFork()) {\n _;\n }\n }\n\n modifier noGasMetering() {\n vm.pauseGasMetering();\n // To prevent turning gas monitoring back on with nested functions that use this modifier,\n // we check if gasMetering started in the off position. If it did, we don't want to turn\n // it back on until we exit the top level function that used the modifier\n //\n // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.\n // funcA will have `gasStartedOff` as false, funcB will have it as true,\n // so we only turn metering back on at the end of the funcA\n bool gasStartedOff = gasMeteringOff;\n gasMeteringOff = true;\n\n _;\n\n // if gas metering was on when this modifier was called, turn it back on at the end\n if (!gasStartedOff) {\n gasMeteringOff = false;\n vm.resumeGasMetering();\n }\n }\n\n // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no\n // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We\n // can't simply access the chain ID in a normal view or pure function because the solc View Pure\n // Checker changed `chainid` from pure to view in 0.8.0.\n function _viewChainId() private view returns (uint256 chainId) {\n // Assembly required since `block.chainid` was introduced in 0.8.0.\n assembly {\n chainId := chainid()\n }\n\n address(this); // Silence warnings in older Solc versions.\n }\n\n function _pureChainId() private pure returns (uint256 chainId) {\n function() internal view returns (uint256) fnIn = _viewChainId;\n function() internal pure returns (uint256) pureChainId;\n assembly {\n pureChainId := fnIn\n }\n chainId = pureChainId();\n }\n}\n\n// Wrappers around cheatcodes to avoid footguns\nabstract contract StdCheats is StdCheatsSafe {\n using stdStorage for StdStorage;\n\n StdStorage private stdstore;\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n\n // Skip forward or rewind time by the specified number of seconds\n function skip(uint256 time) internal virtual {\n vm.warp(block.timestamp + time);\n }\n\n function rewind(uint256 time) internal virtual {\n vm.warp(block.timestamp - time);\n }\n\n // Setup a prank from an address that has some ether\n function hoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender);\n }\n\n function hoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.prank(msgSender, origin);\n }\n\n function hoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.prank(msgSender, origin);\n }\n\n // Start perpetual prank from an address that has some ether\n function startHoax(address msgSender) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender);\n }\n\n function startHoax(address msgSender, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender);\n }\n\n // Start perpetual prank from an address that has some ether\n // tx.origin is set to the origin parameter\n function startHoax(address msgSender, address origin) internal virtual {\n vm.deal(msgSender, 1 << 128);\n vm.startPrank(msgSender, origin);\n }\n\n function startHoax(address msgSender, address origin, uint256 give) internal virtual {\n vm.deal(msgSender, give);\n vm.startPrank(msgSender, origin);\n }\n\n function changePrank(address msgSender) internal virtual {\n console2_log_StdCheats(\"changePrank is deprecated. Please use vm.startPrank instead.\");\n vm.stopPrank();\n vm.startPrank(msgSender);\n }\n\n function changePrank(address msgSender, address txOrigin) internal virtual {\n vm.stopPrank();\n vm.startPrank(msgSender, txOrigin);\n }\n\n // The same as Vm's `deal`\n // Use the alternative signature for ERC20 tokens\n function deal(address to, uint256 give) internal virtual {\n vm.deal(to, give);\n }\n\n // Set the balance of an account for any ERC20 token\n // Use the alternative signature to update `totalSupply`\n function deal(address token, address to, uint256 give) internal virtual {\n deal(token, to, give, false);\n }\n\n // Set the balance of an account for any ERC1155 token\n // Use the alternative signature to update `totalSupply`\n function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {\n dealERC1155(token, to, id, give, false);\n }\n\n function deal(address token, address to, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0x18160ddd).checked_write(totSup);\n }\n }\n\n function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {\n // get current balance\n (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));\n uint256 prevBal = abi.decode(balData, (uint256));\n\n // update balance\n stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);\n\n // update total supply\n if (adjust) {\n (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));\n require(\n totSupData.length != 0,\n \"StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply.\"\n );\n uint256 totSup = abi.decode(totSupData, (uint256));\n if (give < prevBal) {\n totSup -= (prevBal - give);\n } else {\n totSup += (give - prevBal);\n }\n stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);\n }\n }\n\n function dealERC721(address token, address to, uint256 id) internal virtual {\n // check if token id is already minted and the actual owner.\n (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));\n require(successMinted, \"StdCheats deal(address,address,uint,bool): id not minted.\");\n\n // get owner current balance\n (, bytes memory fromBalData) =\n token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));\n uint256 fromPrevBal = abi.decode(fromBalData, (uint256));\n\n // get new user current balance\n (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));\n uint256 toPrevBal = abi.decode(toBalData, (uint256));\n\n // update balances\n stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);\n stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);\n\n // update owner\n stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);\n }\n\n function deployCodeTo(string memory what, address where) internal virtual {\n deployCodeTo(what, \"\", 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {\n deployCodeTo(what, args, 0, where);\n }\n\n function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {\n bytes memory creationCode = vm.getCode(what);\n vm.etch(where, abi.encodePacked(creationCode, args));\n (bool success, bytes memory runtimeBytecode) = where.call{value: value}(\"\");\n require(success, \"StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.\");\n vm.etch(where, runtimeBytecode);\n }\n\n // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.\n function console2_log_StdCheats(string memory p0) private view {\n (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature(\"log(string)\", p0));\n status;\n }\n}\n" + }, + "forge-std/StdError.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdError {\n bytes public constant assertionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x01);\n bytes public constant arithmeticError = abi.encodeWithSignature(\"Panic(uint256)\", 0x11);\n bytes public constant divisionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x12);\n bytes public constant enumConversionError = abi.encodeWithSignature(\"Panic(uint256)\", 0x21);\n bytes public constant encodeStorageError = abi.encodeWithSignature(\"Panic(uint256)\", 0x22);\n bytes public constant popError = abi.encodeWithSignature(\"Panic(uint256)\", 0x31);\n bytes public constant indexOOBError = abi.encodeWithSignature(\"Panic(uint256)\", 0x32);\n bytes public constant memOverflowError = abi.encodeWithSignature(\"Panic(uint256)\", 0x41);\n bytes public constant zeroVarError = abi.encodeWithSignature(\"Panic(uint256)\", 0x51);\n}\n" + }, + "forge-std/StdInvariant.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nabstract contract StdInvariant {\n struct FuzzSelector {\n address addr;\n bytes4[] selectors;\n }\n\n struct FuzzArtifactSelector {\n string artifact;\n bytes4[] selectors;\n }\n\n struct FuzzInterface {\n address addr;\n string[] artifacts;\n }\n\n address[] private _excludedContracts;\n address[] private _excludedSenders;\n address[] private _targetedContracts;\n address[] private _targetedSenders;\n\n string[] private _excludedArtifacts;\n string[] private _targetedArtifacts;\n\n FuzzArtifactSelector[] private _targetedArtifactSelectors;\n\n FuzzSelector[] private _excludedSelectors;\n FuzzSelector[] private _targetedSelectors;\n\n FuzzInterface[] private _targetedInterfaces;\n\n // Functions for users:\n // These are intended to be called in tests.\n\n function excludeContract(address newExcludedContract_) internal {\n _excludedContracts.push(newExcludedContract_);\n }\n\n function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {\n _excludedSelectors.push(newExcludedSelector_);\n }\n\n function excludeSender(address newExcludedSender_) internal {\n _excludedSenders.push(newExcludedSender_);\n }\n\n function excludeArtifact(string memory newExcludedArtifact_) internal {\n _excludedArtifacts.push(newExcludedArtifact_);\n }\n\n function targetArtifact(string memory newTargetedArtifact_) internal {\n _targetedArtifacts.push(newTargetedArtifact_);\n }\n\n function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {\n _targetedArtifactSelectors.push(newTargetedArtifactSelector_);\n }\n\n function targetContract(address newTargetedContract_) internal {\n _targetedContracts.push(newTargetedContract_);\n }\n\n function targetSelector(FuzzSelector memory newTargetedSelector_) internal {\n _targetedSelectors.push(newTargetedSelector_);\n }\n\n function targetSender(address newTargetedSender_) internal {\n _targetedSenders.push(newTargetedSender_);\n }\n\n function targetInterface(FuzzInterface memory newTargetedInterface_) internal {\n _targetedInterfaces.push(newTargetedInterface_);\n }\n\n // Functions for forge:\n // These are called by forge to run invariant tests and don't need to be called in tests.\n\n function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {\n excludedArtifacts_ = _excludedArtifacts;\n }\n\n function excludeContracts() public view returns (address[] memory excludedContracts_) {\n excludedContracts_ = _excludedContracts;\n }\n\n function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {\n excludedSelectors_ = _excludedSelectors;\n }\n\n function excludeSenders() public view returns (address[] memory excludedSenders_) {\n excludedSenders_ = _excludedSenders;\n }\n\n function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {\n targetedArtifacts_ = _targetedArtifacts;\n }\n\n function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {\n targetedArtifactSelectors_ = _targetedArtifactSelectors;\n }\n\n function targetContracts() public view returns (address[] memory targetedContracts_) {\n targetedContracts_ = _targetedContracts;\n }\n\n function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {\n targetedSelectors_ = _targetedSelectors;\n }\n\n function targetSenders() public view returns (address[] memory targetedSenders_) {\n targetedSenders_ = _targetedSenders;\n }\n\n function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {\n targetedInterfaces_ = _targetedInterfaces;\n }\n}\n" + }, + "forge-std/StdJson.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing JSON files\n// To parse:\n// ```\n// using stdJson for string;\n// string memory json = vm.readFile(\"\");\n// json.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdJson for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdJson {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory json, string memory key) internal view returns (bool) {\n return vm.keyExistsJson(json, key);\n }\n\n function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJson(json, key);\n }\n\n function readUint(string memory json, string memory key) internal pure returns (uint256) {\n return vm.parseJsonUint(json, key);\n }\n\n function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseJsonUintArray(json, key);\n }\n\n function readInt(string memory json, string memory key) internal pure returns (int256) {\n return vm.parseJsonInt(json, key);\n }\n\n function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {\n return vm.parseJsonIntArray(json, key);\n }\n\n function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {\n return vm.parseJsonBytes32(json, key);\n }\n\n function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseJsonBytes32Array(json, key);\n }\n\n function readString(string memory json, string memory key) internal pure returns (string memory) {\n return vm.parseJsonString(json, key);\n }\n\n function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {\n return vm.parseJsonStringArray(json, key);\n }\n\n function readAddress(string memory json, string memory key) internal pure returns (address) {\n return vm.parseJsonAddress(json, key);\n }\n\n function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {\n return vm.parseJsonAddressArray(json, key);\n }\n\n function readBool(string memory json, string memory key) internal pure returns (bool) {\n return vm.parseJsonBool(json, key);\n }\n\n function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {\n return vm.parseJsonBoolArray(json, key);\n }\n\n function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {\n return vm.parseJsonBytes(json, key);\n }\n\n function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseJsonBytesArray(json, key);\n }\n\n function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(json, key) ? readUint(json, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(json, key) ? readUintArray(json, key) : defaultValue;\n }\n\n function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(json, key) ? readInt(json, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(json, key) ? readIntArray(json, key) : defaultValue;\n }\n\n function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(json, key) ? readBytes32(json, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;\n }\n\n function readStringOr(string memory json, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(json, key) ? readString(json, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(json, key) ? readStringArray(json, key) : defaultValue;\n }\n\n function readAddressOr(string memory json, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(json, key) ? readAddress(json, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;\n }\n\n function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(json, key) ? readBool(json, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;\n }\n\n function readBytesOr(string memory json, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(json, key) ? readBytes(json, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeJson(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeJson(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nlibrary stdMath {\n int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;\n\n function abs(int256 a) internal pure returns (uint256) {\n // Required or it will fail when `a = type(int256).min`\n if (a == INT256_MIN) {\n return 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n }\n\n return uint256(a > 0 ? a : -a);\n }\n\n function delta(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a - b : b - a;\n }\n\n function delta(int256 a, int256 b) internal pure returns (uint256) {\n // a and b are of the same sign\n // this works thanks to two's complement, the left-most bit is the sign bit\n if ((a ^ b) > -1) {\n return delta(abs(a), abs(b));\n }\n\n // a and b are of opposite signs\n return abs(a) + abs(b);\n }\n\n function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n\n return absDelta * 1e18 / b;\n }\n\n function percentDelta(int256 a, int256 b) internal pure returns (uint256) {\n uint256 absDelta = delta(a, b);\n uint256 absB = abs(b);\n\n return absDelta * 1e18 / absB;\n }\n}\n" + }, + "forge-std/StdStorage.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\nimport {Vm} from \"./Vm.sol\";\n\nstruct FindData {\n uint256 slot;\n uint256 offsetLeft;\n uint256 offsetRight;\n bool found;\n}\n\nstruct StdStorage {\n mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;\n bytes32[] _keys;\n bytes4 _sig;\n uint256 _depth;\n address _target;\n bytes32 _set;\n bool _enable_packed_slots;\n bytes _calldata;\n}\n\nlibrary stdStorageSafe {\n event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);\n event WARNING_UninitedSlot(address who, uint256 slot);\n\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return bytes4(keccak256(bytes(sigStr)));\n }\n\n function getCallParams(StdStorage storage self) internal view returns (bytes memory) {\n if (self._calldata.length == 0) {\n return flatten(self._keys);\n } else {\n return self._calldata;\n }\n }\n\n // Calls target contract with configured parameters\n function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {\n bytes memory cald = abi.encodePacked(self._sig, getCallParams(self));\n (bool success, bytes memory rdat) = self._target.staticcall(cald);\n bytes32 result = bytesToBytes32(rdat, 32 * self._depth);\n\n return (success, result);\n }\n\n // Tries mutating slot value to determine if the targeted value is stored in it.\n // If current value is 0, then we are setting slot value to type(uint256).max\n // Otherwise, we set it to 0. That way, return value should always be affected.\n function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n (bool success, bytes32 prevReturnValue) = callTarget(self);\n\n bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);\n vm.store(self._target, slot, testVal);\n\n (, bytes32 newReturnValue) = callTarget(self);\n\n vm.store(self._target, slot, prevSlotValue);\n\n return (success && (prevReturnValue != newReturnValue));\n }\n\n // Tries setting one of the bits in slot to 1 until return value changes.\n // Index of resulted bit is an offset packed slot has from left/right side\n function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {\n for (uint256 offset = 0; offset < 256; offset++) {\n uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);\n vm.store(self._target, slot, bytes32(valueToPut));\n\n (bool success, bytes32 data) = callTarget(self);\n\n if (success && (uint256(data) > 0)) {\n return (true, offset);\n }\n }\n return (false, 0);\n }\n\n function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {\n bytes32 prevSlotValue = vm.load(self._target, slot);\n\n (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);\n (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);\n\n // `findOffset` may mutate slot value, so we are setting it to initial value\n vm.store(self._target, slot, prevSlotValue);\n return (foundLeft && foundRight, offsetLeft, offsetRight);\n }\n\n function find(StdStorage storage self) internal returns (FindData storage) {\n return find(self, true);\n }\n\n /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against\n // slot complexity:\n // if flat, will be bytes32(uint256(uint));\n // if map, will be keccak256(abi.encode(key, uint(slot)));\n // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));\n // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);\n function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = getCallParams(self);\n\n // calldata to test against\n if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n vm.record();\n (, bytes32 callResult) = callTarget(self);\n (bytes32[] memory reads,) = vm.accesses(address(who));\n\n if (reads.length == 0) {\n revert(\"stdStorage find(StdStorage): No storage use detected for target.\");\n } else {\n for (uint256 i = reads.length; --i >= 0;) {\n bytes32 prev = vm.load(who, reads[i]);\n if (prev == bytes32(0)) {\n emit WARNING_UninitedSlot(who, uint256(reads[i]));\n }\n\n if (!checkSlotMutatesCall(self, reads[i])) {\n continue;\n }\n\n (uint256 offsetLeft, uint256 offsetRight) = (0, 0);\n\n if (self._enable_packed_slots) {\n bool found;\n (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);\n if (!found) {\n continue;\n }\n }\n\n // Check that value between found offsets is equal to the current call result\n uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;\n\n if (uint256(callResult) != curVal) {\n continue;\n }\n\n emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =\n FindData(uint256(reads[i]), offsetLeft, offsetRight, true);\n break;\n }\n }\n\n require(\n self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,\n \"stdStorage find(StdStorage): Slot(s) not found.\"\n );\n\n if (_clear) {\n clear(self);\n }\n return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n self._target = _target;\n return self;\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n self._sig = _sig;\n return self;\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n self._sig = sigs(_sig);\n return self;\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n self._calldata = _calldata;\n return self;\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n self._keys.push(bytes32(uint256(uint160(who))));\n return self;\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n self._keys.push(bytes32(amt));\n return self;\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n self._keys.push(key);\n return self;\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n self._enable_packed_slots = true;\n return self;\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n self._depth = _depth;\n return self;\n }\n\n function read(StdStorage storage self) private returns (bytes memory) {\n FindData storage data = find(self, false);\n uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);\n uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;\n clear(self);\n return abi.encode(value);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return abi.decode(read(self), (bytes32));\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n int256 v = read_int(self);\n if (v == 0) return false;\n if (v == 1) return true;\n revert(\"stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.\");\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return abi.decode(read(self), (address));\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return abi.decode(read(self), (uint256));\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return abi.decode(read(self), (int256));\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n return (uint256(parent_slot), key);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n address who = self._target;\n uint256 field_depth = self._depth;\n vm.startMappingRecording();\n uint256 child = find(self, true).slot - field_depth;\n bool found;\n bytes32 root_slot;\n bytes32 parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));\n if (!found) {\n revert(\n \"stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called.\"\n );\n }\n while (found) {\n root_slot = parent_slot;\n (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));\n }\n return uint256(root_slot);\n }\n\n function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {\n bytes32 out;\n\n uint256 max = b.length > 32 ? 32 : b.length;\n for (uint256 i = 0; i < max; i++) {\n out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);\n }\n return out;\n }\n\n function flatten(bytes32[] memory b) private pure returns (bytes memory) {\n bytes memory result = new bytes(b.length * 32);\n for (uint256 i = 0; i < b.length; i++) {\n bytes32 k = b[i];\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(result, add(32, mul(32, i))), k)\n }\n }\n\n return result;\n }\n\n function clear(StdStorage storage self) internal {\n delete self._target;\n delete self._sig;\n delete self._keys;\n delete self._depth;\n delete self._enable_packed_slots;\n delete self._calldata;\n }\n\n // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`\n // (slotValue & mask) >> offsetRight will be the value of the given packed variable\n function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {\n // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;\n // using assembly because (1 << 256) causes overflow\n assembly {\n mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))\n }\n }\n\n // Returns slot value with updated packed variable.\n function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)\n internal\n pure\n returns (bytes32 newValue)\n {\n return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));\n }\n}\n\nlibrary stdStorage {\n Vm private constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function sigs(string memory sigStr) internal pure returns (bytes4) {\n return stdStorageSafe.sigs(sigStr);\n }\n\n function find(StdStorage storage self) internal returns (uint256) {\n return find(self, true);\n }\n\n function find(StdStorage storage self, bool _clear) internal returns (uint256) {\n return stdStorageSafe.find(self, _clear).slot;\n }\n\n function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {\n return stdStorageSafe.target(self, _target);\n }\n\n function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {\n return stdStorageSafe.sig(self, _sig);\n }\n\n function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, who);\n }\n\n function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, amt);\n }\n\n function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {\n return stdStorageSafe.with_key(self, key);\n }\n\n function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {\n return stdStorageSafe.with_calldata(self, _calldata);\n }\n\n function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {\n return stdStorageSafe.enable_packed_slots(self);\n }\n\n function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {\n return stdStorageSafe.depth(self, _depth);\n }\n\n function clear(StdStorage storage self) internal {\n stdStorageSafe.clear(self);\n }\n\n function checked_write(StdStorage storage self, address who) internal {\n checked_write(self, bytes32(uint256(uint160(who))));\n }\n\n function checked_write(StdStorage storage self, uint256 amt) internal {\n checked_write(self, bytes32(amt));\n }\n\n function checked_write_int(StdStorage storage self, int256 val) internal {\n checked_write(self, bytes32(uint256(val)));\n }\n\n function checked_write(StdStorage storage self, bool write) internal {\n bytes32 t;\n /// @solidity memory-safe-assembly\n assembly {\n t := write\n }\n checked_write(self, t);\n }\n\n function checked_write(StdStorage storage self, bytes32 set) internal {\n address who = self._target;\n bytes4 fsig = self._sig;\n uint256 field_depth = self._depth;\n bytes memory params = stdStorageSafe.getCallParams(self);\n\n if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {\n find(self, false);\n }\n FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];\n if ((data.offsetLeft + data.offsetRight) > 0) {\n uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));\n require(\n uint256(set) < maxVal,\n string(\n abi.encodePacked(\n \"stdStorage find(StdStorage): Packed slot. We can't fit value greater than \",\n vm.toString(maxVal)\n )\n )\n );\n }\n bytes32 curVal = vm.load(who, bytes32(data.slot));\n bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);\n\n vm.store(who, bytes32(data.slot), valToSet);\n\n (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);\n\n if (!success || callResult != set) {\n vm.store(who, bytes32(data.slot), curVal);\n revert(\"stdStorage find(StdStorage): Failed to write value.\");\n }\n clear(self);\n }\n\n function read_bytes32(StdStorage storage self) internal returns (bytes32) {\n return stdStorageSafe.read_bytes32(self);\n }\n\n function read_bool(StdStorage storage self) internal returns (bool) {\n return stdStorageSafe.read_bool(self);\n }\n\n function read_address(StdStorage storage self) internal returns (address) {\n return stdStorageSafe.read_address(self);\n }\n\n function read_uint(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.read_uint(self);\n }\n\n function read_int(StdStorage storage self) internal returns (int256) {\n return stdStorageSafe.read_int(self);\n }\n\n function parent(StdStorage storage self) internal returns (uint256, bytes32) {\n return stdStorageSafe.parent(self);\n }\n\n function root(StdStorage storage self) internal returns (uint256) {\n return stdStorageSafe.root(self);\n }\n}\n" + }, + "forge-std/StdStyle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nimport {VmSafe} from \"./Vm.sol\";\n\nlibrary StdStyle {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n string constant RED = \"\\u001b[91m\";\n string constant GREEN = \"\\u001b[92m\";\n string constant YELLOW = \"\\u001b[93m\";\n string constant BLUE = \"\\u001b[94m\";\n string constant MAGENTA = \"\\u001b[95m\";\n string constant CYAN = \"\\u001b[96m\";\n string constant BOLD = \"\\u001b[1m\";\n string constant DIM = \"\\u001b[2m\";\n string constant ITALIC = \"\\u001b[3m\";\n string constant UNDERLINE = \"\\u001b[4m\";\n string constant INVERSE = \"\\u001b[7m\";\n string constant RESET = \"\\u001b[0m\";\n\n function styleConcat(string memory style, string memory self) private pure returns (string memory) {\n return string(abi.encodePacked(style, self, RESET));\n }\n\n function red(string memory self) internal pure returns (string memory) {\n return styleConcat(RED, self);\n }\n\n function red(uint256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(int256 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(address self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function red(bool self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes(bytes memory self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function redBytes32(bytes32 self) internal pure returns (string memory) {\n return red(vm.toString(self));\n }\n\n function green(string memory self) internal pure returns (string memory) {\n return styleConcat(GREEN, self);\n }\n\n function green(uint256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(int256 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(address self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function green(bool self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes(bytes memory self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function greenBytes32(bytes32 self) internal pure returns (string memory) {\n return green(vm.toString(self));\n }\n\n function yellow(string memory self) internal pure returns (string memory) {\n return styleConcat(YELLOW, self);\n }\n\n function yellow(uint256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(int256 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(address self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellow(bool self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes(bytes memory self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function yellowBytes32(bytes32 self) internal pure returns (string memory) {\n return yellow(vm.toString(self));\n }\n\n function blue(string memory self) internal pure returns (string memory) {\n return styleConcat(BLUE, self);\n }\n\n function blue(uint256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(int256 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(address self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blue(bool self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes(bytes memory self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function blueBytes32(bytes32 self) internal pure returns (string memory) {\n return blue(vm.toString(self));\n }\n\n function magenta(string memory self) internal pure returns (string memory) {\n return styleConcat(MAGENTA, self);\n }\n\n function magenta(uint256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(int256 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(address self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magenta(bool self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes(bytes memory self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function magentaBytes32(bytes32 self) internal pure returns (string memory) {\n return magenta(vm.toString(self));\n }\n\n function cyan(string memory self) internal pure returns (string memory) {\n return styleConcat(CYAN, self);\n }\n\n function cyan(uint256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(int256 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(address self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyan(bool self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes(bytes memory self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function cyanBytes32(bytes32 self) internal pure returns (string memory) {\n return cyan(vm.toString(self));\n }\n\n function bold(string memory self) internal pure returns (string memory) {\n return styleConcat(BOLD, self);\n }\n\n function bold(uint256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(int256 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(address self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function bold(bool self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes(bytes memory self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function boldBytes32(bytes32 self) internal pure returns (string memory) {\n return bold(vm.toString(self));\n }\n\n function dim(string memory self) internal pure returns (string memory) {\n return styleConcat(DIM, self);\n }\n\n function dim(uint256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(int256 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(address self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dim(bool self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes(bytes memory self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function dimBytes32(bytes32 self) internal pure returns (string memory) {\n return dim(vm.toString(self));\n }\n\n function italic(string memory self) internal pure returns (string memory) {\n return styleConcat(ITALIC, self);\n }\n\n function italic(uint256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(int256 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(address self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italic(bool self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes(bytes memory self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function italicBytes32(bytes32 self) internal pure returns (string memory) {\n return italic(vm.toString(self));\n }\n\n function underline(string memory self) internal pure returns (string memory) {\n return styleConcat(UNDERLINE, self);\n }\n\n function underline(uint256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(int256 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(address self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underline(bool self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes(bytes memory self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function underlineBytes32(bytes32 self) internal pure returns (string memory) {\n return underline(vm.toString(self));\n }\n\n function inverse(string memory self) internal pure returns (string memory) {\n return styleConcat(INVERSE, self);\n }\n\n function inverse(uint256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(int256 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(address self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverse(bool self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes(bytes memory self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n\n function inverseBytes32(bytes32 self) internal pure returns (string memory) {\n return inverse(vm.toString(self));\n }\n}\n" + }, + "forge-std/StdToml.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {VmSafe} from \"./Vm.sol\";\n\n// Helpers for parsing and writing TOML files\n// To parse:\n// ```\n// using stdToml for string;\n// string memory toml = vm.readFile(\"\");\n// toml.readUint(\"\");\n// ```\n// To write:\n// ```\n// using stdToml for string;\n// string memory json = \"json\";\n// json.serialize(\"a\", uint256(123));\n// string memory semiFinal = json.serialize(\"b\", string(\"test\"));\n// string memory finalJson = json.serialize(\"c\", semiFinal);\n// finalJson.write(\"\");\n// ```\n\nlibrary stdToml {\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n function keyExists(string memory toml, string memory key) internal view returns (bool) {\n return vm.keyExistsToml(toml, key);\n }\n\n function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseToml(toml, key);\n }\n\n function readUint(string memory toml, string memory key) internal pure returns (uint256) {\n return vm.parseTomlUint(toml, key);\n }\n\n function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {\n return vm.parseTomlUintArray(toml, key);\n }\n\n function readInt(string memory toml, string memory key) internal pure returns (int256) {\n return vm.parseTomlInt(toml, key);\n }\n\n function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {\n return vm.parseTomlIntArray(toml, key);\n }\n\n function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {\n return vm.parseTomlBytes32(toml, key);\n }\n\n function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {\n return vm.parseTomlBytes32Array(toml, key);\n }\n\n function readString(string memory toml, string memory key) internal pure returns (string memory) {\n return vm.parseTomlString(toml, key);\n }\n\n function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {\n return vm.parseTomlStringArray(toml, key);\n }\n\n function readAddress(string memory toml, string memory key) internal pure returns (address) {\n return vm.parseTomlAddress(toml, key);\n }\n\n function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {\n return vm.parseTomlAddressArray(toml, key);\n }\n\n function readBool(string memory toml, string memory key) internal pure returns (bool) {\n return vm.parseTomlBool(toml, key);\n }\n\n function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {\n return vm.parseTomlBoolArray(toml, key);\n }\n\n function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {\n return vm.parseTomlBytes(toml, key);\n }\n\n function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {\n return vm.parseTomlBytesArray(toml, key);\n }\n\n function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {\n return keyExists(toml, key) ? readUint(toml, key) : defaultValue;\n }\n\n function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)\n internal\n view\n returns (uint256[] memory)\n {\n return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;\n }\n\n function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {\n return keyExists(toml, key) ? readInt(toml, key) : defaultValue;\n }\n\n function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)\n internal\n view\n returns (int256[] memory)\n {\n return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;\n }\n\n function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)\n internal\n view\n returns (bytes32)\n {\n return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;\n }\n\n function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)\n internal\n view\n returns (bytes32[] memory)\n {\n return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;\n }\n\n function readStringOr(string memory toml, string memory key, string memory defaultValue)\n internal\n view\n returns (string memory)\n {\n return keyExists(toml, key) ? readString(toml, key) : defaultValue;\n }\n\n function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)\n internal\n view\n returns (string[] memory)\n {\n return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;\n }\n\n function readAddressOr(string memory toml, string memory key, address defaultValue)\n internal\n view\n returns (address)\n {\n return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;\n }\n\n function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)\n internal\n view\n returns (address[] memory)\n {\n return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;\n }\n\n function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {\n return keyExists(toml, key) ? readBool(toml, key) : defaultValue;\n }\n\n function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)\n internal\n view\n returns (bool[] memory)\n {\n return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;\n }\n\n function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)\n internal\n view\n returns (bytes memory)\n {\n return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;\n }\n\n function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)\n internal\n view\n returns (bytes[] memory)\n {\n return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;\n }\n\n function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {\n return vm.serializeJson(jsonKey, rootObject);\n }\n\n function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bool[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBool(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, uint256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeUint(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, int256[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeInt(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, address[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeAddress(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes32[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes32(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, bytes[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeBytes(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function serialize(string memory jsonKey, string memory key, string[] memory value)\n internal\n returns (string memory)\n {\n return vm.serializeString(jsonKey, key, value);\n }\n\n function write(string memory jsonKey, string memory path) internal {\n vm.writeToml(jsonKey, path);\n }\n\n function write(string memory jsonKey, string memory path, string memory valueKey) internal {\n vm.writeToml(jsonKey, path, valueKey);\n }\n}\n" + }, + "forge-std/StdUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\nimport {IMulticall3} from \"./interfaces/IMulticall3.sol\";\nimport {MockERC20} from \"./mocks/MockERC20.sol\";\nimport {MockERC721} from \"./mocks/MockERC721.sol\";\nimport {VmSafe} from \"./Vm.sol\";\n\nabstract contract StdUtils {\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS\n //////////////////////////////////////////////////////////////////////////*/\n\n IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);\n VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\n uint256 private constant INT256_MIN_ABS =\n 57896044618658097711785492504343953926634992332820282019728792003956564819968;\n uint256 private constant SECP256K1_ORDER =\n 115792089237316195423570985008687907852837564279074904382605163141518161494337;\n uint256 private constant UINT256_MAX =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n\n // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.\n address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n require(min <= max, \"StdUtils bound(uint256,uint256,uint256): Max is less than min.\");\n // If x is between min and max, return x directly. This is to ensure that dictionary values\n // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188\n if (x >= min && x <= max) return x;\n\n uint256 size = max - min + 1;\n\n // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.\n // This helps ensure coverage of the min/max values.\n if (x <= 3 && size > x) return min + x;\n if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);\n\n // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.\n if (x > max) {\n uint256 diff = x - max;\n uint256 rem = diff % size;\n if (rem == 0) return max;\n result = min + rem - 1;\n } else if (x < min) {\n uint256 diff = min - x;\n uint256 rem = diff % size;\n if (rem == 0) return min;\n result = max - rem + 1;\n }\n }\n\n function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", result);\n }\n\n function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n require(min <= max, \"StdUtils bound(int256,int256,int256): Max is less than min.\");\n\n // Shifting all int256 values to uint256 to use _bound function. The range of two types are:\n // int256 : -(2**255) ~ (2**255 - 1)\n // uint256: 0 ~ (2**256 - 1)\n // So, add 2**255, INT256_MIN_ABS to the integer values.\n //\n // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.\n // So, use `~uint256(x) + 1` instead.\n uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);\n uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);\n uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);\n\n uint256 y = _bound(_x, _min, _max);\n\n // To move it back to int256 value, subtract INT256_MIN_ABS at here.\n result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);\n }\n\n function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {\n result = _bound(x, min, max);\n console2_log_StdUtils(\"Bound result\", vm.toString(result));\n }\n\n function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {\n result = _bound(privateKey, 1, SECP256K1_ORDER - 1);\n }\n\n function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {\n require(b.length <= 32, \"StdUtils bytesToUint(bytes): Bytes length exceeds 32.\");\n return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));\n }\n\n /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce\n /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol)\n function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {\n console2_log_StdUtils(\"computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.\");\n return vm.computeCreateAddress(deployer, nonce);\n }\n\n function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)\n internal\n pure\n virtual\n returns (address)\n {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initcodeHash, deployer);\n }\n\n /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {\n console2_log_StdUtils(\"computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.\");\n return vm.computeCreate2Address(salt, initCodeHash);\n }\n\n /// @dev returns an initialized mock ERC20 contract\n function deployMockERC20(string memory name, string memory symbol, uint8 decimals)\n internal\n returns (MockERC20 mock)\n {\n mock = new MockERC20();\n mock.initialize(name, symbol, decimals);\n }\n\n /// @dev returns an initialized mock ERC721 contract\n function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) {\n mock = new MockERC721();\n mock.initialize(name, symbol);\n }\n\n /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {\n return hashInitCode(creationCode, \"\");\n }\n\n /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2\n /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode\n /// @param args the ABI-encoded arguments to the constructor of C\n function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(creationCode, args));\n }\n\n // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.\n function getTokenBalances(address token, address[] memory addresses)\n internal\n virtual\n returns (uint256[] memory balances)\n {\n uint256 tokenCodeSize;\n assembly {\n tokenCodeSize := extcodesize(token)\n }\n require(tokenCodeSize > 0, \"StdUtils getTokenBalances(address,address[]): Token address is not a contract.\");\n\n // ABI encode the aggregate call to Multicall3.\n uint256 length = addresses.length;\n IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);\n for (uint256 i = 0; i < length; ++i) {\n // 0x70a08231 = bytes4(\"balanceOf(address)\"))\n calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});\n }\n\n // Make the aggregate call.\n (, bytes[] memory returnData) = multicall.aggregate(calls);\n\n // ABI decode the return data and return the balances.\n balances = new uint256[](length);\n for (uint256 i = 0; i < length; ++i) {\n balances[i] = abi.decode(returnData[i], (uint256));\n }\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n PRIVATE FUNCTIONS\n //////////////////////////////////////////////////////////////////////////*/\n\n function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {\n return address(uint160(uint256(bytesValue)));\n }\n\n // This section is used to prevent the compilation of console, which shortens the compilation time when console is\n // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid\n // any breaking changes to function signatures.\n function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)\n internal\n pure\n returns (function(bytes memory) internal pure fnOut)\n {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castLogPayloadViewToPure(_sendLogPayloadView)(payload);\n }\n\n function _sendLogPayloadView(bytes memory payload) private view {\n uint256 payloadLength = payload.length;\n address consoleAddress = CONSOLE2_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n let payloadStart := add(payload, 32)\n let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n }\n }\n\n function console2_log_StdUtils(string memory p0) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function console2_log_StdUtils(string memory p0, uint256 p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function console2_log_StdUtils(string memory p0, string memory p1) private pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n}\n" + }, + "forge-std/Test.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\n// 💬 ABOUT\n// Forge Std's default Test.\n\n// 🧩 MODULES\nimport {console} from \"./console.sol\";\nimport {console2} from \"./console2.sol\";\nimport {safeconsole} from \"./safeconsole.sol\";\nimport {StdAssertions} from \"./StdAssertions.sol\";\nimport {StdChains} from \"./StdChains.sol\";\nimport {StdCheats} from \"./StdCheats.sol\";\nimport {stdError} from \"./StdError.sol\";\nimport {StdInvariant} from \"./StdInvariant.sol\";\nimport {stdJson} from \"./StdJson.sol\";\nimport {stdMath} from \"./StdMath.sol\";\nimport {StdStorage, stdStorage} from \"./StdStorage.sol\";\nimport {StdStyle} from \"./StdStyle.sol\";\nimport {stdToml} from \"./StdToml.sol\";\nimport {StdUtils} from \"./StdUtils.sol\";\nimport {Vm} from \"./Vm.sol\";\n\n// 📦 BOILERPLATE\nimport {TestBase} from \"./Base.sol\";\n\n// ⭐️ TEST\nabstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {\n // Note: IS_TEST() must return true.\n bool public IS_TEST = true;\n}\n" + }, + "forge-std/Vm.sol": { + "content": "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\n/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may\n/// result in Script simulations differing from on-chain execution. It is recommended to only use\n/// these cheats in scripts.\ninterface VmSafe {\n /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.\n enum CallerMode {\n // No caller modification is currently active.\n None,\n // A one time broadcast triggered by a `vm.broadcast()` call is currently active.\n Broadcast,\n // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.\n RecurrentBroadcast,\n // A one time prank triggered by a `vm.prank()` call is currently active.\n Prank,\n // A recurrent prank triggered by a `vm.startPrank()` call is currently active.\n RecurrentPrank\n }\n\n /// The kind of account access that occurred.\n enum AccountAccessKind {\n // The account was called.\n Call,\n // The account was called via delegatecall.\n DelegateCall,\n // The account was called via callcode.\n CallCode,\n // The account was called via staticcall.\n StaticCall,\n // The account was created.\n Create,\n // The account was selfdestructed.\n SelfDestruct,\n // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).\n Resume,\n // The account's balance was read.\n Balance,\n // The account's codesize was read.\n Extcodesize,\n // The account's codehash was read.\n Extcodehash,\n // The account's code was copied.\n Extcodecopy\n }\n\n /// Forge execution contexts.\n enum ForgeContext {\n // Test group execution context (test, coverage or snapshot).\n TestGroup,\n // `forge test` execution context.\n Test,\n // `forge coverage` execution context.\n Coverage,\n // `forge snapshot` execution context.\n Snapshot,\n // Script group execution context (dry run, broadcast or resume).\n ScriptGroup,\n // `forge script` execution context.\n ScriptDryRun,\n // `forge script --broadcast` execution context.\n ScriptBroadcast,\n // `forge script --resume` execution context.\n ScriptResume,\n // Unknown `forge` execution context.\n Unknown\n }\n\n /// An Ethereum log. Returned by `getRecordedLogs`.\n struct Log {\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The address of the log's emitter.\n address emitter;\n }\n\n /// An RPC URL and its alias. Returned by `rpcUrlStructs`.\n struct Rpc {\n // The alias of the RPC URL.\n string key;\n // The RPC URL.\n string url;\n }\n\n /// An RPC log object. Returned by `eth_getLogs`.\n struct EthGetLogs {\n // The address of the log's emitter.\n address emitter;\n // The topics of the log, including the signature, if any.\n bytes32[] topics;\n // The raw data of the log.\n bytes data;\n // The block hash.\n bytes32 blockHash;\n // The block number.\n uint64 blockNumber;\n // The transaction hash.\n bytes32 transactionHash;\n // The transaction index in the block.\n uint64 transactionIndex;\n // The log index.\n uint256 logIndex;\n // Whether the log was removed.\n bool removed;\n }\n\n /// A single entry in a directory listing. Returned by `readDir`.\n struct DirEntry {\n // The error message, if any.\n string errorMessage;\n // The path of the entry.\n string path;\n // The depth of the entry.\n uint64 depth;\n // Whether the entry is a directory.\n bool isDir;\n // Whether the entry is a symlink.\n bool isSymlink;\n }\n\n /// Metadata information about a file.\n /// This structure is returned from the `fsMetadata` function and represents known\n /// metadata about a file such as its permissions, size, modification\n /// times, etc.\n struct FsMetadata {\n // True if this metadata is for a directory.\n bool isDir;\n // True if this metadata is for a symlink.\n bool isSymlink;\n // The size of the file, in bytes, this metadata is for.\n uint256 length;\n // True if this metadata is for a readonly (unwritable) file.\n bool readOnly;\n // The last modification time listed in this metadata.\n uint256 modified;\n // The last access time of this metadata.\n uint256 accessed;\n // The creation time listed in this metadata.\n uint256 created;\n }\n\n /// A wallet with a public and private key.\n struct Wallet {\n // The wallet's address.\n address addr;\n // The wallet's public key `X`.\n uint256 publicKeyX;\n // The wallet's public key `Y`.\n uint256 publicKeyY;\n // The wallet's private key.\n uint256 privateKey;\n }\n\n /// The result of a `tryFfi` call.\n struct FfiResult {\n // The exit code of the call.\n int32 exitCode;\n // The optionally hex-decoded `stdout` data.\n bytes stdout;\n // The `stderr` data.\n bytes stderr;\n }\n\n /// Information on the chain and fork.\n struct ChainInfo {\n // The fork identifier. Set to zero if no fork is active.\n uint256 forkId;\n // The chain ID of the current fork.\n uint256 chainId;\n }\n\n /// The result of a `stopAndReturnStateDiff` call.\n struct AccountAccess {\n // The chain and fork the access occurred.\n ChainInfo chainInfo;\n // The kind of account access that determines what the account is.\n // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.\n // If kind is Create, then the account is the newly created account.\n // If kind is SelfDestruct, then the account is the selfdestruct recipient.\n // If kind is a Resume, then account represents a account context that has resumed.\n AccountAccessKind kind;\n // The account that was accessed.\n // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.\n address account;\n // What accessed the account.\n address accessor;\n // If the account was initialized or empty prior to the access.\n // An account is considered initialized if it has code, a\n // non-zero nonce, or a non-zero balance.\n bool initialized;\n // The previous balance of the accessed account.\n uint256 oldBalance;\n // The potential new balance of the accessed account.\n // That is, all balance changes are recorded here, even if reverts occurred.\n uint256 newBalance;\n // Code of the account deployed by CREATE.\n bytes deployedCode;\n // Value passed along with the account access\n uint256 value;\n // Input data provided to the CREATE or CALL\n bytes data;\n // If this access reverted in either the current or parent context.\n bool reverted;\n // An ordered list of storage accesses made during an account access operation.\n StorageAccess[] storageAccesses;\n // Call depth traversed during the recording of state differences\n uint64 depth;\n }\n\n /// The storage accessed during an `AccountAccess`.\n struct StorageAccess {\n // The account whose storage was accessed.\n address account;\n // The slot that was accessed.\n bytes32 slot;\n // If the access was a write.\n bool isWrite;\n // The previous value of the slot.\n bytes32 previousValue;\n // The new value of the slot.\n bytes32 newValue;\n // If the access was reverted.\n bool reverted;\n }\n\n /// Gas used. Returned by `lastCallGas`.\n struct Gas {\n // The gas limit of the call.\n uint64 gasLimit;\n // The total gas used.\n uint64 gasTotalUsed;\n // DEPRECATED: The amount of gas used for memory expansion. Ref: \n uint64 gasMemoryUsed;\n // The amount of gas refunded.\n int64 gasRefunded;\n // The amount of gas remaining.\n uint64 gasRemaining;\n }\n\n // ======== Crypto ========\n\n /// Derives a private key from the name, labels the account with that name, and returns the wallet.\n function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key and returns the wallet.\n function createWallet(uint256 privateKey) external returns (Wallet memory wallet);\n\n /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.\n function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path)\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at the derivation path `m/44'/60'/0'/0/{index}`.\n function deriveKey(string calldata mnemonic, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language\n /// at `{derivationPath}{index}`.\n function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)\n external\n pure\n returns (uint256 privateKey);\n\n /// Derives secp256r1 public key from the provided `privateKey`.\n function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);\n\n /// Adds a private key to the local forge wallet and returns the address.\n function rememberKey(uint256 privateKey) external returns (address keyAddr);\n\n /// Signs data with a `Wallet`.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the\n /// signature's `s` value, and the recovery id `v` in a single bytes32.\n /// This format reduces the signature size from 65 to 64 bytes.\n /// Raises error if none of the signers passed into the script have provided address.\n function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);\n\n /// Signs `digest` with `privateKey` using the secp256r1 curve.\n function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);\n\n /// Signs data with a `Wallet`.\n function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with `privateKey` using the secp256k1 curve.\n function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// If `--sender` is provided, the signer with provided address is used, otherwise,\n /// if exactly one signer is provided to the script, that signer is used.\n /// Raises error if signer passed through `--sender` does not match any unlocked signers or\n /// if `--sender` is not provided and not exactly one signer is passed to the script.\n function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n /// Signs `digest` with signer provided to script using the secp256k1 curve.\n /// Raises error if none of the signers passed into the script have provided address.\n function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);\n\n // ======== Environment ========\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and returns true if it exists, else returns false.\n function envExists(string calldata name) external view returns (bool result);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `bool`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bool defaultValue) external view returns (bool value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)\n external\n view\n returns (address[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)\n external\n view\n returns (bytes32[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)\n external\n view\n returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)\n external\n view\n returns (bytes[] memory value);\n\n /// Gets the environment variable `name` and parses it as `int256`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);\n\n /// Gets the environment variable `name` and parses it as `address`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, address defaultValue) external view returns (address value);\n\n /// Gets the environment variable `name` and parses it as `bytes32`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as `bytes`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)\n external\n view\n returns (bool[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)\n external\n view\n returns (uint256[] memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.\n /// Reverts if the variable could not be parsed.\n /// Returns `defaultValue` if the variable was not found.\n function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)\n external\n view\n returns (int256[] memory value);\n\n /// Gets the environment variable `name` and parses it as `string`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name) external view returns (string memory value);\n\n /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envString(string calldata name, string calldata delim) external view returns (string[] memory value);\n\n /// Gets the environment variable `name` and parses it as `uint256`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name) external view returns (uint256 value);\n\n /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.\n /// Reverts if the variable was not found or could not be parsed.\n function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);\n\n /// Returns true if `forge` command was executed in given context.\n function isContext(ForgeContext context) external view returns (bool result);\n\n /// Sets environment variables.\n function setEnv(string calldata name, string calldata value) external;\n\n // ======== EVM ========\n\n /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.\n function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);\n\n /// Gets the address for a given private key.\n function addr(uint256 privateKey) external pure returns (address keyAddr);\n\n /// Gets all the logs according to specified filter.\n function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)\n external\n returns (EthGetLogs[] memory logs);\n\n /// Gets the current `block.blobbasefee`.\n /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlobBaseFee() external view returns (uint256 blobBaseFee);\n\n /// Gets the current `block.number`.\n /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockNumber() external view returns (uint256 height);\n\n /// Gets the current `block.timestamp`.\n /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,\n /// and as a result will get optimized out by the compiler.\n /// See https://github.com/foundry-rs/foundry/issues/6180\n function getBlockTimestamp() external view returns (uint256 timestamp);\n\n /// Gets the map key and parent of a mapping at a given slot, for a given address.\n function getMappingKeyAndParentOf(address target, bytes32 elementSlot)\n external\n returns (bool found, bytes32 key, bytes32 parent);\n\n /// Gets the number of elements in the mapping at the given slot, for a given address.\n function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length);\n\n /// Gets the elements at index idx of the mapping at the given slot, for a given address. The\n /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).\n function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value);\n\n /// Gets the nonce of an account.\n function getNonce(address account) external view returns (uint64 nonce);\n\n /// Get the nonce of a `Wallet`.\n function getNonce(Wallet calldata wallet) external returns (uint64 nonce);\n\n /// Gets all the recorded logs.\n function getRecordedLogs() external returns (Log[] memory logs);\n\n /// Gets the gas used in the last call.\n function lastCallGas() external view returns (Gas memory gas);\n\n /// Loads a storage slot from an address.\n function load(address target, bytes32 slot) external view returns (bytes32 data);\n\n /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.\n function pauseGasMetering() external;\n\n /// Records all storage reads and writes.\n function record() external;\n\n /// Record all the transaction logs.\n function recordLogs() external;\n\n /// Reset gas metering (i.e. gas usage is set to gas limit).\n function resetGasMetering() external;\n\n /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.\n function resumeGasMetering() external;\n\n /// Performs an Ethereum JSON-RPC request to the current fork URL.\n function rpc(string calldata method, string calldata params) external returns (bytes memory data);\n\n /// Performs an Ethereum JSON-RPC request to the given endpoint.\n function rpc(string calldata urlOrAlias, string calldata method, string calldata params)\n external\n returns (bytes memory data);\n\n /// Starts recording all map SSTOREs for later retrieval.\n function startMappingRecording() external;\n\n /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,\n /// along with the context of the calls\n function startStateDiffRecording() external;\n\n /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.\n function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);\n\n /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.\n function stopMappingRecording() external;\n\n // ======== Filesystem ========\n\n /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.\n /// `path` is relative to the project root.\n function closeFile(string calldata path) external;\n\n /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.\n /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.\n /// Both `from` and `to` are relative to the project root.\n function copyFile(string calldata from, string calldata to) external returns (uint64 copied);\n\n /// Creates a new, empty directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - User lacks permissions to modify `path`.\n /// - A parent of the given path doesn't exist and `recursive` is false.\n /// - `path` already exists and `recursive` is false.\n /// `path` is relative to the project root.\n function createDir(string calldata path, bool recursive) external;\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function deployCode(string calldata artifactPath) external returns (address deployedAddress);\n\n /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n /// Additionally accepts abi-encoded constructor arguments.\n function deployCode(string calldata artifactPath, bytes calldata constructorArgs)\n external\n returns (address deployedAddress);\n\n /// Returns true if the given path points to an existing entity, else returns false.\n function exists(string calldata path) external returns (bool result);\n\n /// Performs a foreign function call via the terminal.\n function ffi(string[] calldata commandInput) external returns (bytes memory result);\n\n /// Given a path, query the file system to get information about a file, directory, etc.\n function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);\n\n /// Gets the artifact path from code (aka. creation code).\n function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);\n\n /// Gets the artifact path from deployed code (aka. runtime code).\n function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);\n\n /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);\n\n /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the\n /// artifact in the form of :: where and parts are optional.\n function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);\n\n /// Returns true if the path exists on disk and is pointing at a directory, else returns false.\n function isDir(string calldata path) external returns (bool result);\n\n /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.\n function isFile(string calldata path) external returns (bool result);\n\n /// Get the path of the current project root.\n function projectRoot() external view returns (string memory path);\n\n /// Prompts the user for a string value in the terminal.\n function prompt(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for an address in the terminal.\n function promptAddress(string calldata promptText) external returns (address);\n\n /// Prompts the user for a hidden string value in the terminal.\n function promptSecret(string calldata promptText) external returns (string memory input);\n\n /// Prompts the user for hidden uint256 in the terminal (usually pk).\n function promptSecretUint(string calldata promptText) external returns (uint256);\n\n /// Prompts the user for uint256 in the terminal.\n function promptUint(string calldata promptText) external returns (uint256);\n\n /// Reads the directory at the given path recursively, up to `maxDepth`.\n /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.\n /// Follows symbolic links if `followLinks` is true.\n function readDir(string calldata path) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);\n\n /// See `readDir(string)`.\n function readDir(string calldata path, uint64 maxDepth, bool followLinks)\n external\n view\n returns (DirEntry[] memory entries);\n\n /// Reads the entire content of file to string. `path` is relative to the project root.\n function readFile(string calldata path) external view returns (string memory data);\n\n /// Reads the entire content of file as binary. `path` is relative to the project root.\n function readFileBinary(string calldata path) external view returns (bytes memory data);\n\n /// Reads next line of file to string.\n function readLine(string calldata path) external view returns (string memory line);\n\n /// Reads a symbolic link, returning the path that the link points to.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` is not a symbolic link.\n /// - `path` does not exist.\n function readLink(string calldata linkPath) external view returns (string memory targetPath);\n\n /// Removes a directory at the provided path.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` doesn't exist.\n /// - `path` isn't a directory.\n /// - User lacks permissions to modify `path`.\n /// - The directory is not empty and `recursive` is false.\n /// `path` is relative to the project root.\n function removeDir(string calldata path, bool recursive) external;\n\n /// Removes a file from the filesystem.\n /// This cheatcode will revert in the following situations, but is not limited to just these cases:\n /// - `path` points to a directory.\n /// - The file doesn't exist.\n /// - The user lacks permissions to remove the file.\n /// `path` is relative to the project root.\n function removeFile(string calldata path) external;\n\n /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.\n function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);\n\n /// Returns the time since unix epoch in milliseconds.\n function unixTime() external returns (uint256 milliseconds);\n\n /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFile(string calldata path, string calldata data) external;\n\n /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.\n /// `path` is relative to the project root.\n function writeFileBinary(string calldata path, bytes calldata data) external;\n\n /// Writes line to file, creating a file if it does not exist.\n /// `path` is relative to the project root.\n function writeLine(string calldata path, string calldata data) external;\n\n // ======== JSON ========\n\n /// Checks if `key` exists in a JSON object.\n function keyExistsJson(string calldata json, string calldata key) external view returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `address`.\n function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);\n\n /// Parses a string of JSON data at `key` and coerces it to `address[]`.\n function parseJsonAddressArray(string calldata json, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool`.\n function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);\n\n /// Parses a string of JSON data at `key` and coerces it to `bool[]`.\n function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes`.\n function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32`.\n function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.\n function parseJsonBytes32Array(string calldata json, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.\n function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256`.\n function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);\n\n /// Parses a string of JSON data at `key` and coerces it to `int256[]`.\n function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a JSON object.\n function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of JSON data at `key` and coerces it to `string`.\n function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `string[]`.\n function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256`.\n function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);\n\n /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.\n function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a JSON object.\n function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a JSON object at `key`.\n function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)\n external\n returns (string memory json);\n\n /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.\n /// Returns the stringified version of the specific JSON file up to that moment.\n function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(string calldata typeDescription, bytes calldata value)\n external\n pure\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeJsonType(\n string calldata objectKey,\n string calldata valueKey,\n string calldata typeDescription,\n bytes calldata value\n ) external returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)\n external\n returns (string memory json);\n\n /// See `serializeJson`.\n function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)\n external\n returns (string memory json);\n\n /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.\n function writeJson(string calldata json, string calldata path) external;\n\n /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = \n /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.\n function writeJson(string calldata json, string calldata path, string calldata valueKey) external;\n\n /// Checks if `key` exists in a JSON object\n /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.\n function keyExists(string calldata json, string calldata key) external view returns (bool);\n\n // ======== Scripting ========\n\n /// Takes a signed transaction and broadcasts it to the network.\n function broadcastRawTransaction(bytes calldata data) external;\n\n /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function broadcast() external;\n\n /// Has the next call (at this call depth only) create a transaction with the address provided\n /// as the sender that can later be signed and sent onchain.\n function broadcast(address signer) external;\n\n /// Has the next call (at this call depth only) create a transaction with the private key\n /// provided as the sender that can later be signed and sent onchain.\n function broadcast(uint256 privateKey) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.\n /// Broadcasting address is determined by checking the following in order:\n /// 1. If `--sender` argument was provided, that address is used.\n /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.\n /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.\n function startBroadcast() external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the address\n /// provided that can later be signed and sent onchain.\n function startBroadcast(address signer) external;\n\n /// Has all subsequent calls (at this call depth only) create transactions with the private key\n /// provided that can later be signed and sent onchain.\n function startBroadcast(uint256 privateKey) external;\n\n /// Stops collecting onchain transactions.\n function stopBroadcast() external;\n\n // ======== String ========\n\n /// Returns the index of the first occurrence of a `key` in an `input` string.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.\n /// Returns 0 in case of an empty `key`.\n function indexOf(string calldata input, string calldata key) external pure returns (uint256);\n\n /// Parses the given `string` into an `address`.\n function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);\n\n /// Parses the given `string` into a `bool`.\n function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);\n\n /// Parses the given `string` into `bytes`.\n function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);\n\n /// Parses the given `string` into a `bytes32`.\n function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);\n\n /// Parses the given `string` into a `int256`.\n function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);\n\n /// Parses the given `string` into a `uint256`.\n function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);\n\n /// Replaces occurrences of `from` in the given `string` with `to`.\n function replace(string calldata input, string calldata from, string calldata to)\n external\n pure\n returns (string memory output);\n\n /// Splits the given `string` into an array of strings divided by the `delimiter`.\n function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);\n\n /// Converts the given `string` value to Lowercase.\n function toLowercase(string calldata input) external pure returns (string memory output);\n\n /// Converts the given value to a `string`.\n function toString(address value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes calldata value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bytes32 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(bool value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(uint256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given value to a `string`.\n function toString(int256 value) external pure returns (string memory stringifiedValue);\n\n /// Converts the given `string` value to Uppercase.\n function toUppercase(string calldata input) external pure returns (string memory output);\n\n /// Trims leading and trailing whitespace from the given `string` value.\n function trim(string calldata input) external pure returns (string memory output);\n\n // ======== Testing ========\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n uint256 left,\n uint256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message.\n function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqAbsDecimal(\n int256 left,\n int256 right,\n uint256 maxDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;\n\n /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;\n\n /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\n /// Includes error message into revert string on failure.\n function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n uint256 left,\n uint256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message.\n function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertApproxEqRelDecimal(\n int256 left,\n int256 right,\n uint256 maxPercentDelta,\n uint256 decimals,\n string calldata error\n ) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;\n\n /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\n /// Includes error message into revert string on failure.\n function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error)\n external\n pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are equal.\n function assertEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are equal.\n function assertEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are equal and includes error message into revert string on failure.\n function assertEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are equal.\n function assertEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are equal.\n function assertEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.\n function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256 values are equal.\n function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are equal.\n function assertEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal.\n function assertEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are equal.\n function assertEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.\n function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are equal.\n function assertEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.\n function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal.\n function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.\n function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.\n function assertEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are equal.\n function assertEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are equal and includes error message into revert string on failure.\n function assertEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are equal.\n function assertEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are equal and includes error message into revert string on failure.\n function assertEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are equal.\n function assertEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.\n function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is false.\n function assertFalse(bool condition) external pure;\n\n /// Asserts that the given condition is false and includes error message into revert string on failure.\n function assertFalse(bool condition, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n function assertGe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n function assertGe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than or equal to second.\n /// Includes error message into revert string on failure.\n function assertGe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n function assertGt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n function assertGt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be greater than second.\n /// Includes error message into revert string on failure.\n function assertGt(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n function assertLe(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n function assertLe(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than or equal to second.\n /// Includes error message into revert string on failure.\n function assertLe(int256 left, int256 right, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Formats values with decimals in failure message. Includes error message into revert string on failure.\n function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n function assertLt(uint256 left, uint256 right) external pure;\n\n /// Compares two `uint256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n function assertLt(int256 left, int256 right) external pure;\n\n /// Compares two `int256` values. Expects first value to be less than second.\n /// Includes error message into revert string on failure.\n function assertLt(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;\n\n /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;\n\n /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\n /// Includes error message into revert string on failure.\n function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;\n\n /// Asserts that two `bool` values are not equal.\n function assertNotEq(bool left, bool right) external pure;\n\n /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool left, bool right, string calldata error) external pure;\n\n /// Asserts that two `string` values are not equal.\n function assertNotEq(string calldata left, string calldata right) external pure;\n\n /// Asserts that two `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;\n\n /// Asserts that two `bytes` values are not equal.\n function assertNotEq(bytes calldata left, bytes calldata right) external pure;\n\n /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal.\n function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;\n\n /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;\n\n /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal.\n function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;\n\n /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal.\n function assertNotEq(uint256 left, uint256 right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal.\n function assertNotEq(address[] calldata left, address[] calldata right) external pure;\n\n /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `string` values are not equal.\n function assertNotEq(string[] calldata left, string[] calldata right) external pure;\n\n /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.\n function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;\n\n /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;\n\n /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;\n\n /// Asserts that two `int256` values are not equal.\n function assertNotEq(int256 left, int256 right) external pure;\n\n /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.\n function assertNotEq(int256 left, int256 right, string calldata error) external pure;\n\n /// Asserts that two `address` values are not equal.\n function assertNotEq(address left, address right) external pure;\n\n /// Asserts that two `address` values are not equal and includes error message into revert string on failure.\n function assertNotEq(address left, address right, string calldata error) external pure;\n\n /// Asserts that two `bytes32` values are not equal.\n function assertNotEq(bytes32 left, bytes32 right) external pure;\n\n /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.\n function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;\n\n /// Asserts that the given condition is true.\n function assertTrue(bool condition) external pure;\n\n /// Asserts that the given condition is true and includes error message into revert string on failure.\n function assertTrue(bool condition, string calldata error) external pure;\n\n /// If the condition is false, discard this run's fuzz inputs and generate new ones.\n function assume(bool condition) external pure;\n\n /// Discard this run's fuzz inputs and generate new ones if next call reverted.\n function assumeNoRevert() external pure;\n\n /// Writes a breakpoint to jump to in the debugger.\n function breakpoint(string calldata char) external;\n\n /// Writes a conditional breakpoint to jump to in the debugger.\n function breakpoint(string calldata char, bool value) external;\n\n /// Returns the Foundry version.\n /// Format: ++\n /// Sample output: 0.2.0+faa94c384+202407110019\n /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.\n /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000)\n /// to compare timestamps while ignoring minor time differences.\n function getFoundryVersion() external view returns (string memory version);\n\n /// Returns the RPC url for the given alias.\n function rpcUrl(string calldata rpcAlias) external view returns (string memory json);\n\n /// Returns all rpc urls and their aliases as structs.\n function rpcUrlStructs() external view returns (Rpc[] memory urls);\n\n /// Returns all rpc urls and their aliases `[alias, url][]`.\n function rpcUrls() external view returns (string[2][] memory urls);\n\n /// Suspends execution of the main thread for `duration` milliseconds.\n function sleep(uint256 duration) external;\n\n // ======== Toml ========\n\n /// Checks if `key` exists in a TOML table.\n function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `address`.\n function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);\n\n /// Parses a string of TOML data at `key` and coerces it to `address[]`.\n function parseTomlAddressArray(string calldata toml, string calldata key)\n external\n pure\n returns (address[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool`.\n function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);\n\n /// Parses a string of TOML data at `key` and coerces it to `bool[]`.\n function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes`.\n function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32`.\n function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.\n function parseTomlBytes32Array(string calldata toml, string calldata key)\n external\n pure\n returns (bytes32[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.\n function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256`.\n function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);\n\n /// Parses a string of TOML data at `key` and coerces it to `int256[]`.\n function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);\n\n /// Returns an array of all the keys in a TOML table.\n function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);\n\n /// Parses a string of TOML data at `key` and coerces it to `string`.\n function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `string[]`.\n function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.\n function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.\n function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)\n external\n pure\n returns (bytes memory);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256`.\n function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);\n\n /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.\n function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);\n\n /// ABI-encodes a TOML table.\n function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);\n\n /// ABI-encodes a TOML table at `key`.\n function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.\n function writeToml(string calldata json, string calldata path) external;\n\n /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = \n /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.\n function writeToml(string calldata json, string calldata path, string calldata valueKey) external;\n\n // ======== Utilities ========\n\n /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer)\n external\n pure\n returns (address);\n\n /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.\n function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);\n\n /// Compute the address a contract will be deployed at for a given deployer address and nonce.\n function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);\n\n /// Utility cheatcode to copy storage of `from` contract to another `to` contract.\n function copyStorage(address from, address to) external;\n\n /// Returns ENS namehash for provided string.\n function ensNamehash(string calldata name) external pure returns (bytes32);\n\n /// Gets the label for the specified address.\n function getLabel(address account) external view returns (string memory currentLabel);\n\n /// Labels an address in call traces.\n function label(address account, string calldata newLabel) external;\n\n /// Pauses collection of call traces. Useful in cases when you want to skip tracing of\n /// complex calls which are not useful for debugging.\n function pauseTracing() external view;\n\n /// Returns a random `address`.\n function randomAddress() external returns (address);\n\n /// Returns an random `bool`.\n function randomBool() external view returns (bool);\n\n /// Returns an random byte array value of the given length.\n function randomBytes(uint256 len) external view returns (bytes memory);\n\n /// Returns an random `int256` value.\n function randomInt() external view returns (int256);\n\n /// Returns an random `int256` value of given bits.\n function randomInt(uint256 bits) external view returns (int256);\n\n /// Returns a random uint256 value.\n function randomUint() external returns (uint256);\n\n /// Returns random uint256 value between the provided range (=min..=max).\n function randomUint(uint256 min, uint256 max) external returns (uint256);\n\n /// Returns an random `uint256` value of given bits.\n function randomUint(uint256 bits) external view returns (uint256);\n\n /// Unpauses collection of call traces.\n function resumeTracing() external view;\n\n /// Utility cheatcode to set arbitrary storage for given target address.\n function setArbitraryStorage(address target) external;\n\n /// Encodes a `bytes` value to a base64url string.\n function toBase64URL(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64url string.\n function toBase64URL(string calldata data) external pure returns (string memory);\n\n /// Encodes a `bytes` value to a base64 string.\n function toBase64(bytes calldata data) external pure returns (string memory);\n\n /// Encodes a `string` value to a base64 string.\n function toBase64(string calldata data) external pure returns (string memory);\n}\n\n/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used\n/// in tests, but it is not recommended to use these cheats in scripts.\ninterface Vm is VmSafe {\n // ======== EVM ========\n\n /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.\n function activeFork() external view returns (uint256 forkId);\n\n /// In forking mode, explicitly grant the given address cheatcode access.\n function allowCheatcodes(address account) external;\n\n /// Sets `block.blobbasefee`\n function blobBaseFee(uint256 newBlobBaseFee) external;\n\n /// Sets the blobhashes in the transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function blobhashes(bytes32[] calldata hashes) external;\n\n /// Sets `block.chainid`.\n function chainId(uint256 newChainId) external;\n\n /// Clears all mocked calls.\n function clearMockedCalls() external;\n\n /// Sets `block.coinbase`.\n function coinbase(address newCoinbase) external;\n\n /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.\n function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);\n\n /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);\n\n /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,\n /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.\n function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);\n\n /// Sets an address' balance.\n function deal(address account, uint256 newBalance) external;\n\n /// Removes the snapshot with the given ID created by `snapshot`.\n /// Takes the snapshot ID to delete.\n /// Returns `true` if the snapshot was successfully deleted.\n /// Returns `false` if the snapshot does not exist.\n function deleteSnapshot(uint256 snapshotId) external returns (bool success);\n\n /// Removes _all_ snapshots previously created by `snapshot`.\n function deleteSnapshots() external;\n\n /// Sets `block.difficulty`.\n /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.\n /// Reverts if used on unsupported EVM versions.\n function difficulty(uint256 newDifficulty) external;\n\n /// Dump a genesis JSON file's `allocs` to disk.\n function dumpState(string calldata pathToStateJson) external;\n\n /// Sets an address' code.\n function etch(address target, bytes calldata newRuntimeBytecode) external;\n\n /// Sets `block.basefee`.\n function fee(uint256 newBasefee) external;\n\n /// Gets the blockhashes from the current transaction.\n /// Not available on EVM versions before Cancun.\n /// If used on unsupported EVM versions it will revert.\n function getBlobhashes() external view returns (bytes32[] memory hashes);\n\n /// Returns true if the account is marked as persistent.\n function isPersistent(address account) external view returns (bool persistent);\n\n /// Load a genesis JSON file's `allocs` into the in-memory revm state.\n function loadAllocs(string calldata pathToAllocsJson) external;\n\n /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup\n /// Meaning, changes made to the state of this account will be kept when switching forks.\n function makePersistent(address account) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address account0, address account1, address account2) external;\n\n /// See `makePersistent(address)`.\n function makePersistent(address[] calldata accounts) external;\n\n /// Reverts a call to an address with specified revert data.\n function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;\n\n /// Reverts a call to an address with a specific `msg.value`, with specified revert data.\n function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)\n external;\n\n /// Mocks a call to an address, returning specified data.\n /// Calldata can either be strict or a partial match, e.g. if you only\n /// pass a Solidity selector to the expected calldata, then the entire Solidity\n /// function will be mocked.\n function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;\n\n /// Mocks a call to an address with a specific `msg.value`, returning specified data.\n /// Calldata match takes precedence over `msg.value` in case of ambiguity.\n function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;\n\n /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls\n /// `target` with the same calldata. This functionality is similar to a delegate call made to\n /// `target` contract from `callee`.\n /// Can be used to substitute a call to a function with another implementation that captures\n /// the primary logic of the original function but is easier to reason about.\n /// If calldata is not a strict match then partial match by selector is attempted.\n function mockFunction(address callee, address target, bytes calldata data) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address.\n function prank(address msgSender) external;\n\n /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.\n function prank(address msgSender, address txOrigin) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(bytes32 newPrevrandao) external;\n\n /// Sets `block.prevrandao`.\n /// Not available on EVM versions before Paris. Use `difficulty` instead.\n /// If used on unsupported EVM versions it will revert.\n function prevrandao(uint256 newPrevrandao) external;\n\n /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.\n function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin);\n\n /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.\n function resetNonce(address account) external;\n\n /// Revert the state of the EVM to a previous snapshot\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted.\n /// Returns `false` if the snapshot does not exist.\n /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`.\n function revertTo(uint256 snapshotId) external returns (bool success);\n\n /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots\n /// Takes the snapshot ID to revert to.\n /// Returns `true` if the snapshot was successfully reverted and deleted.\n /// Returns `false` if the snapshot does not exist.\n function revertToAndDelete(uint256 snapshotId) external returns (bool success);\n\n /// Revokes persistent status from the address, previously added via `makePersistent`.\n function revokePersistent(address account) external;\n\n /// See `revokePersistent(address)`.\n function revokePersistent(address[] calldata accounts) external;\n\n /// Sets `block.height`.\n function roll(uint256 newHeight) external;\n\n /// Updates the currently active fork to given block number\n /// This is similar to `roll` but for the currently active fork.\n function rollFork(uint256 blockNumber) external;\n\n /// Updates the currently active fork to given transaction. This will `rollFork` with the number\n /// of the block the transaction was mined in and replays all transaction mined before it in the block.\n function rollFork(bytes32 txHash) external;\n\n /// Updates the given fork to given block number.\n function rollFork(uint256 forkId, uint256 blockNumber) external;\n\n /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.\n function rollFork(uint256 forkId, bytes32 txHash) external;\n\n /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.\n function selectFork(uint256 forkId) external;\n\n /// Set blockhash for the current block.\n /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.\n function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;\n\n /// Sets the nonce of an account. Must be higher than the current nonce of the account.\n function setNonce(address account, uint64 newNonce) external;\n\n /// Sets the nonce of an account to an arbitrary value.\n function setNonceUnsafe(address account, uint64 newNonce) external;\n\n /// Snapshot the current state of the evm.\n /// Returns the ID of the snapshot that was created.\n /// To revert a snapshot use `revertTo`.\n function snapshot() external returns (uint256 snapshotId);\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.\n function startPrank(address msgSender) external;\n\n /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.\n function startPrank(address msgSender, address txOrigin) external;\n\n /// Resets subsequent calls' `msg.sender` to be `address(this)`.\n function stopPrank() external;\n\n /// Stores a value to an address' storage slot.\n function store(address target, bytes32 slot, bytes32 value) external;\n\n /// Fetches the given transaction from the active fork and executes it on the current state.\n function transact(bytes32 txHash) external;\n\n /// Fetches the given transaction from the given fork and executes it on the current state.\n function transact(uint256 forkId, bytes32 txHash) external;\n\n /// Sets `tx.gasprice`.\n function txGasPrice(uint256 newGasPrice) external;\n\n /// Sets `block.timestamp`.\n function warp(uint256 newTimestamp) external;\n\n // ======== Testing ========\n\n /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;\n\n /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.\n function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)\n external;\n\n /// Expects a call to an address with the specified calldata.\n /// Calldata can either be a strict or a partial match.\n function expectCall(address callee, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified calldata.\n function expectCall(address callee, bytes calldata data, uint64 count) external;\n\n /// Expects a call to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value` and calldata.\n function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;\n\n /// Expect a call to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;\n\n /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.\n function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;\n\n /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)\n external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(\n bool checkTopic0,\n bool checkTopic1,\n bool checkTopic2,\n bool checkTopic3,\n bool checkData,\n address emitter\n ) external;\n\n /// Prepare an expected anonymous log with all topic and data checks enabled.\n /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmitAnonymous() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmitAnonymous(address emitter) external;\n\n /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)\n external;\n\n /// Prepare an expected log with all topic and data checks enabled.\n /// Call this function, then emit an event, then call a function. Internally after the call, we check if\n /// logs were emitted in the expected order with the expected topics and data.\n function expectEmit() external;\n\n /// Same as the previous method, but also checks supplied address against emitting contract.\n function expectEmit(address emitter) external;\n\n /// Expects an error on next call that starts with the revert data.\n function expectPartialRevert(bytes4 revertData) external;\n\n /// Expects an error on next call to reverter address, that starts with the revert data.\n function expectPartialRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error on next call with any revert data.\n function expectRevert() external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes4 revertData) external;\n\n /// Expects an error on next call that exactly matches the revert data.\n function expectRevert(bytes calldata revertData) external;\n\n /// Expects an error with any revert data on next call to reverter address.\n function expectRevert(address reverter) external;\n\n /// Expects an error from reverter address on next call, with any revert data.\n function expectRevert(bytes4 revertData, address reverter) external;\n\n /// Expects an error from reverter address on next call, that exactly matches the revert data.\n function expectRevert(bytes calldata revertData, address reverter) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other\n /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.\n function expectSafeMemory(uint64 min, uint64 max) external;\n\n /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.\n /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges\n /// to the set.\n function expectSafeMemoryCall(uint64 min, uint64 max) external;\n\n /// Marks a test as skipped. Must be called at the top level of a test.\n function skip(bool skipTest) external;\n\n /// Marks a test as skipped with a reason. Must be called at the top level of a test.\n function skip(bool skipTest, string calldata reason) external;\n\n /// Stops all safe memory expectation in the current subcontext.\n function stopExpectSafeMemory() external;\n}\n" + }, + "lib/ERC1155Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport 'lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol';\n\ncontract ERC1155Mintable is ERC1155(\"//uri\"), ERC1155Burnable {\n function mint(address to, uint256 id, uint256 amount) public {\n _mint(to, id, amount, bytes(\"\"));\n }\n}\n" + }, + "lib/ERC20Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\";\n\ncontract ERC20Mintable is ERC20(\"n\", \"s\") {\n function mint(address to, uint256 amount) public {\n _mint(to, amount);\n }\n}\n" + }, + "lib/ERC721Mintable.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport \"lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol\";\n\ncontract ERC721Mintable is ERC721(\"n\", \"s\") {\n function mint(address to, uint256 tokenId) public {\n _mint(to, tokenId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() external {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC1155.sol\";\nimport \"./IERC1155Receiver.sol\";\nimport \"./extensions/IERC1155MetadataURI.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n *\n * _Available since v3.1._\n */\ncontract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {\n using Address for address;\n\n // Mapping from token ID to account balances\n mapping(uint256 => mapping(address => uint256)) private _balances;\n\n // Mapping from account to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256) public view virtual override returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {\n require(account != address(0), \"ERC1155: address zero is not a valid owner\");\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] memory accounts, uint256[] memory ids)\n public\n view\n virtual\n override\n returns (uint256[] memory)\n {\n require(accounts.length == ids.length, \"ERC1155: accounts and ids length mismatch\");\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts[i], ids[i]);\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeTransferFrom(from, to, id, amount, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) public virtual override {\n require(\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n _safeBatchTransferFrom(from, to, ids, amounts, data);\n }\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n\n emit TransferSingle(operator, from, to, id, amount);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n require(to != address(0), \"ERC1155: transfer to the zero address\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: insufficient balance for transfer\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n _balances[id][to] += amount;\n }\n\n emit TransferBatch(operator, from, to, ids, amounts);\n\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the amounts in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _balances[id][to] += amount;\n emit TransferSingle(operator, address(0), to, id, amount);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n require(to != address(0), \"ERC1155: mint to the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n for (uint256 i = 0; i < ids.length; i++) {\n _balances[ids[i]][to] += amounts[i];\n }\n\n emit TransferBatch(operator, address(0), to, ids, amounts);\n\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);\n }\n\n /**\n * @dev Destroys `amount` tokens of token type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `amount` tokens of token type `id`.\n */\n function _burn(\n address from,\n uint256 id,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n\n address operator = _msgSender();\n uint256[] memory ids = _asSingletonArray(id);\n uint256[] memory amounts = _asSingletonArray(amount);\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n\n emit TransferSingle(operator, from, address(0), id, amount);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n */\n function _burnBatch(\n address from,\n uint256[] memory ids,\n uint256[] memory amounts\n ) internal virtual {\n require(from != address(0), \"ERC1155: burn from the zero address\");\n require(ids.length == amounts.length, \"ERC1155: ids and amounts length mismatch\");\n\n address operator = _msgSender();\n\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n for (uint256 i = 0; i < ids.length; i++) {\n uint256 id = ids[i];\n uint256 amount = amounts[i];\n\n uint256 fromBalance = _balances[id][from];\n require(fromBalance >= amount, \"ERC1155: burn amount exceeds balance\");\n unchecked {\n _balances[id][from] = fromBalance - amount;\n }\n }\n\n emit TransferBatch(operator, from, address(0), ids, amounts);\n\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC1155: setting approval status for self\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `ids` and `amounts` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting\n * and burning, as well as batched variants.\n *\n * The same hook is called on both single and batched variants. For single\n * transfers, the length of the `id` and `amount` arrays will be 1.\n *\n * Calling conditions (for each `id` and `amount` pair):\n *\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * of token type `id` will be transferred to `to`.\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\n * for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\n * will be burned.\n * - `from` and `to` are never both zero.\n * - `ids` and `amounts` have the same, non-zero length.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) private {\n if (to.isContract()) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n revert(\"ERC1155: ERC1155Receiver rejected tokens\");\n }\n } catch Error(string memory reason) {\n revert(reason);\n } catch {\n revert(\"ERC1155: transfer to non-ERC1155Receiver implementer\");\n }\n }\n }\n\n function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {\n uint256[] memory array = new uint256[](1);\n array[0] = element;\n\n return array;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1155.sol\";\n\n/**\n * @dev Extension of {ERC1155} that allows token holders to destroy both their\n * own tokens and those that they have been approved to use.\n *\n * _Available since v3.1._\n */\nabstract contract ERC1155Burnable is ERC1155 {\n function burn(\n address account,\n uint256 id,\n uint256 value\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burn(account, id, value);\n }\n\n function burnBatch(\n address account,\n uint256[] memory ids,\n uint256[] memory values\n ) public virtual {\n require(\n account == _msgSender() || isApprovedForAll(account, _msgSender()),\n \"ERC1155: caller is not token owner or approved\"\n );\n\n _burnBatch(account, ids, values);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)\n external\n view\n returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes calldata data\n ) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) external;\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC1155Receiver.sol\";\n\n/**\n * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.\n *\n * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be\n * stuck.\n *\n * @dev _Available since v3.1._\n */\ncontract ERC1155Holder is ERC1155Receiver {\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC1155Receiver.sol\";\nimport \"../../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\nabstract contract ERC1155Receiver is ERC165, IERC1155Receiver {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.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 * For a generic mechanism see {ERC20PresetMinterPauser}.\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 * 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 *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => 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 * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\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 override 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 override 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 value {ERC20} uses, unless this function is\n * 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 override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override 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 `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` 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 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\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 `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `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 * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` 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 function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\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" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\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 amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` 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(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256, /* firstTokenId */\n uint256 batchSize\n ) internal virtual {\n if (batchSize > 1) {\n if (from != address(0)) {\n _balances[from] -= batchSize;\n }\n if (to != address(0)) {\n _balances[to] += batchSize;\n }\n }\n }\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Receiver.sol\";\n\n/**\n * @dev Implementation of the {IERC721Receiver} interface.\n *\n * Accepts all token transfers.\n * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.\n */\ncontract ERC721Holder is IERC721Receiver {\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n *\n * Always returns `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "lib/openzeppelin-contracts/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface.\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n // prepare call\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n\n // perform static call\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly {\n success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0x00)\n }\n\n return success && returnSize >= 0x20 && returnValue > 0;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableMap.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableMap.js.\n\npragma solidity ^0.8.0;\n\nimport \"./EnumerableSet.sol\";\n\n/**\n * @dev Library for managing an enumerable variant of Solidity's\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\n * type.\n *\n * Maps have the following properties:\n *\n * - Entries are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableMap for EnumerableMap.UintToAddressMap;\n *\n * // Declare a set state variable\n * EnumerableMap.UintToAddressMap private myMap;\n * }\n * ```\n *\n * The following map types are supported:\n *\n * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0\n * - `address -> uint256` (`AddressToUintMap`) since v4.6.0\n * - `bytes32 -> bytes32` (`Bytes32ToBytes32Map`) since v4.6.0\n * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0\n * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableMap.\n * ====\n */\nlibrary EnumerableMap {\n using EnumerableSet for EnumerableSet.Bytes32Set;\n\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Map type with\n // bytes32 keys and values.\n // The Map implementation uses private functions, and user-facing\n // implementations (such as Uint256ToAddressMap) are just wrappers around\n // the underlying Map.\n // This means that we can only create new EnumerableMaps for types that fit\n // in bytes32.\n\n struct Bytes32ToBytes32Map {\n // Storage of keys\n EnumerableSet.Bytes32Set _keys;\n mapping(bytes32 => bytes32) _values;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n bytes32 value\n ) internal returns (bool) {\n map._values[key] = value;\n return map._keys.add(key);\n }\n\n /**\n * @dev Removes a key-value pair from a map. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {\n delete map._values[key];\n return map._keys.remove(key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) {\n return map._keys.contains(key);\n }\n\n /**\n * @dev Returns the number of key-value pairs in the map. O(1).\n */\n function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) {\n return map._keys.length();\n }\n\n /**\n * @dev Returns the key-value pair stored at position `index` in the map. O(1).\n *\n * Note that there are no guarantees on the ordering of entries inside the\n * array, and it may change when more entries are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) {\n bytes32 key = map._keys.at(index);\n return (key, map._values[key]);\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) {\n bytes32 value = map._values[key];\n if (value == bytes32(0)) {\n return (contains(map, key), bytes32(0));\n } else {\n return (true, value);\n }\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), \"EnumerableMap: nonexistent key\");\n return value;\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToBytes32Map storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (bytes32) {\n bytes32 value = map._values[key];\n require(value != 0 || contains(map, key), errorMessage);\n return value;\n }\n\n // UintToUintMap\n\n struct UintToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToUintMap storage map,\n uint256 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToUintMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key)));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToUintMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(key), errorMessage));\n }\n\n // UintToAddressMap\n\n struct UintToAddressMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n UintToAddressMap storage map,\n uint256 key,\n address value\n ) internal returns (bool) {\n return set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\n return remove(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\n return contains(map._inner, bytes32(key));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(UintToAddressMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (uint256(key), address(uint160(uint256(value))));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));\n return (success, address(uint160(uint256(value))));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n UintToAddressMap storage map,\n uint256 key,\n string memory errorMessage\n ) internal view returns (address) {\n return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage))));\n }\n\n // AddressToUintMap\n\n struct AddressToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n AddressToUintMap storage map,\n address key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(AddressToUintMap storage map, address key) internal returns (bool) {\n return remove(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(AddressToUintMap storage map, address key) internal view returns (bool) {\n return contains(map._inner, bytes32(uint256(uint160(key))));\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(AddressToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (address(uint160(uint256(key))), uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key))));\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(AddressToUintMap storage map, address key) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key)))));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n AddressToUintMap storage map,\n address key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage));\n }\n\n // Bytes32ToUintMap\n\n struct Bytes32ToUintMap {\n Bytes32ToBytes32Map _inner;\n }\n\n /**\n * @dev Adds a key-value pair to a map, or updates the value for an existing\n * key. O(1).\n *\n * Returns true if the key was added to the map, that is if it was not\n * already present.\n */\n function set(\n Bytes32ToUintMap storage map,\n bytes32 key,\n uint256 value\n ) internal returns (bool) {\n return set(map._inner, key, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the key was removed from the map, that is if it was present.\n */\n function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) {\n return remove(map._inner, key);\n }\n\n /**\n * @dev Returns true if the key is in the map. O(1).\n */\n function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) {\n return contains(map._inner, key);\n }\n\n /**\n * @dev Returns the number of elements in the map. O(1).\n */\n function length(Bytes32ToUintMap storage map) internal view returns (uint256) {\n return length(map._inner);\n }\n\n /**\n * @dev Returns the element stored at position `index` in the set. O(1).\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) {\n (bytes32 key, bytes32 value) = at(map._inner, index);\n return (key, uint256(value));\n }\n\n /**\n * @dev Tries to returns the value associated with `key`. O(1).\n * Does not revert if `key` is not in the map.\n */\n function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) {\n (bool success, bytes32 value) = tryGet(map._inner, key);\n return (success, uint256(value));\n }\n\n /**\n * @dev Returns the value associated with `key`. O(1).\n *\n * Requirements:\n *\n * - `key` must be in the map.\n */\n function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) {\n return uint256(get(map._inner, key));\n }\n\n /**\n * @dev Same as {get}, with a custom error message when `key` is not in the map.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryGet}.\n */\n function get(\n Bytes32ToUintMap storage map,\n bytes32 key,\n string memory errorMessage\n ) internal view returns (uint256) {\n return uint256(get(map._inner, key, errorMessage));\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n * // Add the library methods\n * using EnumerableSet for EnumerableSet.AddressSet;\n *\n * // Declare a set state variable\n * EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSet {\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Set type with\n // bytes32 values.\n // The Set implementation uses private functions, and user-facing\n // implementations (such as AddressSet) are just wrappers around the\n // underlying Set.\n // This means that we can only create new EnumerableSets for types that fit\n // in bytes32.\n\n struct Set {\n // Storage of set values\n bytes32[] _values;\n // Position of the value in the `values` array, plus 1 because index 0\n // means a value is not in the set.\n mapping(bytes32 => uint256) _indexes;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function _add(Set storage set, bytes32 value) private returns (bool) {\n if (!_contains(set, value)) {\n set._values.push(value);\n // The value is stored at length-1, but we add 1 to all indexes\n // and use 0 as a sentinel value\n set._indexes[value] = set._values.length;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function _remove(Set storage set, bytes32 value) private returns (bool) {\n // We read and store the value's index to prevent multiple reads from the same storage slot\n uint256 valueIndex = set._indexes[value];\n\n if (valueIndex != 0) {\n // Equivalent to contains(set, value)\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n // the array, and then remove the last element (sometimes called as 'swap and pop').\n // This modifies the order of the array, as noted in {at}.\n\n uint256 toDeleteIndex = valueIndex - 1;\n uint256 lastIndex = set._values.length - 1;\n\n if (lastIndex != toDeleteIndex) {\n bytes32 lastValue = set._values[lastIndex];\n\n // Move the last value to the index where the value to delete is\n set._values[toDeleteIndex] = lastValue;\n // Update the index for the moved value\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\n }\n\n // Delete the slot where the moved value was stored\n set._values.pop();\n\n // Delete the index for the deleted slot\n delete set._indexes[value];\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\n return set._indexes[value] != 0;\n }\n\n /**\n * @dev Returns the number of values on the set. O(1).\n */\n function _length(Set storage set) private view returns (uint256) {\n return set._values.length;\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\n return set._values[index];\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function _values(Set storage set) private view returns (bytes32[] memory) {\n return set._values;\n }\n\n // Bytes32Set\n\n struct Bytes32Set {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _add(set._inner, value);\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _remove(set._inner, value);\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n return _contains(set._inner, value);\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(Bytes32Set storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n return _at(set._inner, index);\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n bytes32[] memory store = _values(set._inner);\n bytes32[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // AddressSet\n\n struct AddressSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(AddressSet storage set, address value) internal returns (bool) {\n return _add(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(AddressSet storage set, address value) internal returns (bool) {\n return _remove(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(AddressSet storage set, address value) internal view returns (bool) {\n return _contains(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(AddressSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\n return address(uint160(uint256(_at(set._inner, index))));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(AddressSet storage set) internal view returns (address[] memory) {\n bytes32[] memory store = _values(set._inner);\n address[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // UintSet\n\n struct UintSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(UintSet storage set, uint256 value) internal returns (bool) {\n return _add(set._inner, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\n return _remove(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n return _contains(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(UintSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n return uint256(_at(set._inner, index));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(UintSet storage set) internal view returns (uint256[] memory) {\n bytes32[] memory store = _values(set._inner);\n uint256[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n}\n" + }, + "lib/solmate/src/tokens/ERC20.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\nabstract contract ERC20 {\n /*//////////////////////////////////////////////////////////////\n EVENTS\n //////////////////////////////////////////////////////////////*/\n\n event Transfer(address indexed from, address indexed to, uint256 amount);\n\n event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n /*//////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string public name;\n\n string public symbol;\n\n uint8 public immutable decimals;\n\n /*//////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 public totalSupply;\n\n mapping(address => uint256) public balanceOf;\n\n mapping(address => mapping(address => uint256)) public allowance;\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 internal immutable INITIAL_CHAIN_ID;\n\n bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*//////////////////////////////////////////////////////////////\n CONSTRUCTOR\n //////////////////////////////////////////////////////////////*/\n\n constructor(\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n\n INITIAL_CHAIN_ID = block.chainid;\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual returns (bool) {\n allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual returns (bool) {\n balanceOf[msg.sender] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual returns (bool) {\n uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;\n\n balanceOf[from] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*//////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n // Unchecked because the only math done is incrementing\n // the owner's nonce which cannot realistically overflow.\n unchecked {\n address recoveredAddress = ecrecover(\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(\n abi.encode(\n keccak256(\n \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n ),\n owner,\n spender,\n value,\n nonces[owner]++,\n deadline\n )\n )\n )\n ),\n v,\n r,\n s\n );\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n allowance[recoveredAddress][spender] = value;\n }\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return\n keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(\"1\"),\n block.chainid,\n address(this)\n )\n );\n }\n\n /*//////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n totalSupply += amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n balanceOf[from] -= amount;\n\n // Cannot underflow because a user's balance\n // will never be larger than the total supply.\n unchecked {\n totalSupply -= amount;\n }\n\n emit Transfer(from, address(0), amount);\n }\n}\n" + }, + "lib/solmate/src/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Gas optimized reentrancy protection for smart contracts.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)\nabstract contract ReentrancyGuard {\n uint256 private locked = 1;\n\n modifier nonReentrant() virtual {\n require(locked == 1, \"REENTRANCY\");\n\n locked = 2;\n\n _;\n\n locked = 1;\n }\n}\n" + }, + "lib/solmate/src/utils/SafeTransferLib.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20} from \"../tokens/ERC20.sol\";\n\n/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)\n/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.\n/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.\nlibrary SafeTransferLib {\n /*//////////////////////////////////////////////////////////////\n ETH OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferETH(address to, uint256 amount) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Transfer the ETH and store if it succeeded or not.\n success := call(gas(), to, amount, 0, 0, 0, 0)\n }\n\n require(success, \"ETH_TRANSFER_FAILED\");\n }\n\n /*//////////////////////////////////////////////////////////////\n ERC20 OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferFrom(\n ERC20 token,\n address from,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), from) // Append the \"from\" argument.\n mstore(add(freeMemoryPointer, 36), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 68), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FROM_FAILED\");\n }\n\n function safeTransfer(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"TRANSFER_FAILED\");\n }\n\n function safeApprove(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool success;\n\n /// @solidity memory-safe-assembly\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata into memory, beginning with the function selector.\n mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)\n mstore(add(freeMemoryPointer, 4), to) // Append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Append the \"amount\" argument.\n\n success := and(\n // Set success to whether the call reverted, if not we check it either\n // returned exactly 1 (can't just be non-zero data), or had no return data.\n or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n // Counterintuitively, this call must be positioned second to the or() call in the\n // surrounding and() call or else returndatasize() will be zero during the computation.\n call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)\n )\n }\n\n require(success, \"APPROVE_FAILED\");\n }\n}\n" + } + }, + "settings": { + "evmVersion": "paris", + "optimizer": { + "enabled": true, + "mode": "3" + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + }, + "detectMissingLibraries": false, + "forceEVMLA": false, + "enableEraVMExtensions": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index c32fba6..2767e60 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,8 +1,11 @@ [profile.default] -src = 'src' +src = 'contracts' out = 'out' -libs = ['lib'] +libs = ['lib', 'node_modules'] +test = 'foundry-test' +cache_path = 'cache_forge' bytecode_hash = 'none' +solc_version = '0.8.20' [etherscan] arbitrum = { key = "${ARBISCAN_API_KEY}" } diff --git a/hardhat.config.ts b/hardhat.config.ts new file mode 100644 index 0000000..2cb7f81 --- /dev/null +++ b/hardhat.config.ts @@ -0,0 +1,86 @@ +import "hardhat-deploy"; +import "@treasure-dev/hardhat-kms"; +import "@matterlabs/hardhat-zksync"; +import "@matterlabs/hardhat-zksync-verify"; +import "@nomicfoundation/hardhat-foundry"; +import { HardhatUserConfig, task } from "hardhat/config"; +import "dotenv/config"; + +import { getUniswapV2BytecodeHash } from "./scripts/getUniswapV2BytecodeHash"; + +const devKmsKey = process.env.DEV_KMS_RESOURCE_ID; +const prodKmsKey = process.env.PROD_KMS_RESOURCE_ID; + +const config: HardhatUserConfig = { + defaultNetwork: "treasureTopaz", + networks: { + treasureTopaz: { + url: "https://rpc.topaz.treasure.lol", + ethNetwork: "sepolia", + chainId: 0xeeee2, + zksync: true, + verifyURL: + "https://rpc-explorer-verify.topaz.treasure.lol/contract_verification", + kmsKeyId: devKmsKey, + }, + treasureMainnet: { + url: "https://rpc.treasure.lol", + ethNetwork: "mainnet", + chainId: 0xeeee, + zksync: true, + live: true, + saveDeployments: true, + gasMultiplier: 2, + verifyURL: + "https://rpc-explorer-verify.treasure.lol/contract_verification", + kmsKeyId: prodKmsKey, + }, + arbitrumSepolia: { + url: process.env.ARBITRUM_SEPOLIA_RPC ?? "https://sepolia-rollup.arbitrum.io/rpc", + ethNetwork: "sepolia", + kmsKeyId: devKmsKey, + }, + arbitrumOne: { + url: process.env.ARBITRUM_RPC ?? "https://arb1.arbitrum.io/rpc", + ethNetwork: "mainnet", + live: true, + saveDeployments: true, + kmsKeyId: prodKmsKey, + }, + dockerizedNode: { + url: "http://localhost:3050", + ethNetwork: "http://localhost:8545", + }, + inMemoryNode: { + url: "http://127.0.0.1:8011", + ethNetwork: "localhost", // in-memory node doesn't support eth node; removing this line will cause an error + zksync: true, + }, + hardhat: { + zksync: true, + }, + }, + zksolc: { + version: "1.5.4", + settings: { + // find all available options in the official documentation + // https://docs.zksync.io/build/tooling/hardhat/hardhat-zksync-solc#configuration + }, + }, + solidity: { + version: "0.8.20", + }, + namedAccounts: { + deployer: 0, + }, +}; + +task( + "uniswap-bytecode-hash", + "Prints the bytecode hash of UniswapV2Pair contract", + async function (taskArguments, hre, runSuper) { + console.log("uniswapV2 bytecode hash", await getUniswapV2BytecodeHash(hre)); + } +); + +export default config; diff --git a/lib/forge-std b/lib/forge-std index ff4bf7d..8f24d6b 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit ff4bf7db008d096ea5a657f2c20516182252a3ed +Subproject commit 8f24d6b04c92975e0795b5868aa0d783251cdeaa diff --git a/package.json b/package.json new file mode 100644 index 0000000..2189364 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "magicswapv2-contracts", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "deploy:treasure-topaz": "hardhat deploy-zksync --network treasureTopaz", + "deploy:treasure-mainnet": "hardhat deploy-zksync --network treasureMainnet", + "deploy:arbitrum-sepolia": "hardhat deploy --network arbitrumSepolia", + "deploy:arbitrum-one": "hardhat deploy --network arbitrumOne", + "compile": "hardhat compile", + "compile:forge": "forge build", + "clean": "hardhat clean", + "test:hardhat": "hardhat test --network hardhat", + "test:forge": "forge test", + "style:solidity": "forge fmt --zksync" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@matterlabs/hardhat-zksync": "^1.1.0", + "@matterlabs/hardhat-zksync-verify": "^1.6.0", + "@matterlabs/zksync-contracts": "^0.6.1", + "@nomicfoundation/hardhat-foundry": "^1.1.2", + "@nomicfoundation/hardhat-verify": "^2.0.9", + "@openzeppelin/contracts": "^4.9.2", + "@treasure-dev/hardhat-kms": "^1.0.0", + "@types/chai": "^4.3.16", + "@types/mocha": "^10.0.7", + "chai": "^4.5.0", + "dotenv": "^16.4.5", + "ethers": "^6.13.2", + "hardhat": "^2.22.7", + "hardhat-deploy": "^0.12.4", + "mocha": "^10.7.0", + "ts-node": "^10.9.2", + "typescript": "^5.5.4", + "zksync-ethers": "^6.11.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..b31a385 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5486 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@matterlabs/hardhat-zksync': + specifier: ^1.1.0 + version: 1.2.0(hev46a52yfe6h3nutol7622bma) + '@matterlabs/hardhat-zksync-verify': + specifier: ^1.6.0 + version: 1.6.0(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@matterlabs/zksync-contracts': + specifier: ^0.6.1 + version: 0.6.1(@openzeppelin/contracts-upgradeable@4.6.0)(@openzeppelin/contracts@4.9.6) + '@nomicfoundation/hardhat-foundry': + specifier: ^1.1.2 + version: 1.1.2(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.9 + version: 2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@openzeppelin/contracts': + specifier: ^4.9.2 + version: 4.9.6 + '@treasure-dev/hardhat-kms': + specifier: ^1.0.0 + version: 1.0.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + '@types/chai': + specifier: ^4.3.16 + version: 4.3.20 + '@types/mocha': + specifier: ^10.0.7 + version: 10.0.9 + chai: + specifier: ^4.5.0 + version: 4.5.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + ethers: + specifier: ^6.13.2 + version: 6.13.3 + hardhat: + specifier: ^2.22.7 + version: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + hardhat-deploy: + specifier: ^0.12.4 + version: 0.12.4 + mocha: + specifier: ^10.7.0 + version: 10.7.3 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) + typescript: + specifier: ^5.5.4 + version: 5.6.3 + zksync-ethers: + specifier: ^6.11.0 + version: 6.13.1(ethers@6.13.3) + +packages: + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@1.2.2': + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@1.2.2': + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-kms@3.669.0': + resolution: {integrity: sha512-CU61uxI2VEECUpqo7lB+R7rx4m8Eo1o1SUHJQNEArP4dewraitZkdgs+mgsS+n6U7CqAt5+utJoivUyCl1PP3Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.669.0': + resolution: {integrity: sha512-E7uYOS3Axhe36Zeq6iLC9kjF1mMEyCQ4fXud11h22rbjq7PFUtN2Omekrch37eUx3BFj1jMePnuTnT98t5LWnw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.669.0 + + '@aws-sdk/client-sso@3.669.0': + resolution: {integrity: sha512-WNpfNYIHzehLv98F+KolJglXNjJOTbOvIbSZ2XAnebVLmXCWeEEd1r4dIH0oI2dHtLbQ/h3uqaeQhsVQjLAxpw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.669.0': + resolution: {integrity: sha512-1XdOBtHKCVxVkEDiy+oktJNSsySj3ADyh58KpHaqgvCQKV3vmfkr0YO5dG4kqq+TflNwdfl1YgMuOUiCulOWeQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.667.0': + resolution: {integrity: sha512-pMcDVI7Tmdsc8R3sDv0Omj/4iRParGY+uJtAfF669WnZfDfaBQaix2Mq7+Mu08vdjqO9K3gicFvjk9S1VLmOKA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.667.0': + resolution: {integrity: sha512-zZbrkkaPc54WXm+QAnpuv0LPNfsts0HPPd+oCECGs7IQRaFsGj187cwvPg9RMWDFZqpm64MdBDoA8OQHsqzYCw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.667.0': + resolution: {integrity: sha512-sjtybFfERZWiqTY7fswBxKQLvUkiCucOWyqh3IaPo/4nE1PXRnaZCVG0+kRBPrYIxWqiVwytvZzMJy8sVZcG0A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.669.0': + resolution: {integrity: sha512-YHhfH7w29BmMPnOK0BrBhEy2IRFRSRGSCyz3jtqpG883CZ2Lxan/AzaJDfKRdz350KPgbMMBwbPkIrqNIsg8iw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.669.0 + + '@aws-sdk/credential-provider-node@3.669.0': + resolution: {integrity: sha512-O506azQcq6N1gnDX870MXXL9LHlhX0k6BlLMM6IDClxVDnlNkK3+n2cAEKSy8HwZJcRlekcsKz/AS2CxjPY+fg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.667.0': + resolution: {integrity: sha512-HZHnvop32fKgsNHkdhVaul7UzQ25sEc0j9yqA4bjhtbk0ECl42kj3f1pJ+ZU/YD9ut8lMJs/vVqiOdNThVdeBw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.669.0': + resolution: {integrity: sha512-HvpMJQ8xZuEGjadARVOfORPZx4U23PC5Jf6Fj+/NWK4VxEXhvf8J037fvGp3xRds5wUeuBBbhWX+Cbt0lbLCwQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.667.0': + resolution: {integrity: sha512-t8CFlZMD/1p/8Cli3rvRiTJpjr/8BO64gw166AHgFZYSN2h95L2l1tcW0jpsc3PprA32nLg1iQVKYt4WGM4ugw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.667.0 + + '@aws-sdk/middleware-host-header@3.667.0': + resolution: {integrity: sha512-Z7fIAMQnPegs7JjAQvlOeWXwpMRfegh5eCoIP6VLJIeR6DLfYKbP35JBtt98R6DXslrN2RsbTogjbxPEDQfw1w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.667.0': + resolution: {integrity: sha512-PtTRNpNm/5c746jRgZCNg4X9xEJIwggkGJrF0GP9AB1ANg4pc/sF2Fvn1NtqPe9wtQ2stunJprnm5WkCHN7QiA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.667.0': + resolution: {integrity: sha512-U5glWD3ehFohzpUpopLtmqAlDurGWo2wRGPNgi4SwhWU7UDt6LS7E/UvJjqC0CUrjlzOw+my2A+Ncf+fisMhxQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.669.0': + resolution: {integrity: sha512-K8ScPi45zjJrj5Y2gRqVsvKKQCQbvQBfYGcBw9ZOx9TTavH80bOCBjWg/GFnvs4f37tqVc1wMN2oGvcTF6HveQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/region-config-resolver@3.667.0': + resolution: {integrity: sha512-iNr+JhhA902JMKHG9IwT9YdaEx6KGl6vjAL5BRNeOjfj4cZYMog6Lz/IlfOAltMtT0w88DAHDEFrBd2uO0l2eg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/token-providers@3.667.0': + resolution: {integrity: sha512-ZecJlG8p6D4UTYlBHwOWX6nknVtw/OBJ3yPXTSajBjhUlj9lE2xvejI8gl4rqkyLXk7z3bki+KR4tATbMaM9yg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.667.0 + + '@aws-sdk/types@3.664.0': + resolution: {integrity: sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/types@3.667.0': + resolution: {integrity: sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.667.0': + resolution: {integrity: sha512-X22SYDAuQJWnkF1/q17pkX3nGw5XMD9YEUbmt87vUnRq7iyJ3JOpl6UKOBeUBaL838wA5yzdbinmCITJ/VZ1QA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.667.0': + resolution: {integrity: sha512-y1pKlNzNpxzddM0QSnfIfIbi3Z9LTag1VDjYyZRbEGGSVip2J00qKsET+979nRezWMyJgw5GPBQR3Y+rN+jh0Q==} + + '@aws-sdk/util-user-agent-node@3.669.0': + resolution: {integrity: sha512-9jxCYrgggy2xd44ZASqI7AMiRVaSiFp+06Kg8BQSU0ijKpBJlwcsqIS8pDT/n6LxuOw2eV5ipvM2C0r1iKzrGA==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-utf8-browser@3.259.0': + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@matterlabs/hardhat-zksync-deploy@1.5.0': + resolution: {integrity: sha512-7LAgYYwoKWHeR+3CyWEvA3NKBKtt7ktcr7SX6ZPgbEYqHAdXH02vxJZGwNADtMWpyYm8h+fEQkpPIgErD4NhmA==} + peerDependencies: + ethers: ^6.12.2 + hardhat: ^2.22.5 + zksync-ethers: ^6.8.0 + + '@matterlabs/hardhat-zksync-ethers@1.2.1': + resolution: {integrity: sha512-J/ZpGx2Ig9AUxsKbE4IqpQ6hetqO7RPRFaSrdIcEWzurSYWb40Ih/HkQD03f5cSAjzhQEKaNlyVofefqLGkdZg==} + peerDependencies: + ethers: ^6.12.2 + zksync-ethers: ^6.11.2 + + '@matterlabs/hardhat-zksync-node@1.1.1': + resolution: {integrity: sha512-cDN4PbntNRAu9CRCwWY1qNxA7Nsr5lLGC2MT80p/h7/FR9AT4USUgnRCeYsgNOKwa6c9mRNwD/CxJhgreYrUbA==} + peerDependencies: + hardhat: ^2.22.5 + + '@matterlabs/hardhat-zksync-solc@1.2.5': + resolution: {integrity: sha512-iZyznWl1Hoe/Z46hnUe1s2drBZBjJOS/eN+Ql2lIBX9B6NevBl9DYzkKzH5HEIMCLGnX9sWpRAJqUQJWy9UB6w==} + peerDependencies: + hardhat: ^2.22.5 + + '@matterlabs/hardhat-zksync-upgradable@1.7.0': + resolution: {integrity: sha512-ycBp/W/Xss5VWNBbpQyJnxUmkQrZ6ouYNVaKShB+L4hRrwXmM8bjh08JR8tZu/mZc9XcGtTYRP+7qS1yvqm2Tw==} + + '@matterlabs/hardhat-zksync-verify@1.6.0': + resolution: {integrity: sha512-RsWlQbI23BDXMsxTtvHXpzx1dBotI2p2trvdG+r1uN/KAmMJBOKIqxce2UNXl8skd5Gtysa4GPjXEp4yaf2KrA==} + peerDependencies: + '@nomicfoundation/hardhat-verify': ^2.0.8 + hardhat: ^2.22.5 + + '@matterlabs/hardhat-zksync@1.2.0': + resolution: {integrity: sha512-5tA8Yvt3S5+CEIoawvQw+D1IcKMmr78MwFYWCtJrBA8OQGXhCS9Q79Gk7vJkkQ2MjzrHBob1WLkxTdlhWWnSGg==} + peerDependencies: + '@matterlabs/hardhat-zksync-deploy': ^1.5.0 + '@matterlabs/hardhat-zksync-ethers': ^1.2.1 + '@matterlabs/hardhat-zksync-node': ^1.1.1 + '@matterlabs/hardhat-zksync-solc': ^1.2.5 + '@matterlabs/hardhat-zksync-upgradable': ^1.6.0 + '@matterlabs/hardhat-zksync-verify': ^1.6.0 + + '@matterlabs/zksync-contracts@0.6.1': + resolution: {integrity: sha512-+hucLw4DhGmTmQlXOTEtpboYCaOm/X2VJcWmnW4abNcOgQXEHX+mTxQrxEfPjIZT0ZE6z5FTUrOK9+RgUZwBMQ==} + peerDependencies: + '@openzeppelin/contracts': 4.6.0 + '@openzeppelin/contracts-upgradeable': 4.6.0 + + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nomicfoundation/edr-darwin-arm64@0.6.3': + resolution: {integrity: sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-darwin-x64@0.6.3': + resolution: {integrity: sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': + resolution: {integrity: sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': + resolution: {integrity: sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': + resolution: {integrity: sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': + resolution: {integrity: sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': + resolution: {integrity: sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr@0.6.3': + resolution: {integrity: sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/hardhat-ethers@3.0.8': + resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} + peerDependencies: + ethers: ^6.1.0 + hardhat: ^2.0.0 + + '@nomicfoundation/hardhat-foundry@1.1.2': + resolution: {integrity: sha512-f5Vhj3m2qvKGpr6NAINYwNgILDsai8dVCsFb1rAVLkJxOmD2pAtfCmOH5SBVr9yUI5B1z9rbTwPBJVrqnb+PXQ==} + peerDependencies: + hardhat: ^2.17.2 + + '@nomicfoundation/hardhat-verify@2.0.11': + resolution: {integrity: sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==} + peerDependencies: + hardhat: ^2.0.4 + + '@nomicfoundation/slang-darwin-arm64@0.17.0': + resolution: {integrity: sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-darwin-x64@0.17.0': + resolution: {integrity: sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-linux-arm64-gnu@0.17.0': + resolution: {integrity: sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-linux-arm64-musl@0.17.0': + resolution: {integrity: sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-linux-x64-gnu@0.17.0': + resolution: {integrity: sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-linux-x64-musl@0.17.0': + resolution: {integrity: sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-win32-arm64-msvc@0.17.0': + resolution: {integrity: sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-win32-ia32-msvc@0.17.0': + resolution: {integrity: sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang-win32-x64-msvc@0.17.0': + resolution: {integrity: sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA==} + engines: {node: '>= 10'} + + '@nomicfoundation/slang@0.17.0': + resolution: {integrity: sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ==} + engines: {node: '>= 10'} + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + + '@nomiclabs/hardhat-docker@2.0.2': + resolution: {integrity: sha512-XgGEpRT3wlA1VslyB57zyAHV+oll8KnV1TjwnxxC1tpAL04/lbdwpdO5KxInVN8irMSepqFpsiSkqlcnvbE7Ng==} + + '@openzeppelin/contracts-upgradeable@4.6.0': + resolution: {integrity: sha512-5OnVuO4HlkjSCJO165a4i2Pu1zQGzMs//o54LPrwUgxvEO2P3ax1QuaSI0cEHHTveA77guS0PnNugpR2JMsPfA==} + + '@openzeppelin/contracts@4.9.6': + resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} + + '@openzeppelin/contracts@5.0.2': + resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} + + '@openzeppelin/defender-sdk-base-client@1.15.0': + resolution: {integrity: sha512-nuf/xegMIuKCO0hMrxI1KQKTzQw1iCl/9kew2nJM9MrFIohhfEXItc5rbJRoV/jehmK/Jhi9ATF9OHH09StEsQ==} + + '@openzeppelin/defender-sdk-deploy-client@1.15.0': + resolution: {integrity: sha512-2ODMN4j5pPYWyIOvA/zRQmJ0tJyqi6NV3S/PyvufBXa3oj/MDnVO5bMGSQFH0M2VE3bg+i/rcUb0hdbX9Rtm5Q==} + + '@openzeppelin/defender-sdk-network-client@1.15.0': + resolution: {integrity: sha512-tNynCqFB1XYancq/8yGuj0HCSIyNLSRSuH53Hp2Tl+DpM7W5vIkzSRfvJJxC+8Sld83bVavyNJzTN9xid992Ag==} + + '@openzeppelin/hardhat-upgrades@3.4.0': + resolution: {integrity: sha512-bfPtUCmRT6kfh/Mz56tAAGS8N22Zr3rdCMG3E3g8CW61QRGsaeFHnZRetBgu1JoKocjCavEtis5/x60m+o5XUQ==} + hasBin: true + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.0 + ethers: ^6.6.0 + hardhat: ^2.0.2 + peerDependenciesMeta: + '@nomicfoundation/hardhat-verify': + optional: true + + '@openzeppelin/upgrades-core@1.39.0': + resolution: {integrity: sha512-TJ1kMeyp7yD4aDR2bFDK+9m5JVe/ObFDck3erVm2WcBKPtRsmFOP6b0QO1DM6w0HOOIiu8VKfrFDqZ6NyJcUyw==} + hasBin: true + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@11.2.2': + resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + + '@sinonjs/fake-timers@13.0.2': + resolution: {integrity: sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==} + + '@sinonjs/samsam@8.0.2': + resolution: {integrity: sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==} + + '@sinonjs/text-encoding@0.7.3': + resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} + + '@smithy/abort-controller@3.1.5': + resolution: {integrity: sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==} + engines: {node: '>=16.0.0'} + + '@smithy/config-resolver@3.0.9': + resolution: {integrity: sha512-5d9oBf40qC7n2xUoHmntKLdqsyTMMo/r49+eqSIjJ73eDfEtljAxEhzIQ3bkgXJtR3xiv7YzMT/3FF3ORkjWdg==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.4.8': + resolution: {integrity: sha512-x4qWk7p/a4dcf7Vxb2MODIf4OIcqNbK182WxRvZ/3oKPrf/6Fdic5sSElhO1UtXpWKBazWfqg0ZEK9xN1DsuHA==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.2.4': + resolution: {integrity: sha512-S9bb0EIokfYEuar4kEbLta+ivlKCWOCFsLZuilkNy9i0uEUEHSi47IFLPaxqqCl+0ftKmcOTHayY5nQhAuq7+w==} + engines: {node: '>=16.0.0'} + + '@smithy/fetch-http-handler@3.2.9': + resolution: {integrity: sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==} + + '@smithy/hash-node@3.0.7': + resolution: {integrity: sha512-SAGHN+QkrwcHFjfWzs/czX94ZEjPJ0CrWJS3M43WswDXVEuP4AVy9gJ3+AF6JQHZD13bojmuf/Ap/ItDeZ+Qfw==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.7': + resolution: {integrity: sha512-Bq00GsAhHeYSuZX8Kpu4sbI9agH2BNYnqUmmbTGWOhki9NVsWn2jFr896vvoTMH8KAjNX/ErC/8t5QHuEXG+IA==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-content-length@3.0.9': + resolution: {integrity: sha512-t97PidoGElF9hTtLCrof32wfWMqC5g2SEJNxaVH3NjlatuNGsdxXRYO/t+RPnxA15RpYiS0f+zG7FuE2DeGgjA==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.1.4': + resolution: {integrity: sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.23': + resolution: {integrity: sha512-x9PbGXxkcXIpm6L26qRSCC+eaYcHwybRmqU8LO/WM2RRlW0g8lz6FIiKbKgGvHuoK3dLZRiQVSQJveiCzwnA5A==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.7': + resolution: {integrity: sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.7': + resolution: {integrity: sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.1.8': + resolution: {integrity: sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.2.4': + resolution: {integrity: sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.1.7': + resolution: {integrity: sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@4.1.4': + resolution: {integrity: sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.7': + resolution: {integrity: sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.7': + resolution: {integrity: sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.7': + resolution: {integrity: sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.1.8': + resolution: {integrity: sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@4.2.0': + resolution: {integrity: sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.4.0': + resolution: {integrity: sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==} + engines: {node: '>=16.0.0'} + + '@smithy/types@3.5.0': + resolution: {integrity: sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.7': + resolution: {integrity: sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.23': + resolution: {integrity: sha512-Y07qslyRtXDP/C5aWKqxTPBl4YxplEELG3xRrz2dnAQ6Lq/FgNrcKWmV561nNaZmFH+EzeGOX3ZRMbU8p1T6Nw==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.23': + resolution: {integrity: sha512-9Y4WH7f0vnDGuHUa4lGX9e2p+sMwODibsceSV6rfkZOvMC+BY3StB2LdO1NHafpsyHJLpwAgChxQ38tFyd6vkg==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.1.3': + resolution: {integrity: sha512-34eACeKov6jZdHqS5hxBMJ4KyWKztTMulhuQ2UdOoP6vVxMLrOKUqIXAwJe/wiWMhXhydLW664B02CNpQBQ4Aw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@3.0.7': + resolution: {integrity: sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.7': + resolution: {integrity: sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.1.9': + resolution: {integrity: sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@treasure-dev/hardhat-kms@1.0.0': + resolution: {integrity: sha512-UlVFMuE/yPvbJczT0FfsYF5fn0SgWlwUNihMv++pieWplYK/Ku/pEdri2Kd2nDQmlvXdwp18LnHYRMWd7M52oA==} + + '@ts-morph/common@0.23.0': + resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.1.6': + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + + '@types/mocha@10.0.9': + resolution: {integrity: sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==} + + '@types/node@18.15.13': + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/qs@6.9.16': + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} + + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + + JSONStream@1.3.2: + resolution: {integrity: sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==} + hasBin: true + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + amazon-cognito-identity-js@6.3.12: + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asn1-ts@8.0.2: + resolution: {integrity: sha512-M9btvRJRhMhPsUFzAfuqkmQPaLLw1KZNl8xtIBpC5fvbAmlpgJcsLKMP/hxKMAUcH52UUTViEQ/cm6/whkYb+Q==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + + cbor@9.0.2: + resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} + engines: {node: '>=16'} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + docker-modem@1.0.9: + resolution: {integrity: sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw==} + engines: {node: '>= 0.8'} + + docker-modem@5.0.3: + resolution: {integrity: sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==} + engines: {node: '>= 8.0'} + + dockerode@2.5.8: + resolution: {integrity: sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw==} + engines: {node: '>= 0.8'} + + dockerode@4.0.2: + resolution: {integrity: sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==} + engines: {node: '>= 8.0'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethers@6.13.3: + resolution: {integrity: sha512-/DzbZOLVtoO4fKvvQwpEucHAQgIwBGWuRvBdwE/lMXgXvvHHTSkn7XqAQ2b+gjJzZDJjWA9OD05bVceVOsBHbg==} + engines: {node: '>=14.0.0'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-uri@3.0.2: + resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} + + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-keys@1.0.2: + resolution: {integrity: sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + fmix@0.1.0: + resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hardhat-deploy@0.12.4: + resolution: {integrity: sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==} + + hardhat@2.22.13: + resolution: {integrity: sha512-psVJX4FSXDpSXwsU8OcKTJN04pQEj9cFBMX5OPko+OFwbIoiOpvRmafa954/UaA1934npTj8sV3gaTSdx9bPbA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + imul@1.0.1: + resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} + engines: {node: '>=0.10.0'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-object@1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + match-all@1.2.6: + resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} + engines: {node: '>= 14.0.0'} + hasBin: true + + module-not-found-error@1.0.1: + resolution: {integrity: sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + murmur-128@0.2.1: + resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + + nan@2.21.0: + resolution: {integrity: sha512-MCpOGmdWvAOMi4RWnpxS5G24l7dVMtdSHtV87I3ltjaLdFOTO74HVJ+DfYiAXjxGKsYR/UCmm1rBwhMN7KqS1A==} + + nise@6.1.1: + resolution: {integrity: sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} + hasBin: true + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + proxyquire@2.1.3: + resolution: {integrity: sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==} + + pump@1.0.3: + resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sinon-chai@3.7.0: + resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} + peerDependencies: + chai: ^4.0.0 + sinon: '>=4.0.0' + + sinon@18.0.1: + resolution: {integrity: sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + + solidity-ast@0.4.59: + resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + + ssh2@1.16.0: + resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} + engines: {node: '>=10.16.0'} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + tar-fs@1.16.3: + resolution: {integrity: sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==} + + tar-fs@2.0.1: + resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-morph@22.0.0: + resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + undici@6.20.0: + resolution: {integrity: sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A==} + engines: {node: '>=18.17'} + + unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zksync-ethers@5.9.2: + resolution: {integrity: sha512-Y2Mx6ovvxO6UdC2dePLguVzvNToOY8iLWeq5ne+jgGSJxAi/f4He/NF6FNsf6x1aWX0o8dy4Df8RcOQXAkj5qw==} + engines: {node: '>=16.0.0'} + peerDependencies: + ethers: ~5.7.0 + + zksync-ethers@6.13.1: + resolution: {integrity: sha512-WaHnxm3NonFkK0RRAO81hQSJbZ34w6nQATm3yFpx85w6vU4Gy4gt5I2PT1MOqmiTmjiY1Brnb264wiomltRzcA==} + engines: {node: '>=18.9.0'} + peerDependencies: + ethers: ^6.7.1 + +snapshots: + + '@adraffy/ens-normalize@1.10.1': {} + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.664.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.7.0 + + '@aws-crypto/sha256-js@1.2.2': + dependencies: + '@aws-crypto/util': 1.2.2 + '@aws-sdk/types': 3.664.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.664.0 + tslib: 2.7.0 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.7.0 + + '@aws-crypto/util@1.2.2': + dependencies: + '@aws-sdk/types': 3.664.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.664.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.7.0 + + '@aws-sdk/client-kms@3.669.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.669.0(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/client-sts': 3.669.0 + '@aws-sdk/core': 3.667.0 + '@aws-sdk/credential-provider-node': 3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/middleware-host-header': 3.667.0 + '@aws-sdk/middleware-logger': 3.667.0 + '@aws-sdk/middleware-recursion-detection': 3.667.0 + '@aws-sdk/middleware-user-agent': 3.669.0 + '@aws-sdk/region-config-resolver': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@aws-sdk/util-endpoints': 3.667.0 + '@aws-sdk/util-user-agent-browser': 3.667.0 + '@aws-sdk/util-user-agent-node': 3.669.0 + '@smithy/config-resolver': 3.0.9 + '@smithy/core': 2.4.8 + '@smithy/fetch-http-handler': 3.2.9 + '@smithy/hash-node': 3.0.7 + '@smithy/invalid-dependency': 3.0.7 + '@smithy/middleware-content-length': 3.0.9 + '@smithy/middleware-endpoint': 3.1.4 + '@smithy/middleware-retry': 3.0.23 + '@smithy/middleware-serde': 3.0.7 + '@smithy/middleware-stack': 3.0.7 + '@smithy/node-config-provider': 3.1.8 + '@smithy/node-http-handler': 3.2.4 + '@smithy/protocol-http': 4.1.4 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/url-parser': 3.0.7 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.23 + '@smithy/util-defaults-mode-node': 3.0.23 + '@smithy/util-endpoints': 2.1.3 + '@smithy/util-middleware': 3.0.7 + '@smithy/util-retry': 3.0.7 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.669.0 + '@aws-sdk/core': 3.667.0 + '@aws-sdk/credential-provider-node': 3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/middleware-host-header': 3.667.0 + '@aws-sdk/middleware-logger': 3.667.0 + '@aws-sdk/middleware-recursion-detection': 3.667.0 + '@aws-sdk/middleware-user-agent': 3.669.0 + '@aws-sdk/region-config-resolver': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@aws-sdk/util-endpoints': 3.667.0 + '@aws-sdk/util-user-agent-browser': 3.667.0 + '@aws-sdk/util-user-agent-node': 3.669.0 + '@smithy/config-resolver': 3.0.9 + '@smithy/core': 2.4.8 + '@smithy/fetch-http-handler': 3.2.9 + '@smithy/hash-node': 3.0.7 + '@smithy/invalid-dependency': 3.0.7 + '@smithy/middleware-content-length': 3.0.9 + '@smithy/middleware-endpoint': 3.1.4 + '@smithy/middleware-retry': 3.0.23 + '@smithy/middleware-serde': 3.0.7 + '@smithy/middleware-stack': 3.0.7 + '@smithy/node-config-provider': 3.1.8 + '@smithy/node-http-handler': 3.2.4 + '@smithy/protocol-http': 4.1.4 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/url-parser': 3.0.7 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.23 + '@smithy/util-defaults-mode-node': 3.0.23 + '@smithy/util-endpoints': 2.1.3 + '@smithy/util-middleware': 3.0.7 + '@smithy/util-retry': 3.0.7 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.669.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.667.0 + '@aws-sdk/middleware-host-header': 3.667.0 + '@aws-sdk/middleware-logger': 3.667.0 + '@aws-sdk/middleware-recursion-detection': 3.667.0 + '@aws-sdk/middleware-user-agent': 3.669.0 + '@aws-sdk/region-config-resolver': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@aws-sdk/util-endpoints': 3.667.0 + '@aws-sdk/util-user-agent-browser': 3.667.0 + '@aws-sdk/util-user-agent-node': 3.669.0 + '@smithy/config-resolver': 3.0.9 + '@smithy/core': 2.4.8 + '@smithy/fetch-http-handler': 3.2.9 + '@smithy/hash-node': 3.0.7 + '@smithy/invalid-dependency': 3.0.7 + '@smithy/middleware-content-length': 3.0.9 + '@smithy/middleware-endpoint': 3.1.4 + '@smithy/middleware-retry': 3.0.23 + '@smithy/middleware-serde': 3.0.7 + '@smithy/middleware-stack': 3.0.7 + '@smithy/node-config-provider': 3.1.8 + '@smithy/node-http-handler': 3.2.4 + '@smithy/protocol-http': 4.1.4 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/url-parser': 3.0.7 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.23 + '@smithy/util-defaults-mode-node': 3.0.23 + '@smithy/util-endpoints': 2.1.3 + '@smithy/util-middleware': 3.0.7 + '@smithy/util-retry': 3.0.7 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.669.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.669.0(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/core': 3.667.0 + '@aws-sdk/credential-provider-node': 3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/middleware-host-header': 3.667.0 + '@aws-sdk/middleware-logger': 3.667.0 + '@aws-sdk/middleware-recursion-detection': 3.667.0 + '@aws-sdk/middleware-user-agent': 3.669.0 + '@aws-sdk/region-config-resolver': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@aws-sdk/util-endpoints': 3.667.0 + '@aws-sdk/util-user-agent-browser': 3.667.0 + '@aws-sdk/util-user-agent-node': 3.669.0 + '@smithy/config-resolver': 3.0.9 + '@smithy/core': 2.4.8 + '@smithy/fetch-http-handler': 3.2.9 + '@smithy/hash-node': 3.0.7 + '@smithy/invalid-dependency': 3.0.7 + '@smithy/middleware-content-length': 3.0.9 + '@smithy/middleware-endpoint': 3.1.4 + '@smithy/middleware-retry': 3.0.23 + '@smithy/middleware-serde': 3.0.7 + '@smithy/middleware-stack': 3.0.7 + '@smithy/node-config-provider': 3.1.8 + '@smithy/node-http-handler': 3.2.4 + '@smithy/protocol-http': 4.1.4 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/url-parser': 3.0.7 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.23 + '@smithy/util-defaults-mode-node': 3.0.23 + '@smithy/util-endpoints': 2.1.3 + '@smithy/util-middleware': 3.0.7 + '@smithy/util-retry': 3.0.7 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.667.0': + dependencies: + '@aws-sdk/types': 3.667.0 + '@smithy/core': 2.4.8 + '@smithy/node-config-provider': 3.1.8 + '@smithy/property-provider': 3.1.7 + '@smithy/protocol-http': 4.1.4 + '@smithy/signature-v4': 4.2.0 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/util-middleware': 3.0.7 + fast-xml-parser: 4.4.1 + tslib: 2.7.0 + + '@aws-sdk/credential-provider-env@3.667.0': + dependencies: + '@aws-sdk/core': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@smithy/property-provider': 3.1.7 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/credential-provider-http@3.667.0': + dependencies: + '@aws-sdk/core': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@smithy/fetch-http-handler': 3.2.9 + '@smithy/node-http-handler': 3.2.4 + '@smithy/property-provider': 3.1.7 + '@smithy/protocol-http': 4.1.4 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/util-stream': 3.1.9 + tslib: 2.7.0 + + '@aws-sdk/credential-provider-ini@3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))(@aws-sdk/client-sts@3.669.0)': + dependencies: + '@aws-sdk/client-sts': 3.669.0 + '@aws-sdk/core': 3.667.0 + '@aws-sdk/credential-provider-env': 3.667.0 + '@aws-sdk/credential-provider-http': 3.667.0 + '@aws-sdk/credential-provider-process': 3.667.0 + '@aws-sdk/credential-provider-sso': 3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0)) + '@aws-sdk/credential-provider-web-identity': 3.667.0(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/types': 3.667.0 + '@smithy/credential-provider-imds': 3.2.4 + '@smithy/property-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-node@3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))(@aws-sdk/client-sts@3.669.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.667.0 + '@aws-sdk/credential-provider-http': 3.667.0 + '@aws-sdk/credential-provider-ini': 3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/credential-provider-process': 3.667.0 + '@aws-sdk/credential-provider-sso': 3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0)) + '@aws-sdk/credential-provider-web-identity': 3.667.0(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/types': 3.667.0 + '@smithy/credential-provider-imds': 3.2.4 + '@smithy/property-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-process@3.667.0': + dependencies: + '@aws-sdk/core': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@smithy/property-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/credential-provider-sso@3.669.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))': + dependencies: + '@aws-sdk/client-sso': 3.669.0 + '@aws-sdk/core': 3.667.0 + '@aws-sdk/token-providers': 3.667.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0)) + '@aws-sdk/types': 3.667.0 + '@smithy/property-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.667.0(@aws-sdk/client-sts@3.669.0)': + dependencies: + '@aws-sdk/client-sts': 3.669.0 + '@aws-sdk/core': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@smithy/property-provider': 3.1.7 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/middleware-host-header@3.667.0': + dependencies: + '@aws-sdk/types': 3.667.0 + '@smithy/protocol-http': 4.1.4 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/middleware-logger@3.667.0': + dependencies: + '@aws-sdk/types': 3.667.0 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/middleware-recursion-detection@3.667.0': + dependencies: + '@aws-sdk/types': 3.667.0 + '@smithy/protocol-http': 4.1.4 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/middleware-user-agent@3.669.0': + dependencies: + '@aws-sdk/core': 3.667.0 + '@aws-sdk/types': 3.667.0 + '@aws-sdk/util-endpoints': 3.667.0 + '@smithy/core': 2.4.8 + '@smithy/protocol-http': 4.1.4 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/region-config-resolver@3.667.0': + dependencies: + '@aws-sdk/types': 3.667.0 + '@smithy/node-config-provider': 3.1.8 + '@smithy/types': 3.5.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.7 + tslib: 2.7.0 + + '@aws-sdk/token-providers@3.667.0(@aws-sdk/client-sso-oidc@3.669.0(@aws-sdk/client-sts@3.669.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.669.0(@aws-sdk/client-sts@3.669.0) + '@aws-sdk/types': 3.667.0 + '@smithy/property-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/types@3.664.0': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/types@3.667.0': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/util-endpoints@3.667.0': + dependencies: + '@aws-sdk/types': 3.667.0 + '@smithy/types': 3.5.0 + '@smithy/util-endpoints': 2.1.3 + tslib: 2.7.0 + + '@aws-sdk/util-locate-window@3.568.0': + dependencies: + tslib: 2.7.0 + + '@aws-sdk/util-user-agent-browser@3.667.0': + dependencies: + '@aws-sdk/types': 3.667.0 + '@smithy/types': 3.5.0 + bowser: 2.11.0 + tslib: 2.7.0 + + '@aws-sdk/util-user-agent-node@3.669.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.669.0 + '@aws-sdk/types': 3.667.0 + '@smithy/node-config-provider': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@aws-sdk/util-utf8-browser@3.259.0': + dependencies: + tslib: 2.7.0 + + '@balena/dockerignore@1.0.2': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@ethersproject/abi@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + '@ethersproject/abstract-signer@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/base64@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + + '@ethersproject/basex@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/bignumber@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/constants@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.7.0': {} + + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/providers@5.7.2': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/sha2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + '@ethersproject/solidity@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/transactions@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/wallet@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/wordlists@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@fastify/busboy@2.1.1': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@matterlabs/hardhat-zksync-deploy@1.5.0(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))(zksync-ethers@6.13.1(ethers@6.13.3))': + dependencies: + '@matterlabs/hardhat-zksync-solc': 1.2.5(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + chai: 4.5.0 + chalk: 4.1.2 + ethers: 6.13.3 + fs-extra: 11.2.0 + glob: 10.4.5 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + lodash: 4.17.21 + sinon: 18.0.1 + sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) + ts-morph: 22.0.0 + zksync-ethers: 6.13.1(ethers@6.13.3) + transitivePeerDependencies: + - encoding + - supports-color + + '@matterlabs/hardhat-zksync-ethers@1.2.1(ethers@6.13.3)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)(zksync-ethers@6.13.1(ethers@6.13.3))': + dependencies: + '@matterlabs/hardhat-zksync-deploy': 1.5.0(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))(zksync-ethers@6.13.1(ethers@6.13.3)) + '@matterlabs/hardhat-zksync-solc': 1.2.5(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + chai: 4.5.0 + chalk: 4.1.2 + ethers: 6.13.3 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + zksync-ethers: 6.13.1(ethers@6.13.3) + transitivePeerDependencies: + - bufferutil + - c-kzg + - encoding + - supports-color + - ts-node + - typescript + - utf-8-validate + + '@matterlabs/hardhat-zksync-node@1.1.1(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))': + dependencies: + '@matterlabs/hardhat-zksync-solc': 1.2.5(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + axios: 1.7.7(debug@4.3.7) + chai: 4.5.0 + chalk: 4.1.2 + fs-extra: 11.2.0 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + proxyquire: 2.1.3 + sinon: 18.0.1 + sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) + undici: 6.20.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + '@matterlabs/hardhat-zksync-solc@1.2.5(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))': + dependencies: + '@nomiclabs/hardhat-docker': 2.0.2 + chai: 4.5.0 + chalk: 4.1.2 + debug: 4.3.7(supports-color@8.1.1) + dockerode: 4.0.2 + fs-extra: 11.2.0 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + proper-lockfile: 4.1.2 + semver: 7.6.3 + sinon: 18.0.1 + sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) + undici: 6.20.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@matterlabs/hardhat-zksync-upgradable@1.7.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)': + dependencies: + '@matterlabs/hardhat-zksync-deploy': 1.5.0(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))(zksync-ethers@6.13.1(ethers@6.13.3)) + '@matterlabs/hardhat-zksync-ethers': 1.2.1(ethers@6.13.3)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)(zksync-ethers@6.13.1(ethers@6.13.3)) + '@matterlabs/hardhat-zksync-solc': 1.2.5(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@openzeppelin/contracts-hardhat-zksync-upgradable': '@openzeppelin/contracts@5.0.2' + '@openzeppelin/defender-sdk-base-client': 1.15.0 + '@openzeppelin/defender-sdk-deploy-client': 1.15.0(debug@4.3.7) + '@openzeppelin/defender-sdk-network-client': 1.15.0(debug@4.3.7) + '@openzeppelin/hardhat-upgrades': 3.4.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@openzeppelin/upgrades-core': 1.39.0 + chalk: 4.1.2 + compare-versions: 6.1.1 + ethereumjs-util: 7.1.5 + ethers: 6.13.3 + fs-extra: 11.2.0 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + proper-lockfile: 4.1.2 + semver: 7.6.3 + solidity-ast: 0.4.59 + zksync-ethers: 6.13.1(ethers@6.13.3) + transitivePeerDependencies: + - '@nomicfoundation/hardhat-ethers' + - '@nomicfoundation/hardhat-verify' + - bufferutil + - c-kzg + - debug + - encoding + - supports-color + - ts-node + - typescript + - utf-8-validate + + '@matterlabs/hardhat-zksync-verify@1.6.0(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + '@matterlabs/hardhat-zksync-solc': 1.2.5(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@nomicfoundation/hardhat-verify': 2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + axios: 1.7.7(debug@4.3.7) + cbor: 9.0.2 + chai: 4.5.0 + chalk: 4.1.2 + debug: 4.3.7(supports-color@8.1.1) + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + semver: 7.6.3 + sinon: 18.0.1 + sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) + transitivePeerDependencies: + - encoding + - supports-color + + '@matterlabs/hardhat-zksync@1.2.0(hev46a52yfe6h3nutol7622bma)': + dependencies: + '@matterlabs/hardhat-zksync-deploy': 1.5.0(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))(zksync-ethers@6.13.1(ethers@6.13.3)) + '@matterlabs/hardhat-zksync-ethers': 1.2.1(ethers@6.13.3)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)(zksync-ethers@6.13.1(ethers@6.13.3)) + '@matterlabs/hardhat-zksync-node': 1.1.1(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@matterlabs/hardhat-zksync-solc': 1.2.5(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@matterlabs/hardhat-zksync-upgradable': 1.7.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + '@matterlabs/hardhat-zksync-verify': 1.6.0(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@nomicfoundation/hardhat-verify': 2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@openzeppelin/upgrades-core': 1.39.0 + chai: 4.5.0 + ethers: 6.13.3 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + sinon: 18.0.1 + sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) + zksync-ethers: 6.13.1(ethers@6.13.3) + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - ts-node + - typescript + - utf-8-validate + + '@matterlabs/zksync-contracts@0.6.1(@openzeppelin/contracts-upgradeable@4.6.0)(@openzeppelin/contracts@4.9.6)': + dependencies: + '@openzeppelin/contracts': 4.9.6 + '@openzeppelin/contracts-upgradeable': 4.6.0 + + '@metamask/eth-sig-util@4.0.1': + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.3.2': {} + + '@noble/secp256k1@1.7.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@nomicfoundation/edr-darwin-arm64@0.6.3': {} + + '@nomicfoundation/edr-darwin-x64@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': {} + + '@nomicfoundation/edr@0.6.3': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.6.3 + '@nomicfoundation/edr-darwin-x64': 0.6.3 + '@nomicfoundation/edr-linux-arm64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-arm64-musl': 0.6.3 + '@nomicfoundation/edr-linux-x64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-x64-musl': 0.6.3 + '@nomicfoundation/edr-win32-x64-msvc': 0.6.3 + + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + + '@nomicfoundation/ethereumjs-tx@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/ethereumjs-util@9.0.4': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))': + dependencies: + debug: 4.3.7(supports-color@8.1.1) + ethers: 6.13.3 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-foundry@1.1.2(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))': + dependencies: + chalk: 2.4.2 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + + '@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.7(supports-color@8.1.1) + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + lodash.clonedeep: 4.5.0 + semver: 6.3.1 + table: 6.8.2 + undici: 5.28.4 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/slang-darwin-arm64@0.17.0': {} + + '@nomicfoundation/slang-darwin-x64@0.17.0': {} + + '@nomicfoundation/slang-linux-arm64-gnu@0.17.0': {} + + '@nomicfoundation/slang-linux-arm64-musl@0.17.0': {} + + '@nomicfoundation/slang-linux-x64-gnu@0.17.0': {} + + '@nomicfoundation/slang-linux-x64-musl@0.17.0': {} + + '@nomicfoundation/slang-win32-arm64-msvc@0.17.0': {} + + '@nomicfoundation/slang-win32-ia32-msvc@0.17.0': {} + + '@nomicfoundation/slang-win32-x64-msvc@0.17.0': {} + + '@nomicfoundation/slang@0.17.0': + dependencies: + '@nomicfoundation/slang-darwin-arm64': 0.17.0 + '@nomicfoundation/slang-darwin-x64': 0.17.0 + '@nomicfoundation/slang-linux-arm64-gnu': 0.17.0 + '@nomicfoundation/slang-linux-arm64-musl': 0.17.0 + '@nomicfoundation/slang-linux-x64-gnu': 0.17.0 + '@nomicfoundation/slang-linux-x64-musl': 0.17.0 + '@nomicfoundation/slang-win32-arm64-msvc': 0.17.0 + '@nomicfoundation/slang-win32-ia32-msvc': 0.17.0 + '@nomicfoundation/slang-win32-x64-msvc': 0.17.0 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + + '@nomiclabs/hardhat-docker@2.0.2': + dependencies: + dockerode: 2.5.8 + fs-extra: 7.0.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@openzeppelin/contracts-upgradeable@4.6.0': {} + + '@openzeppelin/contracts@4.9.6': {} + + '@openzeppelin/contracts@5.0.2': {} + + '@openzeppelin/defender-sdk-base-client@1.15.0': + dependencies: + amazon-cognito-identity-js: 6.3.12 + async-retry: 1.3.3 + transitivePeerDependencies: + - encoding + + '@openzeppelin/defender-sdk-deploy-client@1.15.0(debug@4.3.7)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.15.0 + axios: 1.7.7(debug@4.3.7) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-network-client@1.15.0(debug@4.3.7)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.15.0 + axios: 1.7.7(debug@4.3.7) + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/hardhat-upgrades@3.4.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)))(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.3)(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + '@openzeppelin/defender-sdk-base-client': 1.15.0 + '@openzeppelin/defender-sdk-deploy-client': 1.15.0(debug@4.3.7) + '@openzeppelin/defender-sdk-network-client': 1.15.0(debug@4.3.7) + '@openzeppelin/upgrades-core': 1.39.0 + chalk: 4.1.2 + debug: 4.3.7(supports-color@8.1.1) + ethereumjs-util: 7.1.5 + ethers: 6.13.3 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + proper-lockfile: 4.1.2 + undici: 6.20.0 + optionalDependencies: + '@nomicfoundation/hardhat-verify': 2.0.11(hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)) + transitivePeerDependencies: + - encoding + - supports-color + + '@openzeppelin/upgrades-core@1.39.0': + dependencies: + '@nomicfoundation/slang': 0.17.0 + cbor: 9.0.2 + chalk: 4.1.2 + compare-versions: 6.1.1 + debug: 4.3.7(supports-color@8.1.1) + ethereumjs-util: 7.1.5 + minimatch: 9.0.5 + minimist: 1.2.8 + proper-lockfile: 4.1.2 + solidity-ast: 0.4.59 + transitivePeerDependencies: + - supports-color + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@scure/base@1.1.9': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.9 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@11.2.2': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@13.0.2': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/samsam@8.0.2': + dependencies: + '@sinonjs/commons': 3.0.1 + lodash.get: 4.4.2 + type-detect: 4.1.0 + + '@sinonjs/text-encoding@0.7.3': {} + + '@smithy/abort-controller@3.1.5': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/config-resolver@3.0.9': + dependencies: + '@smithy/node-config-provider': 3.1.8 + '@smithy/types': 3.5.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.7 + tslib: 2.7.0 + + '@smithy/core@2.4.8': + dependencies: + '@smithy/middleware-endpoint': 3.1.4 + '@smithy/middleware-retry': 3.0.23 + '@smithy/middleware-serde': 3.0.7 + '@smithy/protocol-http': 4.1.4 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-middleware': 3.0.7 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + + '@smithy/credential-provider-imds@3.2.4': + dependencies: + '@smithy/node-config-provider': 3.1.8 + '@smithy/property-provider': 3.1.7 + '@smithy/types': 3.5.0 + '@smithy/url-parser': 3.0.7 + tslib: 2.7.0 + + '@smithy/fetch-http-handler@3.2.9': + dependencies: + '@smithy/protocol-http': 4.1.4 + '@smithy/querystring-builder': 3.0.7 + '@smithy/types': 3.5.0 + '@smithy/util-base64': 3.0.0 + tslib: 2.7.0 + + '@smithy/hash-node@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + + '@smithy/invalid-dependency@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.7.0 + + '@smithy/is-array-buffer@3.0.0': + dependencies: + tslib: 2.7.0 + + '@smithy/middleware-content-length@3.0.9': + dependencies: + '@smithy/protocol-http': 4.1.4 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/middleware-endpoint@3.1.4': + dependencies: + '@smithy/middleware-serde': 3.0.7 + '@smithy/node-config-provider': 3.1.8 + '@smithy/shared-ini-file-loader': 3.1.8 + '@smithy/types': 3.5.0 + '@smithy/url-parser': 3.0.7 + '@smithy/util-middleware': 3.0.7 + tslib: 2.7.0 + + '@smithy/middleware-retry@3.0.23': + dependencies: + '@smithy/node-config-provider': 3.1.8 + '@smithy/protocol-http': 4.1.4 + '@smithy/service-error-classification': 3.0.7 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + '@smithy/util-middleware': 3.0.7 + '@smithy/util-retry': 3.0.7 + tslib: 2.7.0 + uuid: 9.0.1 + + '@smithy/middleware-serde@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/middleware-stack@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/node-config-provider@3.1.8': + dependencies: + '@smithy/property-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/node-http-handler@3.2.4': + dependencies: + '@smithy/abort-controller': 3.1.5 + '@smithy/protocol-http': 4.1.4 + '@smithy/querystring-builder': 3.0.7 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/property-provider@3.1.7': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/protocol-http@4.1.4': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/querystring-builder@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.7.0 + + '@smithy/querystring-parser@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/service-error-classification@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + + '@smithy/shared-ini-file-loader@3.1.8': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/signature-v4@4.2.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.4 + '@smithy/types': 3.5.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.7 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + + '@smithy/smithy-client@3.4.0': + dependencies: + '@smithy/middleware-endpoint': 3.1.4 + '@smithy/middleware-stack': 3.0.7 + '@smithy/protocol-http': 4.1.4 + '@smithy/types': 3.5.0 + '@smithy/util-stream': 3.1.9 + tslib: 2.7.0 + + '@smithy/types@3.5.0': + dependencies: + tslib: 2.7.0 + + '@smithy/url-parser@3.0.7': + dependencies: + '@smithy/querystring-parser': 3.0.7 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/util-base64@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + + '@smithy/util-body-length-browser@3.0.0': + dependencies: + tslib: 2.7.0 + + '@smithy/util-body-length-node@3.0.0': + dependencies: + tslib: 2.7.0 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.7.0 + + '@smithy/util-buffer-from@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.7.0 + + '@smithy/util-config-provider@3.0.0': + dependencies: + tslib: 2.7.0 + + '@smithy/util-defaults-mode-browser@3.0.23': + dependencies: + '@smithy/property-provider': 3.1.7 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + bowser: 2.11.0 + tslib: 2.7.0 + + '@smithy/util-defaults-mode-node@3.0.23': + dependencies: + '@smithy/config-resolver': 3.0.9 + '@smithy/credential-provider-imds': 3.2.4 + '@smithy/node-config-provider': 3.1.8 + '@smithy/property-provider': 3.1.7 + '@smithy/smithy-client': 3.4.0 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/util-endpoints@2.1.3': + dependencies: + '@smithy/node-config-provider': 3.1.8 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/util-hex-encoding@3.0.0': + dependencies: + tslib: 2.7.0 + + '@smithy/util-middleware@3.0.7': + dependencies: + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/util-retry@3.0.7': + dependencies: + '@smithy/service-error-classification': 3.0.7 + '@smithy/types': 3.5.0 + tslib: 2.7.0 + + '@smithy/util-stream@3.1.9': + dependencies: + '@smithy/fetch-http-handler': 3.2.9 + '@smithy/node-http-handler': 3.2.4 + '@smithy/types': 3.5.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + + '@smithy/util-uri-escape@3.0.0': + dependencies: + tslib: 2.7.0 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.7.0 + + '@smithy/util-utf8@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.7.0 + + '@treasure-dev/hardhat-kms@1.0.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3)': + dependencies: + '@aws-sdk/client-kms': 3.669.0 + asn1-ts: 8.0.2 + ethers: 6.13.3 + hardhat: 2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3) + transitivePeerDependencies: + - aws-crt + - bufferutil + - c-kzg + - supports-color + - ts-node + - typescript + - utf-8-validate + + '@ts-morph/common@0.23.0': + dependencies: + fast-glob: 3.3.2 + minimatch: 9.0.5 + mkdirp: 3.0.1 + path-browserify: 1.0.1 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 22.7.5 + + '@types/bn.js@5.1.6': + dependencies: + '@types/node': 22.7.5 + + '@types/chai@4.3.20': {} + + '@types/lru-cache@5.1.1': {} + + '@types/mocha@10.0.9': {} + + '@types/node@18.15.13': {} + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 22.7.5 + + '@types/qs@6.9.16': {} + + '@types/secp256k1@4.0.6': + dependencies: + '@types/node': 22.7.5 + + JSONStream@1.3.2: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + adm-zip@0.4.16: {} + + aes-js@3.0.0: {} + + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + amazon-cognito-identity-js@6.3.12: + dependencies: + '@aws-crypto/sha256-js': 1.2.2 + buffer: 4.9.2 + fast-base64-decode: 1.0.0 + isomorphic-unfetch: 3.1.0 + js-cookie: 2.2.1 + transitivePeerDependencies: + - encoding + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@2.0.1: {} + + asn1-ts@8.0.2: + dependencies: + tslib: 2.7.0 + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assertion-error@1.1.0: {} + + astral-regex@2.0.0: {} + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + asynckit@0.4.0: {} + + axios@0.21.4(debug@4.3.7): + dependencies: + follow-redirects: 1.15.9(debug@4.3.7) + transitivePeerDependencies: + - debug + + axios@1.7.7(debug@4.3.7): + dependencies: + follow-redirects: 1.15.9(debug@4.3.7) + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + bech32@1.1.4: {} + + binary-extensions@2.3.0: {} + + bl@1.2.3: + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + blakejs@1.2.1: {} + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + bowser@2.11.0: {} + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + bs58@4.0.1: + dependencies: + base-x: 3.0.10 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + buffer-fill@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buildcheck@0.0.6: + optional: true + + bytes@3.1.2: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + camelcase@6.3.0: {} + + cbor@8.1.0: + dependencies: + nofilter: 3.1.0 + + cbor@9.0.2: + dependencies: + nofilter: 3.1.0 + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + + chownr@1.1.4: {} + + ci-info@2.0.0: {} + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + code-block-writer@13.0.3: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + commander@8.3.0: {} + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + cookie@0.4.2: {} + + core-util-is@1.0.3: {} + + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.6 + nan: 2.21.0 + optional: true + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + diff@4.0.2: {} + + diff@5.2.0: {} + + docker-modem@1.0.9: + dependencies: + JSONStream: 1.3.2 + debug: 3.2.7 + readable-stream: 1.0.34 + split-ca: 1.0.1 + transitivePeerDependencies: + - supports-color + + docker-modem@5.0.3: + dependencies: + debug: 4.3.7(supports-color@8.1.1) + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.16.0 + transitivePeerDependencies: + - supports-color + + dockerode@2.5.8: + dependencies: + concat-stream: 1.6.2 + docker-modem: 1.0.9 + tar-fs: 1.16.3 + transitivePeerDependencies: + - supports-color + + dockerode@4.0.2: + dependencies: + '@balena/dockerignore': 1.0.2 + docker-modem: 5.0.3 + tar-fs: 2.0.1 + transitivePeerDependencies: + - supports-color + + dotenv@16.4.5: {} + + eastasianwidth@0.2.0: {} + + elliptic@6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + elliptic@6.5.7: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encode-utf8@1.0.3: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + ethereum-cryptography@0.1.3: + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.3 + setimmediate: 1.0.5 + + ethereum-cryptography@1.2.0: + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + ethereumjs-abi@0.6.8: + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + + ethereumjs-util@6.2.1: + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.7 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + + ethereumjs-util@7.1.5: + dependencies: + '@types/bn.js': 5.1.6 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + ethers@5.7.2: + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethers@6.13.3: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethjs-util@0.1.6: + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + fast-base64-decode@1.0.0: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-uri@3.0.2: {} + + fast-xml-parser@4.4.1: + dependencies: + strnum: 1.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-keys@1.0.2: + dependencies: + is-object: 1.0.2 + merge-descriptors: 1.0.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + fmix@0.1.0: + dependencies: + imul: 1.0.1 + + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7(supports-color@8.1.1) + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fp-ts@1.19.3: {} + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + hardhat-deploy@0.12.4: + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@types/qs': 6.9.16 + axios: 0.21.4(debug@4.3.7) + chalk: 4.1.2 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + enquirer: 2.4.1 + ethers: 5.7.2 + form-data: 4.0.1 + fs-extra: 10.1.0 + match-all: 1.2.6 + murmur-128: 0.2.1 + qs: 6.13.0 + zksync-ethers: 5.9.2(ethers@5.7.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + hardhat@2.22.13(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))(typescript@5.6.3): + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.6.3 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.6 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chalk: 2.4.2 + chokidar: 4.0.1 + ci-info: 2.0.0 + debug: 4.3.7(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.7.3 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.3.7) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + tsort: 0.0.1 + undici: 5.28.4 + uuid: 8.3.2 + ws: 7.5.10 + optionalDependencies: + ts-node: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + immutable@4.3.7: {} + + imul@1.0.1: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hex-prefixed@1.0.0: {} + + is-number@7.0.0: {} + + is-object@1.0.2: {} + + is-plain-obj@2.1.0: {} + + is-unicode-supported@0.1.0: {} + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isomorphic-unfetch@3.1.0: + dependencies: + node-fetch: 2.7.0 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-cookie@2.2.1: {} + + js-sha3@0.8.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-schema-traverse@1.0.0: {} + + json-stream-stringify@3.1.6: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + just-extend@6.2.0: {} + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.2 + readable-stream: 3.6.2 + + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.clonedeep@4.5.0: {} + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} + + lru_map@0.3.3: {} + + make-error@1.3.6: {} + + match-all@1.2.6: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + memorystream@0.3.1: {} + + merge-descriptors@1.0.3: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp-classic@0.5.3: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@3.0.1: {} + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.4 + + mocha@10.7.3: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + module-not-found-error@1.0.1: {} + + ms@2.1.3: {} + + murmur-128@0.2.1: + dependencies: + encode-utf8: 1.0.3 + fmix: 0.1.0 + imul: 1.0.1 + + nan@2.21.0: + optional: true + + nise@6.1.1: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 13.0.2 + '@sinonjs/text-encoding': 0.7.3 + just-extend: 6.2.0 + path-to-regexp: 8.2.0 + + node-addon-api@2.0.2: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.2: {} + + nofilter@3.1.0: {} + + normalize-path@3.0.0: {} + + object-inspect@1.13.2: {} + + obliterator@2.0.4: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + os-tmpdir@1.0.2: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@1.0.0: {} + + package-json-from-dist@1.0.1: {} + + path-browserify@1.0.1: {} + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@8.2.0: {} + + pathval@1.1.1: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + picomatch@2.3.1: {} + + process-nextick-args@2.0.1: {} + + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + proxy-from-env@1.1.0: {} + + proxyquire@2.1.3: + dependencies: + fill-keys: 1.0.2 + module-not-found-error: 1.0.1 + resolve: 1.22.8 + + pump@1.0.3: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.0.2: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.12.0: {} + + retry@0.13.1: {} + + reusify@1.0.4: {} + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scrypt-js@3.0.1: {} + + secp256k1@4.0.3: + dependencies: + elliptic: 6.5.7 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.2 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sinon-chai@3.7.0(chai@4.5.0)(sinon@18.0.1): + dependencies: + chai: 4.5.0 + sinon: 18.0.1 + + sinon@18.0.1: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.2.2 + '@sinonjs/samsam': 8.0.2 + diff: 5.2.0 + nise: 6.1.1 + supports-color: 7.2.0 + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + solc@0.8.26(debug@4.3.7): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.3.7) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + + solidity-ast@0.4.59: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split-ca@1.0.1: {} + + ssh2@1.16.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.21.0 + + stacktrace-parser@0.1.10: + dependencies: + type-fest: 0.7.1 + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-hex-prefix@1.0.0: + dependencies: + is-hex-prefixed: 1.0.0 + + strip-json-comments@3.1.1: {} + + strnum@1.0.5: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + table@6.8.2: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tar-fs@1.16.3: + dependencies: + chownr: 1.1.4 + mkdirp: 0.5.6 + pump: 1.0.3 + tar-stream: 1.6.2 + + tar-fs@2.0.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@1.6.2: + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + through@2.3.8: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-buffer@1.1.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + ts-morph@22.0.0: + dependencies: + '@ts-morph/common': 0.23.0 + code-block-writer: 13.0.3 + + ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.7.5 + acorn: 8.12.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@1.14.1: {} + + tslib@2.4.0: {} + + tslib@2.7.0: {} + + tsort@0.0.1: {} + + tweetnacl-util@0.15.1: {} + + tweetnacl@0.14.5: {} + + tweetnacl@1.0.3: {} + + type-detect@4.0.8: {} + + type-detect@4.1.0: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + typedarray@0.0.6: {} + + typescript@5.6.3: {} + + undici-types@6.19.8: {} + + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@6.20.0: {} + + unfetch@4.2.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@7.4.6: {} + + ws@7.5.10: {} + + ws@8.17.1: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zksync-ethers@5.9.2(ethers@5.7.2): + dependencies: + ethers: 5.7.2 + + zksync-ethers@6.13.1(ethers@6.13.3): + dependencies: + ethers: 6.13.3 diff --git a/remappings.txt b/remappings.txt index 2334b54..68f927b 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,5 +1,5 @@ -ds-test/=lib/forge-std/lib/ds-test/src/ erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/ forge-std/=lib/forge-std/src/ openzeppelin-contracts/=lib/openzeppelin-contracts/ solmate/=lib/solmate/src/ +zksync-system-contracts/=node_modules/@matterlabs/zksync-contracts/l2/system-contracts/ \ No newline at end of file diff --git a/script/MagicswapV2.s.sol b/script/MagicswapV2.s.sol index c80058b..3ee3d23 100644 --- a/script/MagicswapV2.s.sol +++ b/script/MagicswapV2.s.sol @@ -2,9 +2,9 @@ pragma solidity >=0.8.13; import "forge-std/Script.sol"; -import "../src/Vault/NftVaultFactory.sol"; -import "../src/UniswapV2/core/UniswapV2Factory.sol"; -import "../src/Router/MagicSwapV2Router.sol"; +import "../contracts/Vault/NftVaultFactory.sol"; +import "../contracts/UniswapV2/core/UniswapV2Factory.sol"; +import "../contracts/Router/MagicSwapV2Router.sol"; contract MagicswapV2Script is Script { function run() public { @@ -19,7 +19,7 @@ contract MagicswapV2Script is Script { UniswapV2Factory factory = new UniswapV2Factory(protocolFee, lpFee, protocolFeeBeneficiary); // Deploy MagicswapV2Router - address WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; + address WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; // TBA: wMAGIC new MagicSwapV2Router(address(factory), WETH); // Deploy NftVaultFactory diff --git a/script/StakingContract.s.sol b/script/StakingContract.s.sol index 36ea162..4555439 100644 --- a/script/StakingContract.s.sol +++ b/script/StakingContract.s.sol @@ -2,7 +2,7 @@ pragma solidity >=0.8.13; import "forge-std/Script.sol"; -import "../src/Rewards/StakingContractMainnet.sol"; +import "../contracts/Rewards/StakingContractMainnet.sol"; contract StakingContractScript is Script { function run() public { diff --git a/scripts/getUniswapV2BytecodeHash.ts b/scripts/getUniswapV2BytecodeHash.ts new file mode 100644 index 0000000..d955370 --- /dev/null +++ b/scripts/getUniswapV2BytecodeHash.ts @@ -0,0 +1,11 @@ +import { utils } from "zksync-ethers"; +import { hexlify } from "ethers"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +export const getUniswapV2BytecodeHash = async (hre: HardhatRuntimeEnvironment) => { + const artifact = await hre.artifacts.readArtifact("UniswapV2Pair"); + const bytecodeHash = utils.hashBytecode(artifact.bytecode); + const hexString = hexlify(bytecodeHash); + + return hexString; +} \ No newline at end of file diff --git a/sh/deployArbitrum.sh b/sh/deployArbitrum.sh deleted file mode 100644 index 15be056..0000000 --- a/sh/deployArbitrum.sh +++ /dev/null @@ -1,5 +0,0 @@ -# To load the variables in the .env file -source .env - -# To deploy and verify our contract -forge script script/MagicswapV2.s.sol:MagicswapV2Script --aws --rpc-url $ARBITRUM_RPC --broadcast --verify -vvvv diff --git a/sh/deployArbitrumSepolia.sh b/sh/deployArbitrumSepolia.sh deleted file mode 100644 index f7a3abb..0000000 --- a/sh/deployArbitrumSepolia.sh +++ /dev/null @@ -1,5 +0,0 @@ -# To load the variables in the .env file -source .env - -# To deploy and verify our contract -forge script script/MagicswapV2.s.sol:MagicswapV2Script --aws --rpc-url $ARBITRUM_SEPOLIA_RPC --broadcast --verify -vvvv diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7b63b58 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "outDir": "dist", + "resolveJsonModule": true + }, + "include": [ + "./hardhat.config.ts", + "./scripts", + "./deploy", + "./test", + "typechain/**/*" + ] +} \ No newline at end of file